Repository: Cherry-toto/jizhicms Branch: 2.0 Commit: 8c6a9104000d Files: 480 Total size: 9.8 MB Directory structure: gitextract_8h9hwlxr/ ├── .gitignore ├── .htaccess ├── 404.html ├── LICENSE ├── README.md ├── SECURITY.md ├── app/ │ ├── admin/ │ │ ├── c/ │ │ │ ├── AdminController.php │ │ │ ├── ArticleController.php │ │ │ ├── ClasstypeController.php │ │ │ ├── CollectController.php │ │ │ ├── CommentController.php │ │ │ ├── CommonController.php │ │ │ ├── ErrorController.php │ │ │ ├── ExtmoldsController.php │ │ │ ├── FieldsController.php │ │ │ ├── IndexController.php │ │ │ ├── JzattrController.php │ │ │ ├── JzchainController.php │ │ │ ├── LinksController.php │ │ │ ├── LoginController.php │ │ │ ├── MemberController.php │ │ │ ├── MessageController.php │ │ │ ├── MoldsController.php │ │ │ ├── OrderController.php │ │ │ ├── PluginsController.php │ │ │ ├── ProductController.php │ │ │ ├── RecycleController.php │ │ │ ├── RulersController.php │ │ │ ├── SysController.php │ │ │ ├── TemplateController.php │ │ │ ├── UploadsController.php │ │ │ └── WechatController.php │ │ ├── exts/ │ │ │ ├── .gitkeep │ │ │ └── jizhicmsupdate/ │ │ │ ├── PluginsController.php │ │ │ ├── config.php │ │ │ ├── file/ │ │ │ │ ├── conf/ │ │ │ │ │ └── .gitkeep │ │ │ │ └── mysql/ │ │ │ │ ├── admin/ │ │ │ │ │ ├── c/ │ │ │ │ │ │ └── back/ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ └── tpl/ │ │ │ │ │ └── back/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── frphp/ │ │ │ │ │ ├── back/ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── common/ │ │ │ │ │ │ └── back/ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── extend/ │ │ │ │ │ │ └── back/ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ └── lib/ │ │ │ │ │ └── back/ │ │ │ │ │ └── .gitkeep │ │ │ │ ├── home/ │ │ │ │ │ └── back/ │ │ │ │ │ └── .gitkeep │ │ │ │ └── static/ │ │ │ │ └── .gitkeep │ │ │ └── tpl/ │ │ │ ├── plugins-body.html │ │ │ └── plugins-description.html │ │ ├── lang/ │ │ │ ├── back.php │ │ │ ├── cht.php │ │ │ ├── common.php │ │ │ ├── en.php │ │ │ └── zh.php │ │ ├── plugins/ │ │ │ └── IndexController.php │ │ └── t/ │ │ └── tpl/ │ │ ├── addcache.html │ │ ├── addmenu.html │ │ ├── admin-add.html │ │ ├── admin-edit.html │ │ ├── admin-list.html │ │ ├── admin.html │ │ ├── article-add.html │ │ ├── article-edit.html │ │ ├── article-list.html │ │ ├── attr-list.html │ │ ├── beifen.html │ │ ├── cache.html │ │ ├── chain-list.html │ │ ├── chongzhi-add.html │ │ ├── chongzhi-list.html │ │ ├── classtype-add.html │ │ ├── classtype-addmany.html │ │ ├── classtype-edit.html │ │ ├── classtype-list.html │ │ ├── collect-add.html │ │ ├── collect-edit.html │ │ ├── collect-list.html │ │ ├── collecttype-add.html │ │ ├── collecttype-edit.html │ │ ├── collecttype-list.html │ │ ├── comment-add.html │ │ ├── comment-details.html │ │ ├── comment-list.html │ │ ├── common/ │ │ │ ├── content.html │ │ │ ├── edit.html │ │ │ ├── fields.html │ │ │ ├── footer.html │ │ │ ├── style.html │ │ │ └── uediter.php │ │ ├── ctype.html │ │ ├── datacache.html │ │ ├── desktop-add.html │ │ ├── desktop-edit.html │ │ ├── desktop.html │ │ ├── editcache.html │ │ ├── editmenu.html │ │ ├── extmolds-add.html │ │ ├── extmolds-edit.html │ │ ├── extmolds-list.html │ │ ├── fields-add.html │ │ ├── fields-edit.html │ │ ├── fields-list-show.html │ │ ├── fields-list.html │ │ ├── getchildren.html │ │ ├── group-add.html │ │ ├── group-edit.html │ │ ├── group-list.html │ │ ├── index.html │ │ ├── links-add.html │ │ ├── links-edit.html │ │ ├── links-list.html │ │ ├── linktype-add.html │ │ ├── linktype-edit.html │ │ ├── linktype-list.html │ │ ├── login.html │ │ ├── loginlog.html │ │ ├── member-add.html │ │ ├── member-edit.html │ │ ├── member-list.html │ │ ├── membergroup-add.html │ │ ├── membergroup-edit.html │ │ ├── membergroup-list.html │ │ ├── menu.html │ │ ├── message-details.html │ │ ├── message-list.html │ │ ├── molds-add.html │ │ ├── molds-edit.html │ │ ├── molds-list.html │ │ ├── order-details.html │ │ ├── order-list.html │ │ ├── pictures.html │ │ ├── plugins-list.html │ │ ├── plugins-update.html │ │ ├── power-add.html │ │ ├── power-edit.html │ │ ├── power-list.html │ │ ├── power-tree.html │ │ ├── product-add.html │ │ ├── product-edit.html │ │ ├── product-list.html │ │ ├── recycle-list.html │ │ ├── restrucfields.html │ │ ├── ruler-add.html │ │ ├── ruler-edit.html │ │ ├── ruler-list.html │ │ ├── showlabel.html │ │ ├── sitemap.html │ │ ├── style/ │ │ │ ├── css/ │ │ │ │ ├── font.css │ │ │ │ ├── iconfont.css │ │ │ │ ├── style.css │ │ │ │ └── xadmin.css │ │ │ ├── fonts/ │ │ │ │ ├── demo.css │ │ │ │ ├── iconfont.css │ │ │ │ ├── iconfont.js │ │ │ │ └── iconfont.json │ │ │ ├── js/ │ │ │ │ ├── target_page.js │ │ │ │ ├── target_window.js │ │ │ │ ├── xadmin.js │ │ │ │ └── xm-select.js │ │ │ └── tags/ │ │ │ ├── jquery.tagsinput.css │ │ │ └── jquery.tagsinput.js │ │ ├── sys.html │ │ ├── systype.html │ │ ├── template-list.html │ │ ├── template-update.html │ │ ├── tohtml.html │ │ ├── unicode.html │ │ ├── wechat-caidan.html │ │ ├── wechat-sucai.html │ │ └── welcome.html │ └── home/ │ ├── c/ │ │ ├── CommentController.php │ │ ├── CommonController.php │ │ ├── ErrorController.php │ │ ├── HomeController.php │ │ ├── JzpayController.php │ │ ├── LoginController.php │ │ ├── MessageController.php │ │ ├── MypayController.php │ │ ├── OrderController.php │ │ ├── ScreenController.php │ │ ├── TagsController.php │ │ ├── UploadsController.php │ │ ├── UserController.php │ │ └── WechatController.php │ ├── lang/ │ │ ├── back.php │ │ ├── cht.php │ │ ├── common.php │ │ └── zh.php │ ├── plugins/ │ │ └── .gitkeep │ └── template/ │ └── .gitkeep ├── backup/ │ └── .gitkeep ├── conf/ │ ├── Functions.php │ ├── FunctionsExt.php │ ├── config.php │ └── route.php ├── frphp/ │ ├── common/ │ │ ├── Config.php │ │ ├── Error.php │ │ └── Functions.php │ ├── db/ │ │ └── DBholder.php │ ├── extend/ │ │ ├── ArrayPage.php │ │ ├── DB_API.php │ │ ├── DatabaseTool.php │ │ ├── FrSession.php │ │ ├── PHPMailer/ │ │ │ ├── LICENSE │ │ │ ├── PHPMailerAutoload.php │ │ │ ├── VERSION │ │ │ ├── class.phpmailer.php │ │ │ ├── class.phpmaileroauth.php │ │ │ ├── class.phpmaileroauthgoogle.php │ │ │ ├── class.pop3.php │ │ │ ├── class.smtp.php │ │ │ ├── extras/ │ │ │ │ ├── EasyPeasyICS.php │ │ │ │ ├── README.md │ │ │ │ ├── htmlfilter.php │ │ │ │ └── ntlm_sasl_client.php │ │ │ ├── get_oauth_token.php │ │ │ └── testmail.php │ │ ├── Page.php │ │ ├── SessionRedis.php │ │ ├── Uploader.class.php │ │ ├── Vercode.php │ │ ├── compressimage.php │ │ ├── pay/ │ │ │ ├── alipay/ │ │ │ │ ├── AlipayService.php │ │ │ │ └── AlipayServiceCheck.php │ │ │ └── wechat/ │ │ │ ├── WxpayCheckOrder.php │ │ │ ├── WxpayH5Service.php │ │ │ ├── WxpayScan.php │ │ │ ├── WxpayService.php │ │ │ └── WxpayServiceCheck.php │ │ ├── phpqrcode/ │ │ │ └── phpqrcode.php │ │ └── pinyin.php │ ├── fr.php │ └── lib/ │ ├── Controller.php │ ├── Model.php │ └── View.php ├── index.php ├── install/ │ ├── db.php │ ├── index.php │ ├── test.php │ └── tpl/ │ ├── css/ │ │ └── ui.progress-bar.css │ ├── footer.tpl │ ├── header.tpl │ ├── index.jizhi │ ├── js/ │ │ └── common.js │ ├── layer/ │ │ ├── mobile/ │ │ │ ├── layer.js │ │ │ └── need/ │ │ │ └── layer.css │ │ └── theme/ │ │ └── default/ │ │ └── layer.css │ ├── step1.jizhi │ ├── step2.jizhi │ ├── step3.jizhi │ ├── step4.jizhi │ └── step5.jizhi ├── readme.txt ├── robots.txt ├── static/ │ ├── cms/ │ │ ├── 404.html │ │ ├── article/ │ │ │ ├── article-details.html │ │ │ ├── article-list.html │ │ │ └── faq.html │ │ ├── backup/ │ │ │ └── .gitkeep │ │ ├── comment.html │ │ ├── faq.html │ │ ├── footer.html │ │ ├── func/ │ │ │ └── functions.php │ │ ├── header.html │ │ ├── index.html │ │ ├── info.php │ │ ├── install/ │ │ │ └── TemplateController.php │ │ ├── js.html │ │ ├── latestpost.html │ │ ├── message/ │ │ │ └── contact-us.html │ │ ├── page/ │ │ │ ├── about-us.html │ │ │ └── page.html │ │ ├── paytpl/ │ │ │ ├── alipay_in_weixin.html │ │ │ ├── dmf.html │ │ │ ├── overpay.html │ │ │ ├── pay_form.html │ │ │ ├── wechat_h5_pay.html │ │ │ ├── wechat_pay.html │ │ │ └── wechat_scan.html │ │ ├── product/ │ │ │ ├── details.html │ │ │ └── list.html │ │ ├── search.html │ │ ├── searchall.html │ │ ├── searchform.html │ │ ├── static/ │ │ │ ├── css/ │ │ │ │ ├── aos.css │ │ │ │ ├── gordita-fonts.css │ │ │ │ └── style.css │ │ │ └── js/ │ │ │ ├── ajax.mail.js │ │ │ ├── aos.js │ │ │ └── main.js │ │ ├── style.html │ │ ├── tags-details.html │ │ └── user/ │ │ ├── article-add.html │ │ ├── article.html │ │ ├── buy-list.html │ │ ├── buy-view.html │ │ ├── buy.html │ │ ├── cart.html │ │ ├── collect.html │ │ ├── comment.html │ │ ├── fans.html │ │ ├── follow.html │ │ ├── footer.html │ │ ├── forget.html │ │ ├── index.html │ │ ├── left_nav.html │ │ ├── likes.html │ │ ├── login.html │ │ ├── nologin.html │ │ ├── notify.html │ │ ├── order.html │ │ ├── orderdetails.html │ │ ├── password.html │ │ ├── payment.html │ │ ├── people.html │ │ ├── prople.html │ │ ├── register.html │ │ ├── reset_password.html │ │ ├── setmsg.html │ │ ├── style.html │ │ ├── tips.html │ │ ├── top.html │ │ ├── userinfo.html │ │ └── wallet.html │ ├── common/ │ │ ├── clipboard.js │ │ ├── close.html │ │ ├── layui/ │ │ │ ├── css/ │ │ │ │ ├── layui.css │ │ │ │ └── modules/ │ │ │ │ ├── code.css │ │ │ │ ├── laydate/ │ │ │ │ │ └── default/ │ │ │ │ │ └── laydate.css │ │ │ │ └── layer/ │ │ │ │ └── default/ │ │ │ │ └── layer.css │ │ │ └── layui.js │ │ ├── md5.js │ │ ├── uediter.php │ │ ├── user/ │ │ │ ├── css/ │ │ │ │ ├── font_1546140_sw4m5ivcrg9.css │ │ │ │ ├── reset.css │ │ │ │ └── user.css │ │ │ ├── js/ │ │ │ │ ├── jquery.min-1.10.2.js │ │ │ │ └── user.js │ │ │ └── uedit/ │ │ │ ├── dialogs/ │ │ │ │ ├── anchor/ │ │ │ │ │ └── anchor.html │ │ │ │ ├── attachment/ │ │ │ │ │ ├── attachment.css │ │ │ │ │ ├── attachment.html │ │ │ │ │ └── attachment.js │ │ │ │ ├── background/ │ │ │ │ │ ├── background.css │ │ │ │ │ ├── background.html │ │ │ │ │ └── background.js │ │ │ │ ├── charts/ │ │ │ │ │ ├── chart.config.js │ │ │ │ │ ├── charts.css │ │ │ │ │ ├── charts.html │ │ │ │ │ └── charts.js │ │ │ │ ├── emotion/ │ │ │ │ │ ├── emotion.css │ │ │ │ │ ├── emotion.html │ │ │ │ │ └── emotion.js │ │ │ │ ├── gmap/ │ │ │ │ │ └── gmap.html │ │ │ │ ├── help/ │ │ │ │ │ ├── help.css │ │ │ │ │ ├── help.html │ │ │ │ │ └── help.js │ │ │ │ ├── image/ │ │ │ │ │ ├── image.css │ │ │ │ │ ├── image.html │ │ │ │ │ └── image.js │ │ │ │ ├── insertframe/ │ │ │ │ │ └── insertframe.html │ │ │ │ ├── internal.js │ │ │ │ ├── link/ │ │ │ │ │ └── link.html │ │ │ │ ├── map/ │ │ │ │ │ ├── map.html │ │ │ │ │ └── show.html │ │ │ │ ├── music/ │ │ │ │ │ ├── music.css │ │ │ │ │ ├── music.html │ │ │ │ │ └── music.js │ │ │ │ ├── preview/ │ │ │ │ │ └── preview.html │ │ │ │ ├── scrawl/ │ │ │ │ │ ├── scrawl.css │ │ │ │ │ ├── scrawl.html │ │ │ │ │ └── scrawl.js │ │ │ │ ├── searchreplace/ │ │ │ │ │ ├── searchreplace.html │ │ │ │ │ └── searchreplace.js │ │ │ │ ├── snapscreen/ │ │ │ │ │ └── snapscreen.html │ │ │ │ ├── spechars/ │ │ │ │ │ ├── spechars.html │ │ │ │ │ └── spechars.js │ │ │ │ ├── table/ │ │ │ │ │ ├── edittable.css │ │ │ │ │ ├── edittable.html │ │ │ │ │ ├── edittable.js │ │ │ │ │ ├── edittd.html │ │ │ │ │ └── edittip.html │ │ │ │ ├── template/ │ │ │ │ │ ├── config.js │ │ │ │ │ ├── template.css │ │ │ │ │ ├── template.html │ │ │ │ │ └── template.js │ │ │ │ ├── video/ │ │ │ │ │ ├── video.css │ │ │ │ │ ├── video.html │ │ │ │ │ └── video.js │ │ │ │ ├── webapp/ │ │ │ │ │ └── webapp.html │ │ │ │ └── wordimage/ │ │ │ │ ├── fClipboard_ueditor.swf │ │ │ │ ├── imageUploader.swf │ │ │ │ ├── tangram.js │ │ │ │ ├── wordimage.html │ │ │ │ └── wordimage.js │ │ │ ├── lang/ │ │ │ │ ├── en/ │ │ │ │ │ └── en.js │ │ │ │ └── zh-cn/ │ │ │ │ └── zh-cn.js │ │ │ ├── themes/ │ │ │ │ ├── default/ │ │ │ │ │ ├── _css/ │ │ │ │ │ │ ├── autotypesetpicker.css │ │ │ │ │ │ ├── button.css │ │ │ │ │ │ ├── buttonicon.css │ │ │ │ │ │ ├── cellalignpicker.css │ │ │ │ │ │ ├── colorbutton.css │ │ │ │ │ │ ├── colorpicker.css │ │ │ │ │ │ ├── combox.css │ │ │ │ │ │ ├── contextmenu.css │ │ │ │ │ │ ├── dialog.css │ │ │ │ │ │ ├── editor.css │ │ │ │ │ │ ├── menu.css │ │ │ │ │ │ ├── menubutton.css │ │ │ │ │ │ ├── message.css │ │ │ │ │ │ ├── multiMenu.css │ │ │ │ │ │ ├── paragraphpicker.css │ │ │ │ │ │ ├── pastepicker.css │ │ │ │ │ │ ├── popup.css │ │ │ │ │ │ ├── separtor.css │ │ │ │ │ │ ├── shortcutmenu.css │ │ │ │ │ │ ├── splitbutton.css │ │ │ │ │ │ ├── tablepicker.css │ │ │ │ │ │ ├── toolbar.css │ │ │ │ │ │ ├── ueditor.css │ │ │ │ │ │ └── uibase.css │ │ │ │ │ ├── css/ │ │ │ │ │ │ └── ueditor.css │ │ │ │ │ └── dialogbase.css │ │ │ │ └── iframe.css │ │ │ ├── third-party/ │ │ │ │ ├── SyntaxHighlighter/ │ │ │ │ │ ├── shCore.js │ │ │ │ │ └── shCoreDefault.css │ │ │ │ ├── codemirror/ │ │ │ │ │ ├── codemirror.css │ │ │ │ │ └── codemirror.js │ │ │ │ ├── highcharts/ │ │ │ │ │ ├── adapters/ │ │ │ │ │ │ ├── mootools-adapter.js │ │ │ │ │ │ ├── mootools-adapter.src.js │ │ │ │ │ │ ├── prototype-adapter.js │ │ │ │ │ │ ├── prototype-adapter.src.js │ │ │ │ │ │ ├── standalone-framework.js │ │ │ │ │ │ └── standalone-framework.src.js │ │ │ │ │ ├── highcharts-more.js │ │ │ │ │ ├── highcharts-more.src.js │ │ │ │ │ ├── highcharts.js │ │ │ │ │ ├── highcharts.src.js │ │ │ │ │ ├── modules/ │ │ │ │ │ │ ├── annotations.js │ │ │ │ │ │ ├── annotations.src.js │ │ │ │ │ │ ├── canvas-tools.js │ │ │ │ │ │ ├── canvas-tools.src.js │ │ │ │ │ │ ├── data.js │ │ │ │ │ │ ├── data.src.js │ │ │ │ │ │ ├── drilldown.js │ │ │ │ │ │ ├── drilldown.src.js │ │ │ │ │ │ ├── exporting.js │ │ │ │ │ │ ├── exporting.src.js │ │ │ │ │ │ ├── funnel.js │ │ │ │ │ │ ├── funnel.src.js │ │ │ │ │ │ ├── heatmap.js │ │ │ │ │ │ ├── heatmap.src.js │ │ │ │ │ │ ├── map.js │ │ │ │ │ │ ├── map.src.js │ │ │ │ │ │ ├── no-data-to-display.js │ │ │ │ │ │ └── no-data-to-display.src.js │ │ │ │ │ └── themes/ │ │ │ │ │ ├── dark-blue.js │ │ │ │ │ ├── dark-green.js │ │ │ │ │ ├── gray.js │ │ │ │ │ ├── grid.js │ │ │ │ │ └── skies.js │ │ │ │ ├── jquery-1.10.2.js │ │ │ │ ├── video-js/ │ │ │ │ │ ├── video-js.css │ │ │ │ │ ├── video-js.swf │ │ │ │ │ ├── video.dev.js │ │ │ │ │ └── video.js │ │ │ │ ├── webuploader/ │ │ │ │ │ ├── Uploader.swf │ │ │ │ │ ├── webuploader.css │ │ │ │ │ ├── webuploader.custom.js │ │ │ │ │ ├── webuploader.flashonly.js │ │ │ │ │ ├── webuploader.html5only.js │ │ │ │ │ ├── webuploader.js │ │ │ │ │ └── webuploader.withoutimage.js │ │ │ │ └── zeroclipboard/ │ │ │ │ ├── ZeroClipboard.js │ │ │ │ └── ZeroClipboard.swf │ │ │ ├── ueditor.all.js │ │ │ ├── ueditor.config.js │ │ │ └── ueditor.parse.js │ │ └── wangeditor/ │ │ └── wangeditor.css │ └── default/ │ └── assets/ │ ├── css/ │ │ ├── Projects-Horizontal.css │ │ ├── css.css │ │ └── smoothproducts.css │ └── js/ │ └── theme.js └── web.config ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ /.idea /cache ================================================ FILE: .htaccess ================================================ RewriteEngine on RewriteBase / #RewriteCond %{REQUEST_URI} !((.*).jpg|.jpeg|.bmp|.gif|.png|.js|.css|.tts|.woff )$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f #RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1,QSA,PT,L] ================================================ FILE: 404.html ================================================ 404

404,您请求的文件不存在!

================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2021 如沐春 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ [![极致CMS建站系统](https://www.jizhicms.cn/header_1920x700.png)](http://down.jizhicms.cn/jizhicms.zip)

极致CMS建站系统

一款免费开源的PHP建站CMS系统,可以免授权商业使用该系统。

Gitee stars GitHub stars

官网:[www.jizhicms.cn](https://www.jizhicms.cn) | [www.jizhicms.com](https://www.jizhicms.com) | [应用市场](https://app.jizhicms.cn) 演示:[demo.jizhicms.cn](https://demo.jizhicms.cn) 后台:[https://demo.jizhicms.cn/admin.php](https://demo.jizhicms.cn/admin.php) [ 账户:test 密码:123456 ] 单入口后台:[https://demo.jizhicms.cn/index.php/admins](https://demo.jizhicms.cn/index.php/admins) [ 账户:test 密码:123456 ] 文档:[https://help.jizhicms.cn](https://help.jizhicms.cn) 工具:[https://h.jizhicms.cn](https://h.jizhicms.cn) 作者:留恋风(QQ:2581047041 微信:TF-2581047041) 商务合作:13660240863 QQ交流群:774764507 , 869094463 , 651403450 [【加群】](https://jq.qq.com/?_wv=1027&k=6zjN1tgq) ## 极致CMS建站系统2.0 重磅更新! > 支持后台在线模板,可以下载和更新模板,提供更多免费模板 > 支持后台多语言本地化配置 > 更新一套精美模板免费使用 > 桌面配置更具人性化设定,支持更多图标选择及菜单名称自定义 > 更具通俗化目录结构,让你一目了然 > 字段重构,前台发布表单字段设定,列表字段控制,多种类型字段让你自由发挥创作! > 后台增加模板自定义方式,让你二开更方便! > 后台插件模板接口开放设定,可以自由维护自己的客户进行客制化服务! > 免费开源,代码无任何加密,可免费商用,前台界面可以去除版权显示,支持MIT协议,真正开源免费! ***** ## 安装环境 * jizhicms的开发语言是PHP,支持PHP5.6+,发布之日起就已经兼容到PHP7.4版本,推荐使用PHP7.0版本以上。 * 安装环境建议Linux服务器,当然Windows也是可以安装的,云服务器建议安装宝塔面板 [查看](http://www.bt.cn/) * 无论是Windows还是Linux建议安装Apache、mysql、phpMyAdmin配件 * 本系统当前版本2.0仅支持mysql数据库 ## 安装须知 * PHP5.6+ * MySQL4.8+,数据编码 utf-8 或者 utf8-general-ci * 部署环境必须支持伪静态 * 支持Apache、Nginx、IIS ## 开始安装 1. 下载源码并解压源码到空间根目录(www) 2. 浏览器访问 http://127.0.0.1/install/ (本地环境) http://绑定域名/install/ (空间服务器环境) 3. 进入安装步骤,逐步进行安装 4. 初次安装请安装备份或者测试数据 5. 安装完毕后,为了安全,请删除根目录intall安装文件夹 ## 网站搬家 1. 进入后台--【系统扩展】--【数据库列表】,点击 备份数据库 将当前数据库备份 2. 将cache文件夹下面的缓存文件全部删除,并在根目录放置官方源码里的install文件夹 3. 将整个根目录打包下载到本地 4. 将打包后的压缩包上传到新空间 5. 按照【开始安装】的步骤进行安装程序 6. 安装第二步填入数据库账号密码后,选择你最新备份的数据库,点击进行安装 7. 安装完毕,为了安全,请删除根目录intall安装文件夹 ## 版权声明 ![极致CMS 2.0版权证明](https://www.jizhicms.cn/copyright.png) ## 支持协议 [MIT](https://gitee.com/Cherry_toto/jizhicms/blob/2.0/LICENSE) ![极致CMS建站系统](https://www.jizhicms.cn/footer_1920x273.png) ================================================ FILE: SECURITY.md ================================================ ## Security Policy 安全策略 ### Supported Versions 支持的版本 | Version | Supported | | ------- | ------------------ | | 2.0 | [ ✓ ] | | 1.9.x | [ ✓ ] | | < 1.9.x | [ × ] | ### Reporting a Vulnerability 报告漏洞 We strongly encourage you to report security vulnerabilities to our private security mailing list: ttuuffuu@163.com or 2581047041@qq.com - first, before disclosing them in any public forums. This is a private mailing list where only members of the JiZhiCMS internal security team are subscribed to, and is treated as top priority. 我们强烈建议您向我们的私人安全邮件列表报告安全漏洞:`ttuuffuu@163.com` 或 `2581047041@qq.com`,在任何公开论坛上披露之前。 这是一个私人邮件列表,只有 `JiZhiCMS` 内部安全团队的成员才能订阅,并被视为最高优先级。 ================================================ FILE: app/admin/c/AdminController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\extend\Page; class AdminController extends CommonController { public function group(){ $page = new Page('Level_group'); $sql = ' 1=1 '; if($this->admin['gid']!=1){ $sql.=" and id!=1 "; } $data = $page->where($sql)->orderby('id desc')->page($this->frparam('page',0,1))->go(); $pages = $page->pageList(); $this->pages = $pages; $this->lists = $data; $this->sum = $page->sum; $this->display('group-list'); } function group_del(){ $id = $this->frparam('id'); if($id){ //检查是否有管理员 if(M('level')->getCount(array('gid'=>$id))>0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('该角色下存在用户,请先移除用户再删除!'))); } if($id==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败,该分组不允许删除!'))); } $data = M('level_group')->find(array('id'=>$id)); if(M('level_group')->delete(array('id'=>$id))){ $w['molds'] = 'level_group'; $w['data'] = serialize($data); $w['title'] = '['.$data['id'].']'.$data['name']; $w['addtime'] = time(); M('recycle')->add($w); JsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败,请重试!'))); } }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作!'))); } } function groupedit(){ $this->fields_biaoshi = 'level_group'; if($this->frparam('go')==1){ $data = $this->frparam(); if($this->admin['gid']!=1 && $this->frparam('isadmin')==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败,您的权限不足!'))); } $data['name'] = $this->frparam('name',1); $data['ischeck'] = $this->frparam('ischeck'); $data['description'] = $this->frparam('description',1); $data['paction'] = (count($this->frparam('ruler',2))>0)?','.implode(',',$this->frparam('ruler',2)).',':''; $data['tids'] = (count($this->frparam('tids',2))>0)?','.implode(',',$this->frparam('tids',2)).',':''; if(M('level_group')->update(array('id'=>$data['id']),$data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败,请重新提交!'))); } } $this->data = M('level_group')->find(['id'=>$this->frparam('id')]); $rulers = M('ruler')->findAll(null,'id ASC'); $ruler_top = array(); $ruler_children = array(); foreach($rulers as $v){ if($v['pid']==0){ $ruler_top[]=$v; }else{ $ruler_children[$v['pid']][]=$v; } } $this->ruler_top = $ruler_top; $this->ruler_children = $ruler_children; if(!$this->data){ Error(JZLANG('没有该角色!')); } $this->display('group-edit'); } function groupadd(){ $this->fields_biaoshi = 'level_group'; if($this->frparam('go')==1){ $data = $this->frparam(); if($this->admin['gid']!=1 && $this->frparam('isadmin')==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('您的权限不足!'))); } $data['name'] = $this->frparam('name',1); $data['ischeck'] = $this->frparam('ischeck'); $data['description'] = $this->frparam('description',1); $data['paction'] = (count($this->frparam('ruler',2))>0)?','.implode(',',$this->frparam('ruler',2)).',':''; $data['tids'] = (count($this->frparam('tids',2))>0)?','.implode(',',$this->frparam('tids',2)).',':''; if(M('level_group')->add($data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败,请重新提交!'))); } } $rulers = M('ruler')->findAll(null,'id ASC'); $ruler_top = array(); $ruler_children = array(); foreach($rulers as $v){ if($v['pid']==0){ $ruler_top[]=$v; }else{ $ruler_children[$v['pid']][]=$v; } } $this->ruler_top = $ruler_top; $this->ruler_children = $ruler_children; $this->display('group-add'); } public function change_group_status(){ $id = $this->frparam('id',1); if(!$id){ JsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作!'))); } if($id==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败,该分组不允许修改!'))); } $x = M('Level_group')->find('id='.$id); if($x['isagree']==1){ $x['isagree']=0; }else{ $x['isagree']=1; } M('Level_group')->update(array('id'=>$id),array('isagree'=>$x['isagree'])); } public function adminlist(){ $data = $this->frparam(); $res = molds_search('level',$data); $get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : ''; $this->fields_search = $res['fields_search']; $this->fields_list = M('Fields')->findAll(array('molds'=>'level','islist'=>1),'orders desc'); $this->username = $this->frparam('username',1); $this->endtime = $this->frparam('end',1); $this->status = $this->frparam('status'); $this->starttime = $this->frparam('start',1); if($this->frparam('ajax')){ $admin = adminInfo($_SESSION['admin']['id']); $page = new Page('level'); $sql = ' 1=1 '; if($this->frparam('status')){ $status = $this->frparam('status')==1 ? 1 : 0; $sql .= ' and status='.$status; } if($this->frparam('username',1)){ $sql .= " and name like '%".$this->frparam('username',1)."%' "; } //只有超级管理员有权限看到整个列表 if($this->admin['gid']!=1){ $sql.= " and gid!=1 "; } if($this->frparam('start',1)){ $time = strtotime($this->frparam('start',1)); $sql .= " and regtime >= ".$time; } if($this->frparam('end',1)){ $end = strtotime($this->frparam('end',1).' 23:59:59'); $sql .= " and regtime <= ".$end; } $sql .= $get_sql; $lists = $page->where($sql)->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go(); $pages = $page->pageList(); $ajaxdata = []; foreach($lists as $k=>$v){ $v['group'] = get_info_table('level_group',['id'=>$v['gid']],'name'); $v['new_logintime'] = $v['logintime']!=0 ? date('Y-m-d H:i:s',$v['logintime']) : '-'; $v['new_regtime'] = $v['regtime']!=0 ? date('Y-m-d H:i:s',$v['regtime']) : '-'; $v['edit_url'] = U('Admin/adminedit',array('id'=>$v['id'])); foreach($this->fields_list as $vv){ $v[$vv['field']] = format_fields($vv,$v[$vv['field']]); } $ajaxdata[]=$v; } $this->lists = $lists; $this->page = $pages; $this->sum = $page->sum; JsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]); } $this->display('admin-list'); } public function adminedit(){ $this->fields_biaoshi = 'level'; $id = $this->frparam('id',1); if($this->frparam('go')==1){ $data = $this->frparam(); $data = get_fields_data($data,'level'); $data['gid'] = $this->frparam('gid',0,$this->admin['gid']); //防止越权操作 $change_admin = M('level')->find(['id'=>$id]); if($this->admin['gid']!=1 && $change_admin['gid']==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('您没有权限操作!'))); } //检查token $token = getCache('admin_'.$this->admin['id'].'_token'); if(!isset($_SESSION['token']) || !$token || $token!=$_SESSION['token']){ JsonReturn(array('code'=>1,'msg'=>'非法操作!')); } $data['email'] = $this->frparam('email',1); $data['pass'] = $this->frparam('pass',1); $data['repass'] = $this->frparam('repass',1); $data['name'] = $this->frparam('name',1); $data['tel'] = $this->frparam('tel',1); $data['status'] = $this->frparam('status'); $data['id'] = $id; if($data['id']==0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作!'))); } if($data['pass']){ if($data['pass']!=$data['repass']){ JsonReturn(array('code'=>1,'msg'=>JZLANG('两次密码不同!'))); } $data['pass'] = md5(md5($data['pass']).'YF'); }else{ unset($data['pass']); } if($data['tel']){ if(M('level')->find("tel='".$data['tel']."' and id!=".$data['id'])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('手机号已被注册!'))); } } if(M('level')->find("name='".$data['name']."' and id!=".$data['id'])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('昵称已被使用!'))); } if($data['email']){ if(M('level')->find("email='".$data['email']."' and id!=".$data['id'])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('邮箱已被使用!'))); } } $x = M('level')->update(array('id'=>$data['id']),$data); if($x){ JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败!'))); } } $this->member = M('level')->find('id='.$id); if($_SESSION['admin']['isadmin']==1){ $this->isadmin = true; }else{ $this->isadmin = false; } $this->groups = M('level_group')->findAll(); $token = getRandChar(10); $_SESSION['token'] = $token; setCache('admin_'.$this->admin['id'].'_token',$token); $this->token = $token; $this->display('admin-edit'); } public function adminadd(){ $this->fields_biaoshi = 'level'; if($this->frparam('go')==1){ $data = $this->frparam(); $data = get_fields_data($data,'level'); $data['gid'] = $this->frparam('gid',0,$this->admin['gid']); //防止越权操作 if($this->admin['gid']!=1 && $data['gid']==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('您没有权限操作!'))); } //检查token $token = getCache('admin_'.$this->admin['id'].'_token'); if(!isset($_SESSION['token']) || !$token || $token!=$_SESSION['token']){ JsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作!'))); } $data['email'] = $this->frparam('email',1); $data['pass'] = $this->frparam('pass',1); $data['repass'] = $this->frparam('repass',1); $data['name'] = $this->frparam('name',1); $data['tel'] = $this->frparam('tel',1); $data['status'] = $this->frparam('status'); $data['regtime'] = time(); $data['logintime'] = time(); if($data['pass']!=$data['repass']){ JsonReturn(array('code'=>1,'msg'=>JZLANG('两次密码不同!'))); } $data['pass'] = md5(md5($data['pass']).'YF'); if($data['tel']){ if(M('level')->find("tel='".$data['tel']."'")){ JsonReturn(array('code'=>1,'msg'=>JZLANG('手机号已被注册!'))); } } if(M('level')->find("name='".$data['name']."'")){ JsonReturn(array('code'=>1,'msg'=>JZLANG('昵称已被使用!'))); } if($data['email']){ if(M('level')->find("email='".$data['email']."' ")){ JsonReturn(array('code'=>1,'msg'=>JZLANG('邮箱已被使用!'))); } } $x = M('level')->add($data); if($x){ JsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败!'))); } } $this->admin = $_SESSION['admin']; $this->groups = M('level_group')->findAll(); if($_SESSION['admin']['isadmin']==1){ $this->isadmin = true; }else{ $this->isadmin = false; } $token = getRandChar(10); $_SESSION['token'] = $token; setCache('admin_'.$this->admin['id'].'_token',$token); $this->token = $token; $this->display('admin-add'); } public function change_status(){ $id = $this->frparam('id',1); if(!$id || $id==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作!'))); } $x = M('level')->find('id='.$id); if($x['status']==1){ $x['status']=0; }else{ $x['status']=1; } M('level')->update(array('id'=>$id),array('status'=>$x['status'])); } public function admindelete(){ $id = $this->frparam('id',1); if($id==''){ JsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作!'))); } if($id==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('系统管理员不能删除!'))); } $data = M('level')->find(array('id'=>$id)); $x = M('level')->delete(array('id'=>$id)); if($x){ $w['molds'] = 'level'; $w['data'] = serialize($data); $w['title'] = '['.$data['id'].']'.$data['name']; $w['addtime'] = time(); M('recycle')->add($w); JsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败!'))); } } function deleteAll(){ $data = $this->frparam('data',1); if($data!=''){ if($this->admin['gid']!=1){ $lists = M('level')->findAll('id in('.$data.')'); foreach($lists as $v){ if($v['gid']==1){ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败!'))); } } } $all = M('level')->findAll('id in('.$data.')'); if(M('level')->delete('id in('.$data.')')){ foreach($all as $v){ $w['molds'] = 'level'; $w['data'] = serialize($v); $w['title'] = '['.$v['id'].']'.$v['name']; $w['addtime'] = time(); M('recycle')->add($w); } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败!'))); } } } } ================================================ FILE: app/admin/c/ArticleController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\extend\Page; class ArticleController extends CommonController { //内容管理 function articlelist(){ $page = new Page('Article'); $this->fields_list = M('Fields')->findAll(array('molds'=>'article','islist'=>1),'listorders desc'); $this->isshow = $this->frparam('isshow'); $this->tid= $this->frparam('tid'); $this->title = $this->frparam('title',1); $this->molds = M('molds')->find(['biaoshi'=>'article']); $this->classtypes = $this->classtypetree; $data = $this->frparam(); $res = molds_search('article',$data); $get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : ''; $this->fields_search = $res['fields_search']; if($this->frparam('ajax')){ $sql = ' 1=1 '; if($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['iscontrol']!=0 && $this->molds['isclasstype']==1){ $a1 = explode(',',$this->tids); $a2 = array_filter($a1); $tids = implode(',',$a2); $sql.=' and tid in('.$tids.') '; } $sql .= $get_sql; $data = $page->where($sql)->orderby('istop desc,orders desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go(); $ajaxdata = []; foreach($data as $k=>$v){ $v['view_url'] = gourl($v,$v['htmlurl']); $v['edit_url'] = U('Article/editarticle',array('id'=>$v['id'])); foreach($this->fields_list as $vv){ $v[$vv['field']] = format_fields($vv,$v[$vv['field']]); } $ajaxdata[]=$v; } $pages = $page->pageList(); $this->pages = $pages; $this->lists = $data; $this->sum = $page->sum; JsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]); } $this->display('article-list'); } function addarticle(){ $this->fields_biaoshi = 'article'; if($this->frparam('go',1)==1){ $data = $this->frparam(); $data = get_fields_data($data,'article'); check_field_must($data,'article'); if(!$this->frparam('seo_title',1) && $this->frparam('config_seotitle')==1){ $data['seo_title'] = $data['title']; } if(!$this->frparam('description',1) && $this->frparam('config_description')==1){ $data['description'] = newstr(strip_tags($_POST['body']),200); } $water_models = explode(',',$this->webconf['text_molds']); if(in_array('article',$water_models)){ if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){ $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']); //存储 $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2); $pix_arr = explode('.',$data['litpic']); $pix = end($pix_arr); M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>'article']); }else if($this->frparam('litpic',1) && $this->webconf['text_waterlitpic']){ $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->frparam('litpic',1),0); } } if(!$data['litpic'] && $this->frparam('config_litpic')==1){ $pattern='//is'; if($this->frparam('body',1)){ $r = preg_match($pattern,stripslashes($data['body']),$matchContent); if($r){ $data['litpic'] = $matchContent[1]; }else{ $data['litpic'] = ''; } }else{ $data['litpic'] = ''; } } if(!$this->frparam('tags',1) && $this->frparam('config_tags')==1){ $data['tags'] = str_replace(',',',',$data['keywords']); if($data['tags']){ $data['tags'] = ','.$data['tags'].','; } } $data['userid'] = $_SESSION['admin']['id']; $data['htmlurl'] = $data['tid'] ? $this->classtypedata[$data['tid']]['htmlurl'] : null; //违禁词检测 if($this->webconf['mingan'] && $this->frparam('config_filter',1)){ $mingan = explode(',',$this->webconf['mingan']); $filter = explode(',',$this->frparam('config_filter',1)); $fields = $this->getTableFields('article'); foreach($mingan as $s){ if(strpos($s,'{xxx}')!==false){ $pattern = '/'.str_replace('{xxx}','(.*)',$s).'/'; foreach($filter as $vv){ if($vv && preg_match($pattern, $data[$vv])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').',【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]')); } } }else{ foreach($filter as $vv){ if($vv && strpos($data[$vv],$s)!==false ){ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败').',【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]')); } } } } } //处理自定义URL if($data['ownurl']){ if(M('customurl')->find(['url'=>$data['ownurl']])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL!'))); } } if($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){ $data['isshow'] = $this->frparam('isshow',0,1); }else{ $data['isshow'] = 0; } $data['addtime'] = $data['updatetime'] = isset($data['addtime']) ? $data['addtime'] : time(); //检查是否重复 if($this->webconf['hidetitleonliy']){ $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']); $onliyfield = ''; foreach ($hidetitleonly as $s){ $d = explode('-',$s); if(strtolower($d[0])=='article'){ $onliyfield = strtolower($d[1]); break; } } if($onliyfield){ if(M('article')->find([$onliyfield=>$data[$onliyfield]])){ JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复!'))); } } } //推荐置顶热门 if(strpos($data['jzattr'],'1')!==false){ $data['istop'] = 1; }else{ $data['istop'] = 0; } if(strpos($data['jzattr'],'2')!==false){ $data['ishot'] = 1; }else{ $data['ishot'] = 0; } if(strpos($data['jzattr'],'3')!==false){ $data['istuijian'] = 1; }else{ $data['istuijian'] = 0; } $r = M('Article')->add($data); if($r){ if($data['ownurl']){ M('customurl')->add(['molds'=>'article','url'=>$data['ownurl'],'tid'=>$data['tid'],'addtime'=>time(),'aid'=>$r]); } //tags处理 if($data['tags']){ $tags = explode(',',$data['tags']); foreach($tags as $v){ if($v!=''){ $r = M('tags')->find(['keywords'=>$v]); if(!$r){ $w['keywords'] = $v; $w['newname'] = ''; $w['url'] = ''; $w['num'] = -1; $w['isshow'] = 1; $w['number'] = 1; $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : ''; $w['target'] = '_blank'; M('tags')->add($w); }else{ $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].','; $ww['tids'] = $tags_tids; $ww['number'] = $r['number']+1; M('tags')->update(['keywords'=>$v],$ww); } } } } //处理配置信息 $config = $this->webconf['article_config']; $configdata = json_decode($config,1); if($configdata['seotitle']!=$this->frparam('config_seotitle') || $configdata['litpic']!=$this->frparam('config_litpic') || $configdata['tags']!=$this->frparam('config_tags') || $configdata['filter']!=$this->frparam('config_filter',1)){ $configdata = [ 'seotitle'=>$this->frparam('config_seotitle'), 'litpic'=>$this->frparam('config_litpic'), 'description'=>$this->frparam('config_description'), 'tags'=>$this->frparam('config_tags'), 'filter'=>$this->frparam('config_filter',1), ]; M('sysconfig')->update(['field'=>'article_config'],['data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)]); setCache('webconfig',null); } JsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功,继续添加~'),'url'=>U('addarticle',array('tid'=>$data['tid'])))); exit; } } $this->molds = M('molds')->find(['biaoshi'=>'article']); $this->tid = $this->frparam('tid'); $this->classtypes = $this->classtypetree; $config = $this->webconf['article_config']; if(!$config){ $configdata = [ 'seotitle'=>1, 'litpic'=>1, 'description'=>1, 'tags'=>1, 'filter'=>'title,keywords,body', ]; M('sysconfig')->add(['title'=>JZLANG('内容配置'),'field'=>'article_config','type'=>3,'data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),'typeid'=>0]); setCache('webconfig',null); }else{ $configdata = json_decode($config,1); } $this->configdata = $configdata; $this->display('article-add'); } function editarticle(){ $this->fields_biaoshi = 'article'; if($this->frparam('go',1)==1){ $data = $this->frparam(); $data = get_fields_data($data,'article'); check_field_must($data,'article'); if(!$this->frparam('seo_title',1) && $this->frparam('config_seotitle')==1){ $data['seo_title'] = $data['title']; } if(!$this->frparam('description',1) && $this->frparam('config_description')==1){ $data['description'] = newstr(strip_tags($_POST['body']),200); } $water_models = explode(',',$this->webconf['text_molds']); if(in_array('article',$water_models)){ if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){ $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']); //存储 $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2); $pix_arr = explode('.',$data['litpic']); $pix = end($pix_arr); M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>'article']); } } if(!$data['litpic'] && $this->frparam('config_litpic')==1){ $pattern='//is'; if($this->frparam('body',1)){ $r = preg_match($pattern,stripslashes($data['body']),$matchContent); if($r){ $data['litpic'] = $matchContent[1]; }else{ $data['litpic'] = ''; } }else{ $data['litpic'] = ''; } } if(!$this->frparam('tags',1) && $this->frparam('config_tags')==1){ $data['tags'] = str_replace(',',',',$data['keywords']); if($data['tags']){ $data['tags'] = ','.$data['tags'].','; } } $data['userid'] = $_SESSION['admin']['id']; $data['htmlurl'] = $data['tid'] ? $this->classtypedata[$data['tid']]['htmlurl'] : null; //违禁词检测 if($this->webconf['mingan'] && $this->frparam('config_filter',1)){ $mingan = explode(',',$this->webconf['mingan']); $filter = explode(',',$this->frparam('config_filter',1)); $fields = $this->getTableFields('article'); foreach($mingan as $s){ if(strpos($s,'{xxx}')!==false){ $pattern = '/'.str_replace('{xxx}','(.*)',$s).'/'; foreach($filter as $vv){ if($vv && preg_match($pattern, $data[$vv])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败').',【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]')); } } }else{ foreach($filter as $vv){ if($vv && strpos($data[$vv],$s)!==false ){ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败').',【'.$fields[$vv].'】'.JZLANG('存在敏感词').' [ '.$s.' ]')); } } } } } if($this->frparam('id')){ $old_tags = M('Article')->getField(['id'=>$this->frparam('id')],'tags'); //处理自定义URL if($data['ownurl']){ $customurl = M('customurl')->find(['url'=>$data['ownurl']]); if($customurl){ if($customurl['aid']!=$this->frparam('id')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL!'))); }else{ M('customurl')->update(['id'=>$customurl['id']],['url'=>$data['ownurl'],'tid'=>$data['tid'],'molds'=>'article']); } }else{ if(M('customurl')->find(['aid'=>$this->frparam('id'),'molds'=>'article'])){ M('customurl')->update(['aid'=>$this->frparam('id'),'molds'=>'article'],['url'=>$data['ownurl'],'molds'=>'article','tid'=>$data['tid']]); }else{ M('customurl')->add(['molds'=>'article','tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$this->frparam('id')]); } } }else{ M('customurl')->delete(['molds'=>'article','aid'=>$this->frparam('id')]); } if($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){ $data['isshow'] = $this->frparam('isshow',0,1); }else{ $data['isshow'] = 0; } //检查是否重复 if($this->webconf['hidetitleonliy']){ $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']); $onliyfield = ''; foreach ($hidetitleonly as $s){ $d = explode('-',$s); if(strtolower($d[0])=='article'){ $onliyfield = strtolower($d[1]); break; } } if($onliyfield){ $sql = $onliyfield."='".$this->frparam($onliyfield,1)."' and id!=".$this->frparam('id'); if(M('article')->find($sql)){ JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复!'))); } } } $data['addtime'] = isset($data['addtime']) ? $data['addtime'] : time(); $data['updatetime'] = time(); //推荐置顶热门 if(strpos($data['jzattr'],'1')!==false){ $data['istop'] = 1; }else{ $data['istop'] = 0; } if(strpos($data['jzattr'],'2')!==false){ $data['ishot'] = 1; }else{ $data['ishot'] = 0; } if(strpos($data['jzattr'],'3')!==false){ $data['istuijian'] = 1; }else{ $data['istuijian'] = 0; } if(M('Article')->update(array('id'=>$this->frparam('id')),$data)){ if($old_tags!=$data['tags']){ $a = $old_tags.$data['tags']; $new = []; $a = explode(',',$a); foreach($a as $v){ if($v!='' && !in_array($v,$new)){ $r = M('tags')->find(['keywords'=>$v]); if(!$r){ $w['keywords'] = $v; $w['newname'] = ''; $w['url'] = ''; $w['num'] = -1; $w['isshow'] = 1; $w['number'] = 1; $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : ''; $w['target'] = '_blank'; M('tags')->add($w); }else{ if(strpos($old_tags,','.$v.',')===false){ if($data['tid']){ $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].','; $ww['tids'] = $tags_tids; } $ww['number'] = $r['number']+1; M('tags')->update(['keywords'=>$v],$ww); }else if(strpos($data['tags'],','.$v.',')===false && strpos($old_tags,','.$v.',')!==false){ if($data['tid']){ $tags_tids = str_replace(','.$data['tid'].',',',',$r['tids']); $ww['tids'] = $tags_tids==',' ? '' : $tags_tids; } $ww['number'] = $r['number']-1; M('tags')->update(['keywords'=>$v],$ww); } } $new[]=$v; } } } if($this->webconf['release_award_open']==1 && $data['isshow']==1){ $award = round($this->webconf['release_award'],2); $max_award = round($this->webconf['release_max_award'],2); $member_id = M('Article')->getField(['id'=>$this->frparam('id')],'member_id'); if($member_id!=0 && $award>0){ $rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>'article','aid'=>$this->frparam('id'),'msg'=>JZLANG('发布奖励')]); if(!$rr){ $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG("发布奖励")."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $v){ $all_jifen+=$v['amount']; } } if($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = 'article'; $w['aid'] = $this->frparam('id'); $w['msg'] = JZLANG('发布奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } } } $config = $this->webconf['article_config']; $configdata = json_decode($config,1); if($configdata['seotitle']!=$this->frparam('config_seotitle') || $configdata['litpic']!=$this->frparam('config_litpic') || $configdata['tags']!=$this->frparam('config_tags') || $configdata['filter']!=$this->frparam('config_filter',1)){ $configdata = [ 'seotitle'=>$this->frparam('config_seotitle'), 'litpic'=>$this->frparam('config_litpic'), 'description'=>$this->frparam('config_description'), 'tags'=>$this->frparam('config_tags'), 'filter'=>$this->frparam('config_filter',1), ]; M('sysconfig')->update(['field'=>'article_config'],['data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)]); setCache('webconfig',null); } JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功!'),'url'=>U('index'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('您未做任何修改,不能提交!'))); } } } if($this->frparam('id')){ $this->data = M('Article')->find(array('id'=>$this->frparam('id'))); } $this->molds = M('molds')->find(['biaoshi'=>'article']); $this->classtypes = $this->classtypetree; $config = $this->webconf['article_config']; if(!$config){ $configdata = [ 'seotitle'=>1, 'litpic'=>1, 'description'=>1, 'tags'=>1, 'filter'=>'title,keywords,body', ]; M('sysconfig')->add(['title'=>JZLANG('内容配置'),'field'=>'article_config','type'=>3,'data'=>json_encode($configdata,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),'typeid'=>0]); setCache('webconfig',null); }else{ $configdata = json_decode($config,1); } $this->configdata = $configdata; $this->display('article-edit'); } function deletearticle(){ $id = $this->frparam('id'); if($id){ $data = M('article')->find(['id'=>$id]); if(M('Article')->delete(['id'=>$id])){ $customurl = M('customurl')->find(['molds'=>'article','aid'=>$id]); M('customurl')->delete(['molds'=>'article','aid'=>$id]); $w['molds'] = 'article'; $w['title'] = '['.$data['id'].']'.$data['title']; $w['data'] = serialize($data); $w['addtime'] = time(); $r = M('recycle')->add($w); if($customurl){ $w['molds'] = 'customurl'; $w['data'] = serialize($customurl); $w['title'] = '['.$customurl['id'].']'.JZLANG('自定义链接'); $w['addtime'] = time(); $w['aid'] = $r; M('recycle')->add($w); } JsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败!'))); } } } //复制文章 function copyarticle(){ $id = $this->frparam('id'); if($id){ $data = M('article')->find(['id'=>$id]); unset($data['id']); if(M('Article')->add($data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败!'))); } } } //批量删除文章 function deleteAll(){ $data = $this->frparam('data',1); if($data!=''){ $all = M('article')->findAll('id in('.$data.')'); if(M('article')->delete('id in('.$data.')')){ $customurls = M('customurl')->findAll(" aid in(".$data.") and molds='article' "); M('customurl')->delete(" aid in(".$data.") and molds='article' "); $newcustomurl = []; if($customurls){ foreach($customurls as $v){ $newcustomurl[$v['aid']] = $v; } } foreach($all as $v){ $w['molds'] = 'article'; $w['data'] = serialize($v); $w['addtime'] = time(); $w['title'] = '['.$v['id'].']'.$v['title']; $x = M('recycle')->add($w); if($x && $newcustomurl[$v['id']]){ $w['molds'] = 'customurl'; $w['data'] = serialize($newcustomurl[$v['id']]); $w['addtime'] = time(); $w['title'] = '['.$newcustomurl[$v['id']]['id'].']自定义链接'; $w['aid'] = $x; M('recycle')->add($w); } } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败!'))); } } } //批量复制文章 function copyAll(){ $data = $this->frparam('data',1); if($data!=''){ $list = M('article')->findAll('id in('.$data.')'); $r = true; foreach($list as $v){ unset($v['id']); M('Article')->add($v); } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量复制成功!'))); } } //批量修改栏目 function changeType(){ $data = $this->frparam('data',1); $tid = $this->frparam('tid'); if($data!=''){ $list = M('article')->findAll('id in('.$data.')'); $r = true; foreach($list as $v){ $w['tid'] = $tid; $type = M('classtype')->find(array('id'=>$tid)); $w['htmlurl'] = $type['htmlurl']; M('Article')->update(array('id'=>$v['id']),$w); if($v['ownurl']){ M('customurl')->update(['aid'=>$v['id'],'molds'=>'article'],['tid'=>$tid]); } } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功!'))); } } //修改排序 function editArticleOrders(){ $field = $this->frparam('field',1); $w[$field] = $this->frparam('value',1); $r = M('article')->update(array('id'=>$this->frparam('id')),$w); if(!$r){ JsonReturn(array('code'=>1,'info'=>JZLANG('修改失败!'))); } JsonReturn(array('code'=>0,'info'=>JZLANG('修改成功!'))); } //批量修改推荐属性 function changeAttribute(){ $data = $this->frparam('data',1); $tj = $this->frparam('tj'); if($data!=''){ $list = M('article')->findAll('id in('.$data.')'); foreach($list as $v){ if(strpos($v['jzattr'],','.$tj.',')!==false){ $attr = str_replace(','.$tj.',','',$v['jzattr']); if(!$attr){ $w['jzattr'] = ''; }else{ $w['jzattr'] = ','.trim($attr,',').','; } }else{ if($v['jzattr']){ $w['jzattr'] = $v['jzattr'].$tj.','; }else{ $w['jzattr'] = ','.$tj.','; } } if(strpos($w['jzattr'],'1')!==false){ $w['istop'] = 1; }else{ $w['istop'] = 0; } if(strpos($w['jzattr'],'2')!==false){ $w['ishot'] = 1; }else{ $w['ishot'] = 0; } if(strpos($w['jzattr'],'3')!==false){ $w['istuijian'] = 1; }else{ $w['istuijian'] = 0; } M('Article')->update(array('id'=>$v['id']),$w); } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功!'))); } } //批量审核 function checkAll(){ $data = $this->frparam('data',1); if($data!=''){ if($this->frparam('isshow')==1){ $isshow = 1; }else if($this->frparam('isshow')==2){ $isshow = 0; }else{ $isshow = 2; } if($isshow==1){ $all = M('article')->findAll('id in('.$data.')'); $award = round($this->webconf['release_award'],2); $max_award = round($this->webconf['release_max_award'],2); $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); foreach ($all as $k => $v) { if($v['isshow']!=1){ //start if($this->webconf['release_award_open']==1){ $member_id = $v['member_id']; if($member_id!=0 && $award>0){ $rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>'article','aid'=>$v['id'],'msg'=>JZLANG('发布奖励')]); if(!$rr){ $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG("发布奖励")."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $vv){ $all_jifen+=$vv['amount']; } } if($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = 'article'; $w['aid'] = $v['id']; $w['msg'] = JZLANG('发布奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } } } //end } } } M('article')->update('id in('.$data.')',['isshow'=>$isshow]); JsonReturn(array('code'=>0,'msg'=>JZLANG('批量操作成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败!'))); } } private function getTableFields($table){ $sql="select distinct * from information_schema.columns where table_schema = '".DB_NAME."' and table_name = '".DB_PREFIX.$table."'"; $list = M()->findSql($sql); $isgo = true; $fields = []; foreach($list as $v){ $len = 0; $s = preg_match('/\((.*)\)/',$v['COLUMN_TYPE'],$math); if($s){ $len = $math[1]; } $fields[$v['COLUMN_NAME']] = $v['COLUMN_COMMENT'] ? $v['COLUMN_COMMENT'] : $v['COLUMN_NAME']; } return $fields; } } ================================================ FILE: app/admin/c/ClasstypeController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\extend\Page; class ClasstypeController extends CommonController { function index(){ //$sql = null; //栏目不需要搜索 // $data = $this->frparam(); // $res = molds_search('classtype',$data); // $sql = ($res['fields_search_check']!='')?$res['fields_search_check']:null; // $this->fields_search = $res['fields_search']; $classtype = M('classtype')->findAll(NULL,'orders desc'); $classtype = set_class_haschild($classtype); $classtype = getTree($classtype); $this->classtypes = $classtype; //$this->classtypes = $this->classtypetree; //模块 $molds = M('Molds')->findAll(['isopen'=>1]); $fs = array(); foreach($molds as $v){ $fs[$v['biaoshi']] = $v; } $this->molds = M('molds')->find(['biaoshi'=>'classtype']); $this->moldslist = $fs; $this->display('classtype-list'); } function addclass(){ $this->fields_biaoshi = 'classtype'; if($this->frparam('go')==1){ $htmlurl = $this->frparam('htmlurl',1); if($htmlurl==''){ $htmlurl = str_replace(' ','',pinyin($this->frparam('classname',1))); } if($this->webconf['islevelurl'] && $this->frparam('pid')!=0){ //层级 $classtypetree = classTypeData(); $htmlurl = $classtypetree[$this->frparam('pid')]['htmlurl'].'/'.$htmlurl; } if(in_array(strtolower($htmlurl),array('message','user','comment','home','common','order','tags','wechat','login'))){ JsonReturn(array('status'=>0,'info'=>JZLANG('URL链接命名不能是').':message,user,comment,home,common,order,tags,wechat,login,jzpay')); } if(stripos($htmlurl,'.php')!==false){ JsonReturn(array('status'=>0,'info'=>JZLANG('非法URL'))); } $w['pid'] = $this->frparam('pid'); $w['orders'] = $this->frparam('orders'); $w['classname'] = $this->frparam('classname',1); $w['seo_classname'] = $this->frparam('seo_classname',1) ? $this->frparam('seo_classname',1) : $this->frparam('classname',1); $w['molds'] = $this->frparam('molds',1); $w['description'] = $this->frparam('description',1); $w['keywords'] = $this->frparam('keywords',1); $w['litpic'] = $this->frparam('litpic',1); $text = remote_data_local(stripslashes($_POST['body']), 0, $w['molds']); $w['body'] = format_param($text,4); $w['htmlurl'] = $htmlurl; $w['iscover'] = $this->frparam('iscover'); $w['lists_html'] = $this->frparam('lists_html',1); $w['details_html'] = $this->frparam('details_html',1); $w['gourl'] = $this->frparam('gourl',1); $w['lists_num'] = $this->frparam('lists_num'); $w['gids'] = $this->frparam('gids',2) ? implode(',',$this->frparam('gids',2)) : ''; //检查同级重名 if(M('classtype')->find(['classname'=>$w['classname'],'pid'=>$w['pid']])){ JsonReturn(array('status'=>0,'info'=>JZLANG('存在同级下重名!'))); } if($w['pid']){ $parent = M('classtype')->find(array('id'=>$w['pid'])); if($parent['iscover']==1){ $w['lists_html']= $w['lists_html'] ? $w['lists_html'] : ($this->frparam('lists_html_write',1) ? $this->frparam('lists_html_write',1) : $parent['lists_html']); $w['details_html']= $w['details_html'] ? $w['details_html'] : ($this->frparam('details_html_write',1) ? $this->frparam('details_html_write',1) : $parent['details_html']); $w['lists_num']=$parent['lists_num']; }else{ $w['lists_html']= $w['lists_html'] ? $w['lists_html'] : $this->frparam('lists_html_write',1); $w['details_html']= $w['details_html'] ? $w['details_html'] : $this->frparam('details_html_write',1); } }else{ $w['lists_html']= $w['lists_html'] ? $w['lists_html'] : $this->frparam('lists_html_write',1); $w['details_html']= $w['details_html'] ? $w['details_html'] : $this->frparam('details_html_write',1); } //$w['lists_html'] = str_ireplace('.html','',$w['lists_html']); //$w['details_html'] = str_ireplace('.html','',$w['details_html']); $data = $this->frparam(); $data = get_fields_data($data,'classtype'); $w = array_merge($data,$w); $w['addtime'] = $w['updatetime'] = isset($w['addtime']) ? $w['addtime'] : time(); $a = M('classtype')->add($w); if($a){ if($w['pid']){ $sql = " tids like '%,".$w['pid'].",%' or (molds='".$w['molds']."' and (tids is null or tids='')) "; }else{ $sql = "molds='".$w['molds']."'"; } $fields=M('fields')->findAll($sql); foreach ($fields as $v){ if($v['tids']){ M('fields')->update(array('id'=>$v['id']),array('tids'=>$v['tids'].$a.',')); }else{ M('fields')->update(array('id'=>$v['id']),array('tids'=>','.$a.',')); } } //这里 setCache('jzclasstypedata',null); setCache('classtypetree',null); setCache('classtype',null); setCache('mobileclasstype',null); setCache('classtypedatamobile',null); setCache('classtypedatapc',null); JsonReturn(array('status'=>1,'info'=>JZLANG('添加栏目成功,继续添加~'),'url'=>U('addclass',array('pid'=>$w['pid'],'biaoshi'=>$w['molds'])))); }else{ JsonReturn(array('status'=>0,'info'=>JZLANG('新增失败!'))); } } //模块 $this->molds = M('Molds')->findAll(['isopen'=>1]); $this->pid = $this->frparam('pid'); $this->biaoshi = $this->frparam('biaoshi',1); $this->classtypes = $this->classtypetree; $this->display('classtype-add'); } function editclass(){ $this->data = M('classtype')->find(array('id'=>$this->frparam('id'))); $this->fields_biaoshi = 'classtype'; if($this->frparam('go')==1){ $htmlurl = $this->frparam('htmlurl',1); if($htmlurl==''){ $htmlurl = str_replace(' ','',pinyin($this->frparam('classname',1))); } if(in_array(strtolower($htmlurl),array('message','user','comment','home','common','order','tags','wechat','login'))){ JsonReturn(array('status'=>0,'info'=>JZLANG('URL链接命名不能是').':message,user,comment,home,common,order,tags,wechat,login,jzpay')); } if(stripos($htmlurl,'.php')!==false){ JsonReturn(array('status'=>0,'info'=>'非法URL')); } $w['pid'] = $this->frparam('pid'); $w['orders'] = $this->frparam('orders'); $w['classname'] = $this->frparam('classname',1); $w['molds'] = $this->frparam('molds',1); if(!M('molds')->find(['biaoshi'=>$w['molds']])){ JsonReturn(array('status'=>1,'info'=>JZLANG('模型错误!'))); } $w['description'] = $this->frparam('description',1); $w['keywords'] = $this->frparam('keywords',1); $w['id'] = $this->frparam('id'); $w['litpic'] = $this->frparam('litpic',1); $text = remote_data_local(stripslashes($_POST['body']), $w['id'], $w['molds']); $w['body'] = format_param($text,4); $w['htmlurl'] = $htmlurl; $w['iscover'] = $this->frparam('iscover'); $w['lists_html'] = $this->frparam('lists_html',1) ? $this->frparam('lists_html',1) : $this->frparam('lists_html_write',1); $w['details_html'] = $this->frparam('details_html',1) ? $this->frparam('details_html',1) : $this->frparam('details_html_write',1); $w['lists_num'] = $this->frparam('lists_num'); $w['gourl'] = $this->frparam('gourl',1); //$w['lists_html'] = str_ireplace('.html','',$w['lists_html']); //$w['details_html'] = str_ireplace('.html','',$w['details_html']); $w['gids'] = $this->frparam('gids',2) ? implode(',',$this->frparam('gids',2)) : ''; $data = $this->frparam(); $data = get_fields_data($data,'classtype'); $w = array_merge($data,$w); //检测pid是否为该栏目下级 if(checkClass($w['pid'],$this->data['id']) || ($w['pid']==$this->data['id'])){ JsonReturn(array('status'=>0,'info'=>JZLANG('不能选择当前栏目及下级为顶级栏目'))); } $w['updatetime'] = time(); $a = M('classtype')->update(array('id'=>$w['id']),$w); if($a){ if($w['iscover']==1){ $children = M('classtype')->update(array('pid'=>$w['id']),array('lists_html'=>$w['lists_html'],'details_html'=>$w['details_html'],'lists_num'=>$w['lists_num'])); } //批量修改栏目对应的模块内容htmlurl if($this->data['htmlurl']!=$data['htmlurl']){ M($data['molds'])->update(array('tid'=>$data['id']),array('htmlurl'=>$data['htmlurl'])); } //批量修改栏目url if($this->webconf['islevelurl']==1){ if( ($this->data['htmlurl']!=$data['htmlurl']) || ($this->data['pid']!=$w['pid'])){ //层级 $classtypetree = classTypeData(); $children = get_children($classtypetree[$w['id']],$classtypetree,5); //计算当前url //以前的url替换成当前的url $old_htmlurl = $this->data['htmlurl']; if(strpos($w['htmlurl'],'/')!==false){ //获取最后一个 $htl = explode('/',$w['htmlurl']); $htl_new = end($htl);//最后一个名字 }else{ $htl_new = $w['htmlurl']; } if($w['pid']!=0){ $p_html = $classtypetree[$w['pid']]['htmlurl']; $new_htmlurl = $p_html.'/'.$htl_new; }else{ $new_htmlurl = $htl_new; } //更新栏目及其内容HTML M('classtype')->update(['id'=>$data['id']],['htmlurl'=>$new_htmlurl]); M($data['molds'])->update(array('tid'=>$data['id']),array('htmlurl'=>$new_htmlurl)); foreach($children as $v){ $html = substr($v['htmlurl'],strlen($old_htmlurl)); $htmlurl_s = $new_htmlurl.$html; M('classtype')->update(['id'=>$v['id']],['htmlurl'=>$htmlurl_s]); M($v['molds'])->update(['tid'=>$v['id']],['htmlurl'=>$htmlurl_s]); } } } setCache('jzclasstypedata',null); setCache('classtypetree',null); setCache('classtype',null); setCache('mobileclasstype',null); setCache('classtypedatamobile',null); setCache('classtypedatapc',null); JsonReturn(array('status'=>1)); }else{ JsonReturn(array('status'=>0,'info'=>JZLANG('您未做任何修改,不能提交!'))); } } //模块 $this->molds = M('Molds')->findAll(['isopen'=>1]); $this->classtypes = $this->classtypetree; $this->display('classtype-edit'); } function editClassOrders(){ $w['orders'] = $this->frparam('orders'); $r = M('classtype')->update(array('id'=>$this->frparam('id')),$w); if(!$r){ JsonReturn(array('code'=>1,'info'=>JZLANG('修改失败!'))); } setCache('jzclasstypedata',null); setCache('classtypetree',null); setCache('classtype',null); setCache('mobileclasstype',null); setCache('classtypedatamobile',null); setCache('classtypedatapc',null); JsonReturn(array('code'=>0,'info'=>JZLANG('修改成功!'))); } function deleteclass(){ $id = $this->frparam('id'); if($id){ //检测栏目是否有下级 if(M('classtype')->find(['pid'=>$id])){ JsonReturn(array('status'=>0,'info'=>JZLANG('该栏目有子栏目,请先删除子栏目!'))); } $data = M('classtype')->find(array('id'=>$id)); $a = M('classtype')->delete(array('id'=>$id)); if($a){ $w['molds'] = 'classtype'; $w['data'] = serialize($data); $w['addtime'] = time(); $w['title'] = '['.$data['id'].']'.$data['classname']; M('recycle')->add($w); setCache('jzclasstypedata',null); setCache('classtypetree',null); setCache('classtype',null); setCache('mobileclasstype',null); setCache('classtypedatamobile',null); setCache('classtypedatapc',null); JsonReturn(array('status'=>1)); }else{ JsonReturn(array('status'=>0,'info'=>JZLANG('删除失败!'))); } } } function change_status(){ $id = $this->frparam('id',1); if(!$id){ JsonReturn(array('code'=>1,'msg'=>JZLANG('非法操作!'))); } $x = M('Classtype')->find('id='.$id); if($x['isshow']==1){ $x['isshow']=0; }else{ $x['isshow']=1; } M('Classtype')->update(array('id'=>$id),array('isshow'=>$x['isshow'])); setCache('jzclasstypedata',null); setCache('classtypetree',null); setCache('classtype',null); setCache('mobileclasstype',null); setCache('classtypedatamobile',null); setCache('classtypedatapc',null); } function get_pinyin(){ $classname = $this->frparam('classname',1); if($classname){ $data = pinyin($classname,'first'); JsonReturn(['code'=>0,'data'=>$data]); } } function addmany(){ if($_POST){ $type = $this->frparam('type',0,1); if($type==1){ $molds = $this->frparam('molds',1); $pid = $this->frparam('pid',0,0); $classname = $this->frparam('classname',1); if(!trim($classname)){ JsonReturn(['code'=>1,'msg'=>JZLANG('栏目不能为空!')]); } $classname = explode("\n",trim($classname)); $classtypetree = classTypeData(); foreach($classname as $k=>$v){ if($v){ if(strpos($v,'|')!==false){ $d = explode('|',$v); }else{ $d = [$v,pinyin($v,'first')]; } $w['molds'] = $molds; $w['classname'] = $d[0]; $w['seo_classname'] = $d[0]; $w['pid'] = $pid; $d[1] = str_replace(' ','-',$d[1]); if($this->webconf['islevelurl'] && $w['pid']!=0){ //层级 $html = $classtypetree[$w['pid']]['htmlurl'].'/'.$d[1]; }else{ $html = $d[1]; } if(stripos($html,'.php')!==false){ JsonReturn(array('code'=>1,'info'=>'非法URL')); } $w['htmlurl'] = str_replace(' ','-',$html); $w['lists_num'] = $this->frparam('lists_num',0,10); $w['lists_html'] = $this->frparam('lists_html',1); $w['details_html'] = $this->frparam('details_html',1); $w['isshow'] =$this->frparam('isshow',0,1); $w['ishome'] =$this->frparam('ishome',0,1); $w['addtime'] = $w['updatetime'] = time(); $r = M('classtype')->add($w); $sql = "molds='".$w['molds']."'"; $fields=M('fields')->findAll($sql); foreach ($fields as $s){ if($s['tids']){ M('fields')->update(array('id'=>$s['id']),array('tids'=>$s['tids'].$r.',')); }else{ M('fields')->update(array('id'=>$s['id']),array('tids'=>','.$r.',')); } } $w = []; } } }else{ $data_0 = $this->frparam('data_0',2); $data_1 = $this->frparam('data_1',2); $data_2 = $this->frparam('data_2',2); $data_3 = $this->frparam('data_3',2); $data_4 = $this->frparam('data_4',2); $data_5 = $this->frparam('data_5',2); $data_6 = $this->frparam('data_6',2); $data_7 = $this->frparam('data_7',2); $data_8 = $this->frparam('data_8',2); $classtypetree = classTypeData(); foreach($data_1 as $k=>$v){ if($v && $v!=''){ $w['molds'] = $data_0[$k]; $w['classname'] = $v; $w['pid'] = $data_2[$k]; $data_3[$k] = $data_3[$k] ? : pinyin($data_3[$k],'first'); if($this->webconf['islevelurl'] && $w['pid']!=0){ //层级 $html = $classtypetree[$w['pid']]['htmlurl'].'/'.$data_3[$k]; }else{ $html = $data_3[$k]; } $w['htmlurl'] = $html; $w['lists_num'] = $data_4[$k]; $w['lists_html'] = $data_5[$k]; $w['details_html'] = $data_6[$k]; $w['isshow'] = $data_7[$k]; $w['orders'] = $data_8[$k]; $w['addtime'] = $w['updatetime'] = time(); $r = M('classtype')->add($w); $sql = "molds='".$w['molds']."'"; $fields=M('fields')->findAll($sql); foreach ($fields as $s){ if($s['tids']){ M('fields')->update(array('id'=>$s['id']),array('tids'=>$s['tids'].$r.',')); }else{ M('fields')->update(array('id'=>$s['id']),array('tids'=>','.$r.',')); } } $w = []; } } } setCache('jzclasstypedata',null); setCache('classtypetree',null); setCache('classtype',null); setCache('mobileclasstype',null); setCache('classtypedatamobile',null); setCache('classtypedatapc',null); JsonReturn(['code'=>0,'msg'=>'success']); } $this->molds = M('molds')->find(['biaoshi'=>'classtype']); $this->moldslist = M('molds')->findAll(['isopen'=>1]); $this->classtypes = $this->classtypetree;; $this->display('classtype-addmany'); } public function get_html(){ $molds = $this->frparam('molds',1,'article'); //获取前台template $dir = APP_PATH.'static/'.$this->webconf['pc_template'].'/'.strtolower($molds); $fileArray=array(); if(is_dir($dir)){ if (false != ($handle = opendir ( $dir ))) { $i=0; while ( false !== ($file = readdir ( $handle )) ) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != "..") { $fileArray[$i]=['html'=>$file,'value'=>$file]; $i++; } } //关闭句柄 closedir ( $handle ); } } $m = M('molds')->find(['biaoshi'=>$molds]); if(!count($fileArray)){ $fileArray[] = ['html'=>$m['list_html'],'value'=>$m['list_html']]; $fileArray[] = ['html'=>$m['details_html'],'value'=>$m['details_html']]; } JsonReturn(['code'=>0,'data'=>$fileArray,'path'=>$dir,'lists_html'=>$m['list_html'],'details_html'=>$m['details_html']]); } function changeClass(){ $pid = $this->frparam('pid',0,0); $tids = $this->frparam('tids',1); $tids_arr = explode(',',$tids); foreach($tids_arr as $v){ //检测pid是否为该栏目下级 if(checkClass($pid,$v) || ($pid==$v)){ JsonReturn(array('code'=>1,'msg'=>JZLANG('不能选择当前栏目及下级为顶级栏目'))); } } //批量修改栏目url if($this->webconf['islevelurl']==1){ //层级 $classtypetree = classTypeData(); foreach($tids_arr as $v){ $children = get_children($classtypetree[$v],$classtypetree,5); //计算当前url //以前的url替换成当前的url $old_htmlurl = $classtypetree[$v]['htmlurl']; if(strpos($old_htmlurl,'/')!==false){ //获取最后一个 $htl = explode('/',$old_htmlurl); $htl_new = end($htl);//最后一个名字 }else{ $htl_new = $old_htmlurl; } if($pid!=0){ $p_html = $classtypetree[$pid]['htmlurl']; $new_htmlurl = $p_html.'/'.$htl_new; }else{ $new_htmlurl = $htl_new; } //更新栏目及其内容HTML M('classtype')->update(['id'=>$v],['htmlurl'=>$new_htmlurl,'pid'=>$pid]); M($classtypetree[$v]['molds'])->update(array('tid'=>$v),array('htmlurl'=>$new_htmlurl,'tid'=>$pid)); foreach($children as $vv){ $html = substr($vv['htmlurl'],strlen($old_htmlurl)); $htmlurl_s = $new_htmlurl.$html; M('classtype')->update(['id'=>$vv['id']],['htmlurl'=>$htmlurl_s]); M($vv['molds'])->update(['tid'=>$vv['id']],['htmlurl'=>$htmlurl_s]); } } }else{ M('classtype')->update(' id in('.$tids.')',['pid'=>$pid]); } setCache('jzclasstypedata',null); setCache('classtypetree',null); setCache('classtype',null); setCache('mobileclasstype',null); setCache('classtypedatamobile',null); setCache('classtypedatapc',null); JsonReturn(array('code'=>0,'msg'=>JZLANG('操作成功!'))); } function getchildren(){ $id = $this->frparam('id'); $this->lists = $this->classtypedata[$id]['children']['list']; $molds = M('Molds')->findAll(['isopen'=>1]); $fs = array(); foreach($molds as $v){ $fs[$v['biaoshi']] = $v; } $this->molds = M('molds')->find(['biaoshi'=>'classtype']); $this->moldslist = $fs; $this->display('getchildren'); } } ================================================ FILE: app/admin/c/CollectController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/03 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\extend\Page; class CollectController extends CommonController { //列表 function index(){ $page = new Page('collect'); $sql = '1=1'; if($this->frparam('tid')){ $sql .= ' and tid='.$this->frparam('tid'); } $data = $this->frparam(); $res = molds_search('collect',$data); $get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : ''; $sql .= $get_sql; $this->fields_search = $res['fields_search']; $this->fields_list = M('Fields')->findAll(array('molds'=>'collect','islist'=>1),'orders desc'); if($this->frparam('title',1)!=''){ $sql.=" and title like '%".$this->frparam('title',1)."%' "; } $data = $page->where($sql)->orderby('id desc')->page($this->frparam('page',0,1))->go(); $pages = $page->pageList(); $this->pages = $pages; $this->lists = $data; $this->sum = $page->sum; $this->tid= $this->frparam('tid'); $this->title = $this->frparam('title',1); $collect_type = M('collect_type')->findAll(); $this->collect_type = $collect_type; $this->display('collect-list'); } function addcollect(){ $this->fields_biaoshi = 'collect'; if($this->frparam('go',1)==1){ $data = $this->frparam(); $data['addtime'] = strtotime($this->frparam('addtime',1)); $data['title'] = $this->frparam("title",1); $data['description'] = $this->frparam("description",1); $data['litpic'] = $this->frparam("litpic",1); $data['url'] = $this->frparam("url",1); $data['w'] = $this->frparam("w",1); $data['h'] = $this->frparam("h",1); $data['tid'] = $this->frparam("tid"); $data['isshow'] = $this->frparam("isshow"); $data['orders'] = $this->frparam("orders"); if(!$data['tid']){ JsonReturn(array('code'=>1,'msg'=>JZLANG('请选择分类!'))); exit; } $data = get_fields_data($data,'collect'); if(M('collect')->add($data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功!继续添加~'),'url'=>U('addcollect',array('tid'=>$data['tid'])))); exit; }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败!'))); exit; } } $collect_type = M('collect_type')->findAll(null); $this->tid = $this->frparam('tid') ? $this->frparam('tid') : 0; $this->collect_type = $collect_type; $this->display('collect-add'); } function copycollect(){ $id = $this->frparam('id'); if($id){ $data = M('collect')->find(['id'=>$id]); unset($data['id']); if(M('collect')->add($data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功!'))); exit; }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败!'))); exit; } } } function deleteAll(){ $data = $this->frparam('data',1); if($data!=''){ $all = M('collect')->findAll('id in('.$data.')'); if(M('collect')->delete('id in('.$data.')')){ foreach($all as $v){ $w['molds'] = 'collect'; $w['data'] = serialize($v); $w['title'] = '['.$v['id'].']'.$v['title']; $w['addtime'] = time(); M('recycle')->add($w); } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败!'))); } } } function editcollect(){ $this->fields_biaoshi = 'collect'; if($this->frparam('go',1)==1){ $data = $this->frparam(); $data['addtime'] = strtotime($this->frparam('addtime',1)); $data['title'] = $this->frparam("title",1); $data['description'] = $this->frparam("description",1); $data['litpic'] = $this->frparam("litpic",1); $data['url'] = $this->frparam("url",1); $data['w'] = $this->frparam("w",1); $data['h'] = $this->frparam("h",1); $data['tid'] = $this->frparam("tid"); $data['isshow'] = $this->frparam("isshow"); $data['orders'] = $this->frparam("orders"); if(!$data['tid']){ JsonReturn(array('code'=>1,'msg'=>JZLANG('请选择分类!'))); exit; } $data = get_fields_data($data,'collect'); if($this->frparam('id')){ if(M('collect')->update(array('id'=>$this->frparam('id')),$data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功!'),'url'=>U('index'))); exit; }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败!'))); exit; } } } if($this->frparam('id')){ $this->data = M('collect')->find(array('id'=>$this->frparam('id'))); } $collect_type = M('collect_type')->findAll(null); $this->collect_type = $collect_type; $this->display('collect-edit'); } function deletecollect(){ $id = $this->frparam('id'); if($id){ $data = M('collect')->find(['id'=>$id]); if(M('collect')->delete(['id'=>$id])){ $w['molds'] = 'collect'; $w['data'] = serialize($data); $w['title'] = '['.$data['id'].']'.$data['title']; $w['addtime'] = time(); M('recycle')->add($w); JsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败!'))); } } } function collectType(){ $lists = M("collect_type")->findAll(); $this->lists = $lists; $this->display('collecttype-list'); } function collectTypeAdd(){ if($this->frparam('go')==1){ $data['name'] = $this->frparam('name',1); $data['addtime'] = time(); if(M('collect_type')->add($data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('新增成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('新增失败!'))); } } $this->display('collecttype-add'); } function collectTypeEdit(){ $id = $this->frparam('id'); if($id){ if($this->frparam('go')==1){ $data['name'] = $this->frparam('name',1); $data['addtime'] = time(); if(M('collect_type')->update(array('id'=>$id),$data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败!'))); } } $data = M("collect_type")->find(array('id'=>$id)); $this->data = $data; $this->display('collecttype-edit'); } } function collectTypeDelete(){ $id = $this->frparam('id'); if($id){ //检测该分类下是否存在内容 $r = M('collect')->getCount(array('tid'=>$id)); if($r){ JsonReturn(array('code'=>1,'msg'=>JZLANG('该分类下存在内容,请先删除该分类下的内容!'))); } $data = M('collect_type')->find(['id'=>$id]); if(M('collect_type')->delete(['id'=>$id])){ $w['molds'] = 'collect_type'; $w['data'] = serialize($data); $w['title'] = '['.$data['id'].']'.$data['title']; $w['addtime'] = time(); M('recycle')->add($w); JsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败!'))); } } } } ================================================ FILE: app/admin/c/CommentController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\extend\Page; class CommentController extends CommonController { function addcomment(){ $this->fields_biaoshi = 'comment'; if($this->frparam('go',1)==1){ $data = $this->frparam(); $data['addtime'] = strtotime($data['addtime']); $data['body'] = $this->frparam('body',4); $data['reply'] = $this->frparam('reply',4); $data['userid'] = $_SESSION['admin']['id']; $data = get_fields_data($data,'comment'); if(M('Comment')->add($data)){ //Success('添加成功!',U('index')); JsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功!'))); exit; }else{ //Error('添加失败!'); JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败!'))); exit; } } //$classtype = M('classtype')->findAll(null,'orders desc'); //$classtype = getTree($classtype); $this->classtypes = $this->classtypetree;; $this->display('comment-add'); } //批量删除评论 function deleteAll(){ $data = $this->frparam('data',1); if($data!=''){ $all = M('comment')->findAll('id in('.$data.')'); if(M('comment')->delete('id in('.$data.')')){ foreach($all as $v){ $w['molds'] = 'comment'; $w['data'] = serialize($v); $w['title'] = '['.$v['id'].']'.newstr($v['body'],40); $w['addtime'] = time(); M('recycle')->add($w); if($this->classtypedata[$v['tid']] && $v['aid']){ M($this->classtypedata[$v['tid']]['molds'])->goDec(['id'=>$v['aid']],'comment_num'); } } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败!'))); } } } //评论管理 function commentlist(){ $this->tid= $this->frparam('tid'); $this->aid = $this->frparam('aid'); $this->isshow = $this->frparam('isshow'); $this->userid = $this->frparam('userid'); $this->body = $this->frparam('body',1); $this->fields_list = M('Fields')->findAll(array('molds'=>'comment','islist'=>1),'orders desc'); $data = $this->frparam(); $res = molds_search('comment',$data); $get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : ''; $this->fields_search = $res['fields_search']; $this->classtypes = $this->classtypetree; $this->molds = M('molds')->find(['biaoshi'=>'comment']); if($this->frparam('ajax')){ $page = new Page('Comment'); $sql = '1=1'; if($this->isshow==1){ $sql .= ' and isshow=1 '; }else if($this->isshow==2){ $sql .= ' and isshow=0 '; }else if($this->isshow==3){ $sql .= ' and isshow=2 '; } if($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['iscontrol']!=0 && $this->molds['isclasstype']==1){ $a1 = explode(',',$this->tids); $a2 = array_filter($a1); $tids = implode(',',$a2); $sql.=' and tid in('.$tids.') '; } if($this->frparam('tid')){ $sql .= ' and tid='.$this->frparam('tid'); } if($this->frparam('aid')){ $sql.=" and aid = ".$this->frparam('aid')." "; } if($this->frparam('body',1)){ $sql.=" and body like '%".$this->frparam('body',1)."%' "; } if($this->frparam('userid')!=0){ $sql.=" and userid = ".$this->frparam('userid')." "; } $sql .= $get_sql; $data = $page->where($sql)->orderby('addtime desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go(); $ajaxdata = []; $classtypedata = classTypeData(); foreach($data as $k=>$v){ $v['new_username'] = $v['userid']!=0 ? get_info_table('member',array('id'=>$v['userid']),'username') : ''; $v['new_user'] = $v['userid']!=0 ? U('Member/memberedit',['id'=>$v['userid']]) : ''; if($v['tid']!=0 && isset($classtypedata[$v['tid']])){ $v['new_tid'] = $classtypedata[$v['tid']]['classname']; }else{ $v['new_tid'] = ''; } if($v['aid']!=0 && $v['tid']!=0 && isset($classtypedata[$v['tid']])){ $adata = M($classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid']]); if($adata){ $v['new_aid_url'] = get_domain().'/'.$adata['htmlurl'].'/'.$v['aid']; }else{ $v['new_aid_url'] = ''; } }else{ $v['new_aid_url'] = ''; } $v['new_zid'] = $v['zid']!=0 ? U('Comment/editcomment',array('id'=>$v['zid'])) : ''; $v['new_pid'] = $v['pid']!=0 ? U('Comment/editcomment',array('id'=>$v['pid'])) : ''; if($v['isshow']==1){ $v['new_isshow'] = JZLANG('已审核'); }else if($v['isshow']==2){ $v['new_isshow'] = JZLANG('被删除'); }else{ $v['new_isshow'] = JZLANG('未审核'); } $v['new_isread'] = $v['isread']==1 ? JZLANG('已读') : JZLANG('未读'); $v['new_addtime'] = date('Y-m-d H:i:s',$v['addtime']); $v['edit_url'] = U('Comment/editcomment',array('id'=>$v['id'])); foreach($this->fields_list as $vv){ $v[$vv['field']] = format_fields($vv,$v[$vv['field']]); } $ajaxdata[]=$v; } $pages = $page->pageList(); $this->pages = $pages; $this->lists = $data; $this->sum = $page->sum; JsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]); } $this->display('comment-list'); } public function editcomment(){ $this->fields_biaoshi = 'comment'; if($this->frparam('go',1)==1){ $data = $this->frparam(); foreach($data as $k=>$v){ $data[$k] = $this->frparam($k,1); } $data['addtime'] = strtotime($data['addtime']); $data['body'] = $this->frparam('body',4); $data['reply'] = $this->frparam('reply',4); $data = get_fields_data($data,'comment'); if($this->frparam('id')){ if(M('Comment')->update(array('id'=>$this->frparam('id')),$data)){ if($this->frparam('ismsg') && $data['reply']){ $task['aid'] = $this->frparam('id'); $task['tid'] = $data['tid']; $task['userid'] = $data['userid']; $task['puserid'] = 0; $task['molds'] = $this->classtypedata[$data['tid']]['molds']; $task['type'] = 'comment'; $task['addtime'] = time(); $task['body'] = $data['reply']; if(!$data['aid']){ $url = $this->classtypedata[$data['tid']]['url']; }else{ //非栏目评论 $res=M($this->classtypedata[$data['tid']]['molds'])->find(['id'=>$data['aid']]); $url = gourl($res,$res['htmlurl']); } $task['url'] = $url; M('task')->add($task); } JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功!'),'url'=>U('index'))); exit; }else{ //Error('修改失败!'); JsonReturn(array('code'=>1,'msg'=>JZLANG('修改失败!'))); exit; } } } if($this->frparam('id')){ $this->data = M('Comment')->find(array('id'=>$this->frparam('id'))); } //$classtype = M('classtype')->findAll(null,'orders desc'); //$classtype = getTree($classtype); $this->classtypes = $this->classtypetree;; $this->display('comment-details'); } function deletecomment(){ $id = $this->frparam('id'); if($id){ $data = M('Comment')->find(['id'=>$id]); if(M('Comment')->delete(['id'=>$id])){ $w['molds'] = 'comment'; $w['data'] = serialize($data); $w['title'] = '['.$data['id'].']'.newstr($data['body'],40); $w['addtime'] = time(); M('recycle')->add($w); //更新统计数 if($this->classtypedata[$data['tid']] && $data['aid']){ M($this->classtypedata[$data['tid']]['molds'])->goDec(['id'=>$data['aid']],'comment_num'); } JsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功!'))); }else{ //Error('删除失败!'); JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败!'))); } } } //批量审核 function checkAll(){ $data = $this->frparam('data',1); if($data!=''){ $isshow = $this->frparam('isshow')==1 ? 1 : 0; M('comment')->update('id in('.$data.')',['isshow'=>$isshow]); JsonReturn(array('code'=>0,'msg'=>JZLANG('批量审核成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量审核失败!'))); } } } ================================================ FILE: app/admin/c/CommonController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\lib\Controller; class CommonController extends Controller { function _init(){ if(class_exists('app\admin\plugins\CommonController')){ $extCommonModel = new \app\admin\plugins\CommonController($this->frparam()); if(method_exists($extCommonModel,APP_ACTION)){ $action = APP_ACTION; $extCommonModel->$action(); exit; } } if(!isset($_SESSION['admin']) || !$_SESSION['admin']['id']){ $_SESSION['admin'] = null; Redirect(U('Login/index')); } if($_SESSION['admin']['isadmin']!=1){ if(strpos($_SESSION['admin']['paction'],','.APP_CONTROLLER.',')!==false){ }else{ $action = APP_CONTROLLER.'/'.APP_ACTION; if(strpos($_SESSION['admin']['paction'],','.$action.',')===false){ $ac = M('Ruler')->find(array('fc'=>$action)); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您没有权限!').'【'.JZLANG($ac['name']).'】','url'=>U('Index/welcome')]); } Error(JZLANG('您没有权限!').'【'.$ac['name'].'】',U('Index/welcome')); } } } $this->admin = $_SESSION['admin']; $webconf = webConf(); $template = TEMPLATE; $this->webconf = $webconf; $this->template = $template; $this->tpl = Tpl_style.$template.'/'; $customconf = get_custom(); $this->customconf = $customconf; $this->classtypetree = get_classtype_tree(); $m = 1; if(isMobile() && $webconf['iswap']==1){ $classtypedata = classTypeDataMobile(); $m = 1; }else{ $classtypedata = classTypeData(); $m = 0; } $this->classtypedata = getclasstypedata($classtypedata,$m); if($_SESSION['admin']['isadmin']!=1){ $tids = $_SESSION['admin']['tids'] ?: '000'; foreach ($this->classtypetree as $k => $v) { if($v['pid']==0){ if(strpos($_SESSION['admin']['tids'],','.$v['id'].',')!==false){ $children = get_children($v,$this->classtypetree,5); foreach($children as $vv){ if(strpos($_SESSION['admin']['tids'],','.$vv['id'].',')===false){ $tids .= ','.$vv['id'].','; } } } } } }else{ $tids = '000'; } $this->tids = $tids; } function uploads(){ if ($_FILES["file"]["error"] > 0){ $data['error'] = "Error: " . $_FILES["file"]["error"]; $data['code'] = 1000; }else{ // echo "Upload: " . $_FILES["file"]["name"] . "
"; // echo "Type: " . $_FILES["file"]["type"] . "
"; // echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
"; // echo "Stored in: " . $_FILES["file"]["tmp_name"]; $pix = explode('.',$_FILES['file']['name']); $pix = end($pix); $fileType = $this->webconf['fileType']; if(strpos($fileType,strtolower($pix))===false || stripos($pix,'php')!==false || stripos($pix,'phtml')!==false || stripos($pix,'phar')!==false){ $data['error'] = "Error: ".JZLANG("文件类型不允许上传!"); $data['code'] = 1002; JsonReturn($data); } $fileSize = (int)webConf('fileSize'); if($fileSize!=0 && ($_FILES["file"]["size"]/1024)>$fileSize){ $data['error'] = "Error: ".JZLANG("文件大小超过网站内部限制!"); $data['code'] = 1003; JsonReturn($data); } if(isset($this->webconf['admin_save_path'])){ //替换日期事件 $t = time(); $d = explode('-', date("Y-y-m-d-H-i-s")); $format = $this->webconf['admin_save_path']; $format = str_replace("{yyyy}", $d[0], $format); $format = str_replace("{yy}", $d[1], $format); $format = str_replace("{mm}", $d[2], $format); $format = str_replace("{dd}", $d[3], $format); $format = str_replace("{hh}", $d[4], $format); $format = str_replace("{ii}", $d[5], $format); $format = str_replace("{ss}", $d[6], $format); $format = str_replace("{time}", $t, $format); if($format!=''){ //检查文件是否存在 if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){ $path = explode('/',$format); $path1 = APP_PATH; foreach($path as $v){ if($path1==APP_PATH){ if(!file_exists($path1.$v)){ mkdir($path1.$v,0777); } $path1.=$v; }else{ if(!file_exists($path1.'/'.$v)){ mkdir($path1.'/'.$v,0777); } $path1.='/'.$v; } } }else if(!file_exists(APP_PATH.$format)){ mkdir(APP_PATH.$format,0777); } $admin_save_path = $format; }else{ $admin_save_path = 'public/Admin'; } }else{ $admin_save_path = 'public/Admin'; } if(!isset($this->webconf['upload_file_name']) || (isset($this->webconf['upload_file_name']) && $this->webconf['upload_file_name'])){ $filename = $admin_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix; $filename_x = $admin_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix; }else{ $name = urldecode($_FILES['file']['name']); $name = str_ireplace(["'",'"','%','&',' '],'',$name); $name = format_param($name,6); $filename = $admin_save_path.'/'.$name; $filename_x = $admin_save_path.'/'.$name; } if(move_uploaded_file($_FILES["file"]['tmp_name'],$filename)){ if( (strtolower($pix)=='png' && $this->webconf['ispngcompress']==1) || strtolower($pix)=='jpg' || strtolower($pix)=='jpeg'){ $imagequlity = (int)$this->webconf['imagequlity']; if($imagequlity!=100){ $image = new \compressimage($filename); $image->percent = 1; $image->ispngcompress = $this->webconf['ispngcompress']; $image->quality = $imagequlity=='' ? 75 : $imagequlity; $image->openImage(); $image->thumpImage(); //$image->showImage(); unlink($filename); $image->saveImage($filename_x); $filename = $filename_x; } } if( (strtolower($pix)=='png' || strtolower($pix)=='jpg' || strtolower($pix)=='jpeg') && $this->webconf['iswatermark']==1 ){ watermark($filename,APP_PATH.$this->webconf['watermark_file'],$this->webconf['watermark_t'],$this->webconf['watermark_tm'],$this->webconf['text_word']); } $data['url'] = '/'.$filename; $data['code'] = 0; $filesize = round(filesize(APP_PATH.$filename)/1024,2); M('pictures')->add(['litpic'=>'/'.$filename,'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid',0,0),'molds'=>$this->frparam('molds',1,null)]); }else{ $data['error'] = "Error: ".JZLANG("请检查目录写入权限")."[".$admin_save_path."]"; $data['code'] = 1001; } } JsonReturn($data); } } ================================================ FILE: app/admin/c/ErrorController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\lib\Controller; class ErrorController extends Controller { //错误处理示例 function index($msg=''){ header("HTTP/1.0 404"); if(APP_DEBUG){ $msg = format_param($msg,1); echo JZLANG('错误信息提示').':
'; echo $msg; }else{ echo ' 404

404,您请求的文件不存在!

'; } } } ================================================ FILE: app/admin/c/ExtmoldsController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\lib\Controller; use frphp\extend\Page; class ExtmoldsController extends Controller { function _init(){ if(!isset($_SESSION['admin']) || !$_SESSION['admin']['id']){ Redirect(U('Login/index')); } if($_SESSION['admin']['isadmin']!=1){ if(strpos($_SESSION['admin']['paction'],','.APP_CONTROLLER.',')===false){ $molds = $this->frparam('molds',1); $action = APP_CONTROLLER.'/'.APP_ACTION.'/molds/'.$molds; if(strpos($_SESSION['admin']['paction'],','.$action.',')===false){ $ac = M('Ruler')->find(array('fc'=>$action)); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您没有权限!').'【'.JZLANG($ac['name']).'】','url'=>U('Index/welcome')]); } Error(JZLANG('您没有权限!').'【'.$ac['name'].'】',U('Index/welcome')); } } } $this->admin = $_SESSION['admin']; $webconf = webConf(); $template = TEMPLATE; $this->webconf = $webconf; $this->template = $template; $this->tpl = Tpl_style.$template.'/'; $customconf = get_custom(); $this->customconf = $customconf; $this->classtypetree = get_classtype_tree(); $m = 1; if(isMobile() && $webconf['iswap']==1){ $classtypedata = classTypeDataMobile(); $m = 1; }else{ $classtypedata = classTypeData(); $m = 0; } $this->classtypedata = getclasstypedata($classtypedata,$m); if($_SESSION['admin']['isadmin']!=1){ $tids = $_SESSION['admin']['tids'] ?: '000'; foreach ($this->classtypetree as $k => $v) { if($v['pid']==0){ if(strpos($_SESSION['admin']['tids'],','.$v['id'].',')!==false){ $children = get_children($v,$this->classtypetree,5); foreach($children as $vv){ if(strpos($_SESSION['admin']['tids'],','.$vv['id'].',')===false){ $tids .= ','.$vv['id'].','; } } } } } }else{ $tids = '000'; } $this->tids = $tids; } public function index(){ $classtypedata = $this->classtypedata; $molds = $this->frparam('molds',1); if($molds==''){ Error(JZLANG('模块为空,请选择模块!')); } $this->molds = M('Molds')->find(array('biaoshi'=>$molds)); $data = $this->frparam(); $res = molds_search($molds,$data); $this->isshow = $this->frparam('isshow'); $this->tid = $this->frparam('tid'); $this->fields_search = $res['fields_search']; $this->fields_list = M('Fields')->findAll(array('molds'=>$molds,'islist'=>1),'listorders desc'); $this->classtypes = $this->classtypetree; if($this->frparam('ajax')){ $sql = '1=1'; if($this->admin['classcontrol']==1 && $this->admin['isadmin']!=1 && $this->molds['isclasstype']==1 && $this->molds['iscontrol']!=0){ $a1 = explode(',',$this->tids); $a2 = array_filter($a1); $tids = implode(',',$a2); $sql.=' and tid in('.$tids.') '; } $get_sql = ($res['fields_search_check']!='') ? (' and '.$res['fields_search_check']) : ''; $sql .= $get_sql; $page = new Page($molds); $data = $page->where($sql)->orderby('istop desc,orders desc,id desc')->limit($this->frparam('limit',0,10))->page($this->frparam('page',0,1))->go(); $ajaxdata = []; foreach($data as $k=>$v){ if(isset($classtypedata[$v['tid']])){ $v['new_tid'] = $v['tid']!=0 ? $classtypedata[$v['tid']]['classname'] : '-'; }else{ $v['new_tid'] = '[未分类]'; } if($molds=='tags'){ $v['view_url'] = get_domain().'/tags/index/id/'.$v['id']; }else{ $v['view_url'] = gourl($v,$v['htmlurl']); } $v['edit_url'] = U('Extmolds/editmolds',array('id'=>$v['id'],'molds'=>$molds)); foreach($this->fields_list as $vv){ $v[$vv['field']] = format_fields($vv,$v[$vv['field']]); } $ajaxdata[]=$v; } $pages = $page->pageList(); $this->pages = $pages; $this->lists = $data; $this->sum = $page->sum; JsonReturn(['code'=>0,'data'=>$ajaxdata,'count'=>$page->sum]); } if(file_exists(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/'.$molds.'-list.html')){ $this->display($molds.'-list'); }else{ $this->display('extmolds-list'); } } public function addmolds(){ $molds = $this->frparam('molds',5); $this->fields_biaoshi = $molds; if($this->frparam('go',1)==1){ $data = $this->frparam(); $data = get_fields_data($data,$molds); check_field_must($data,$molds); if($data['tid']){ $data['htmlurl'] = $this->classtypedata[$data['tid']]['htmlurl']; } //处理自定义URL if(isset($data['ownurl'])){ if(M('customurl')->find(['molds'=>$molds,'url'=>$data['ownurl']])){ JsonReturn(array('code'=>1,'msg'=>'已存在相同的自定义URL!')); } } $data['userid'] = $this->admin['id']; $data['molds'] = $molds; if($data['tags']){ $data['tags'] = ','.$data['tags'].','; }else if($this->frparam('keywords',1)){ $data['tags'] = ','.str_replace(',',',',$this->frparam('keywords',1)).','; } if($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){ $data['isshow'] = $this->frparam('isshow',0,1); }else{ $data['isshow'] = 0; } $data['addtime'] = isset($data['addtime']) ? $data['addtime'] : time(); //检查是否重复 if($this->webconf['hidetitleonliy']){ $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']); $onliyfield = ''; foreach ($hidetitleonly as $s){ $d = explode('-',$s); if(strtolower($d[0])==$molds){ $onliyfield = strtolower($d[1]); break; } } if($onliyfield){ if(M($molds)->find([$onliyfield=>$data[$onliyfield]])){ JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复!'))); } } } $water_models = explode(',',$this->webconf['text_molds']); if(in_array($molds,$water_models)){ if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){ $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']); //存储 $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2); $pix_arr = explode('.',$data['litpic']); $pix = end($pix_arr); M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>$molds]); }else if($this->frparam('litpic',1) && $this->webconf['text_waterlitpic']){ $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->frparam('litpic',1),0); } } //推荐置顶热门 if(strpos($data['jzattr'],'1')!==false){ $data['istop'] = 1; }else{ $data['istop'] = 0; } if(strpos($data['jzattr'],'2')!==false){ $data['ishot'] = 1; }else{ $data['ishot'] = 0; } if(strpos($data['jzattr'],'3')!==false){ $data['istuijian'] = 1; }else{ $data['istuijian'] = 0; } $r = M($molds)->add($data); if($r){ if(isset($data['ownurl'])){ M('customurl')->add(['molds'=>$molds,'tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$r]); } //tags处理 if($data['tags']){ $tags = explode(',',$data['tags']); foreach($tags as $v){ if($v!=''){ $r = M('tags')->find(['keywords'=>$v]); if(!$r){ $w['keywords'] = $v; $w['newname'] = ''; $w['url'] = ''; $w['num'] = -1; $w['isshow'] = 1; $w['number'] = 1; $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : ''; $w['target'] = '_blank'; M('tags')->add($w); }else{ $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].','; $ww['tids'] = $tags_tids; $ww['number'] = $r['number']+1; M('tags')->update(['keywords'=>$v],$ww); } } } } JsonReturn(array('code'=>0,'msg'=>JZLANG('添加成功,继续添加~'),'url'=>U('Extmolds/addmolds',['tid'=>$data['tid'],'molds'=>$molds]))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败!'))); } } $this->classtypes = $this->classtypetree; $this->tid = $this->frparam('tid',0,0); $this->molds = M('Molds')->find(array('biaoshi'=>$molds)); if(file_exists(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/'.$molds.'-add.html')){ $this->display($molds.'-add'); }else{ $this->display('extmolds-add'); } } public function editmolds(){ $molds = $this->frparam('molds',5); $this->fields_biaoshi = $molds; if($this->frparam('go',1)==1){ $data = $this->frparam(); $data = get_fields_data($data,$molds); check_field_must($data,$molds); if($data['tid']){ $data['htmlurl'] = $this->classtypedata[$data['tid']]['htmlurl']; } if($this->frparam('id')){ //处理自定义URL if($data['ownurl']){ $customurl = M('customurl')->find(['url'=>$data['ownurl']]); if($customurl){ if($customurl['aid']!=$this->frparam('id')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('已存在相同的自定义URL!'))); }else{ M('customurl')->update(['id'=>$customurl['id']],['url'=>$data['ownurl'],'tid'=>$data['tid'],'molds'=>$molds]); } }else{ if(M('customurl')->find(['aid'=>$this->frparam('id'),'molds'=>$molds])){ M('customurl')->update(['aid'=>$this->frparam('id'),'molds'=>$molds],['url'=>$data['ownurl'],'molds'=>$molds,'tid'=>$data['tid']]); }else{ M('customurl')->add(['molds'=>$molds,'tid'=>$data['tid'],'url'=>$data['ownurl'],'addtime'=>time(),'aid'=>$this->frparam('id')]); } } }else{ M('customurl')->delete(['molds'=>$molds,'aid'=>$this->frparam('id')]); } if($data['tags']){ $data['tags'] = ','.$data['tags'].','; }else if($this->frparam('keywords',1)){ $data['tags'] = ','.str_replace(',',',',$this->frparam('keywords',1)).','; } $old_tags = M($molds)->getField(['id'=>$this->frparam('id')],'tags'); if($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){ $data['isshow'] = $this->frparam('isshow',0,1); }else{ $data['isshow'] = 0; } //检查是否重复 if($this->webconf['hidetitleonliy']){ $hidetitleonly = explode('|',$this->webconf['hidetitleonliy']); $onliyfield = ''; foreach ($hidetitleonly as $s){ $d = explode('-',$s); if(strtolower($d[0])==$molds){ $onliyfield = strtolower($d[1]); break; } } if($onliyfield){ $sql = $onliyfield."='".$this->frparam($onliyfield,1)."' and id!=".$this->frparam('id'); if(M($molds)->find($sql)){ JsonReturn(array('code'=>1,'msg'=>$onliyfield.JZLANG('重复!'))); } } } $water_models = explode(',',$this->webconf['text_molds']); if(in_array($molds,$water_models)){ if(!$this->frparam('litpic',1) && $this->webconf['text_waterlitpic'] && $this->webconf['text_litpic']){ $data['litpic'] = waterwordmark($data['title'],APP_PATH.$this->webconf['text_litpic']); //存储 $filesize = round(filesize(APP_PATH.$data['litpic'])/1024,2); $pix_arr = explode('.',$data['litpic']); $pix = end($pix_arr); M('pictures')->add(['litpic'=>$data['litpic'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$this->frparam('tid'),'molds'=>$molds]); } } $data['addtime'] = isset($data['addtime']) ? $data['addtime'] : time(); $data['updatetime'] = time(); //推荐置顶热门 if(strpos($data['jzattr'],'1')!==false){ $data['istop'] = 1; }else{ $data['istop'] = 0; } if(strpos($data['jzattr'],'2')!==false){ $data['ishot'] = 1; }else{ $data['ishot'] = 0; } if(strpos($data['jzattr'],'3')!==false){ $data['istuijian'] = 1; }else{ $data['istuijian'] = 0; } if(M($molds)->update(array('id'=>$this->frparam('id')),$data)){ if($old_tags!=$data['tags']){ $a = $old_tags.$data['tags']; $new = []; $a = explode(',',$a); foreach($a as $v){ if($v!='' && !in_array($v,$new)){ $r = M('tags')->find(['keywords'=>$v]); if(!$r){ $w['keywords'] = $v; $w['newname'] = ''; $w['url'] = ''; $w['num'] = -1; $w['isshow'] = 1; $w['number'] = 1; $w['tids'] = $data['tid'] ? ','.$data['tid'].',' : ''; $w['target'] = '_blank'; M('tags')->add($w); }else{ if(strpos($old_tags,','.$v.',')===false){ if($data['tid']){ $tags_tids = $r['tids'] ? $r['tids'].$data['tid'].',' : ','.$data['tid'].','; $ww['tids'] = $tags_tids; } $ww['number'] = $r['number']+1; M('tags')->update(['keywords'=>$v],$ww); }else if(strpos($data['tags'],','.$v.',')===false && strpos($old_tags,','.$v.',')!==false){ if($data['tid']){ $tags_tids = str_replace(','.$data['tid'].',',',',$r['tids']); $ww['tids'] = $tags_tids==',' ? '' : $tags_tids; } $ww['number'] = $r['number']-1; M('tags')->update(['keywords'=>$v],$ww); } } $new[]=$v; } } } if($this->webconf['release_award_open']==1 && $data['isshow']==1){ $award = round($this->webconf['release_award'],2); $max_award = round($this->webconf['release_max_award'],2); $member_id = M($molds)->getField(['id'=>$this->frparam('id')],'member_id'); if($member_id!=0 && $award>0){ $rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$this->frparam('id'),'msg'=>JZLANG('发布奖励')]); if(!$rr){ $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG("发布奖励")."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $v){ $all_jifen+=$v['amount']; } } if($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $this->frparam('id'); $w['msg'] = JZLANG('发布奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } } } JsonReturn(array('code'=>0,'msg'=>JZLANG('修改成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('您未做任何修改,不能提交!'))); } }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('缺少ID'))); } } $this->data = M($molds)->find(array('id'=>$this->frparam('id'))); $this->molds = M('Molds')->find(array('biaoshi'=>$molds)); $this->tid = $this->data['tid']; $this->classtypetree = get_classtype_tree(); $this->classtypes = $this->classtypetree; if(file_exists(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/'.$molds.'-edit.html')){ $this->display($molds.'-edit'); }else{ $this->display('extmolds-edit'); } } public function copymolds(){ $id = $this->frparam('id'); $molds = $this->frparam('molds',1); if($id){ $data = M($molds)->find(['id'=>$id]); unset($data['id']); if(M($molds)->add($data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('复制成功!'))); exit; }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('复制失败!'))); exit; } } } //批量删除 function deleteAll(){ $data = $this->frparam('data',1); $molds = $this->frparam('molds',1); if($data!=''){ $all = M($molds)->findAll('id in('.$data.')'); if(M($molds)->delete('id in('.$data.')')){ $customurls = M('customurl')->findAll(" aid in(".$data.") and molds='".$molds."' "); M('customurl')->delete(" aid in(".$data.") and molds='".$molds."' "); $newcustomurl = []; if($customurls){ foreach($customurls as $v){ $newcustomurl[$v['aid']] = $v; } } foreach($all as $v){ $w['molds'] = $molds; $w['data'] = serialize($v); $w['title'] = '['.$v['id'].']'.$v['title']; $w['addtime'] = time(); $x = M('recycle')->add($w); if($x && $newcustomurl[$v['id']]){ $w['molds'] = 'customurl'; $w['title'] = '['.$newcustomurl['id'].']'.JZLANG('自定义链接'); $w['data'] = serialize($newcustomurl[$v['id']]); $w['addtime'] = time(); $w['aid'] = $x; M('recycle')->add($w); } } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量操作失败!'))); } } } //单一删除 function deletemolds(){ $id = $this->frparam('id'); $molds = $this->frparam('molds',1); if($id){ $data = M($molds)->find(['id'=>$id]); if(M($molds)->delete(['id'=>$id])){ $customurl = M('customurl')->find(['molds'=>$molds,'aid'=>$id]); M('customurl')->delete(['molds'=>$molds,'aid'=>$id]); $w['title'] = '['.$data['id'].']'.$data['title']; $w['molds'] = $molds; $w['data'] = serialize($data); $w['addtime'] = time(); $r = M('recycle')->add($w); if($customurl){ $w['molds'] = 'customurl'; $w['title'] = '['.$customurl['id'].']'.JZLANG('自定义链接'); $w['data'] = serialize($customurl); $w['addtime'] = time(); $w['aid'] = $r; M('recycle')->add($w); } JsonReturn(array('code'=>0,'msg'=>JZLANG('删除成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('删除失败!'))); } } } //修改排序 function editOrders(){ $field = $this->frparam('field',1); $w[$field] = $this->frparam('value',1); $molds = $this->frparam('molds',1); $r = M($molds)->update(array('id'=>$this->frparam('id')),$w); if(!$r){ JsonReturn(array('code'=>1,'info'=>JZLANG('修改失败!'))); } JsonReturn(array('code'=>0,'info'=>JZLANG('修改成功!'))); } //批量修改栏目 function changeType(){ $data = $this->frparam('data',1); $molds = $this->frparam('molds',1); $tid = $this->frparam('tid'); if($data!=''){ $list = M($molds)->findAll('id in('.$data.')'); $r = true; foreach($list as $v){ $w['tid'] = $tid; $type = M('classtype')->find(array('id'=>$tid)); $w['htmlurl'] = $type['htmlurl']; M($molds)->update(array('id'=>$v['id']),$w); if($v['ownurl']){ M('customurl')->update(['aid'=>$v['id'],'molds'=>$molds],['tid'=>$tid]); } } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功!'))); } } //批量修改推荐属性 function changeAttribute(){ $data = $this->frparam('data',1); $molds = $this->frparam('molds',1); $tj = $this->frparam('tj'); if($data && $molds){ $list = M($molds)->findAll('id in('.$data.')'); foreach($list as $v){ if(strpos($v['jzattr'],','.$tj.',')!==false){ $attr = str_replace(','.$tj.',','',$v['jzattr']); if(!$attr){ $w['jzattr'] = ''; }else{ $w['jzattr'] = ','.trim($attr,',').','; } }else{ if($v['jzattr']){ $w['jzattr'] = $v['jzattr'].$tj.','; }else{ $w['jzattr'] = ','.$tj.','; } } if(strpos($w['jzattr'],'1')!==false){ $w['istop'] = 1; }else{ $w['istop'] = 0; } if(strpos($w['jzattr'],'2')!==false){ $w['ishot'] = 1; }else{ $w['ishot'] = 0; } if(strpos($w['jzattr'],'3')!==false){ $w['istuijian'] = 1; }else{ $w['istuijian'] = 0; } M($molds)->update(array('id'=>$v['id']),$w); } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量修改成功!'))); } } //批量复制 function copyAll(){ $data = $this->frparam('data',1); $molds = $this->frparam('molds',1); if($data!=''){ $list = M($molds)->findAll('id in('.$data.')'); $r = true; foreach($list as $v){ unset($v['id']); M($molds)->add($v); } JsonReturn(array('code'=>0,'msg'=>JZLANG('批量复制成功!'))); } } //批量审核 function checkAll(){ $data = $this->frparam('data',1); $molds = $this->frparam('molds',1); if($data!=''){ if($this->frparam('isshow')==1){ $isshow = 1; }else if($this->frparam('isshow')==2){ $isshow = 0; }else{ $isshow = 2; } if($isshow==1){ $all = M($molds)->findAll('id in('.$data.')'); $award = round($this->webconf['release_award'],2); $max_award = round($this->webconf['release_max_award'],2); $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); foreach ($all as $k => $v) { if($v['isshow']!=1){ //start if($this->webconf['release_award_open']==1){ $member_id = $v['member_id']; if($member_id!=0 && $award>0){ $rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$v['id'],'msg'=>JZLANG('发布奖励')]); if(!$rr){ $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG("发布奖励")."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $vv){ $all_jifen+=$vv['amount']; } } if($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $v['id']; $w['msg'] = JZLANG('发布奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } } } //end } } } M($molds)->update('id in('.$data.')',['isshow'=>$isshow]); JsonReturn(array('code'=>0,'msg'=>JZLANG('批量审核成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('批量审核失败!'))); } } } ================================================ FILE: app/admin/c/FieldsController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/10 // +---------------------------------------------------------------------- namespace app\admin\c; use frphp\extend\Page; class FieldsController extends CommonController { function index(){ if($this->frparam('molds',1)==''){ Error(JZLANG('请选择模块!')); } if($this->frparam('ajax')){ $data = M('fields')->findAll(array('molds'=>$this->frparam('molds',1)),'orders desc'); foreach($data as &$v){ $v['isadmin'] = $v['isadmin']==1 ? JZLANG('显示') : JZLANG('隐藏'); $v['isshow'] = $v['isshow']==1 ? JZLANG('显示') : JZLANG('隐藏'); $v['ishome'] = $v['ishome']==1 ? JZLANG('显示') : JZLANG('隐藏'); $v['islist'] = $v['islist']==1 ? JZLANG('显示') : JZLANG('隐藏'); $v['issearch'] = $v['issearch']==1 ? JZLANG('显示') : JZLANG('隐藏'); $v['ismust'] = $v['ismust']==1 ? JZLANG('是') : JZLANG('否'); $v['isext'] = $v['isext']==1 ? JZLANG('是') : JZLANG('否'); switch($v['fieldtype']){ case 1: $v['fieldtypename'] = JZLANG('单行文本'); break; case 2: $v['fieldtypename'] = JZLANG('多行文本'); break; case 3: $v['fieldtypename'] = JZLANG('文本编辑器'); break; case 4: $v['fieldtypename'] = JZLANG('数字'); break; case 5: $v['fieldtypename'] = JZLANG('单图片'); break; case 6: $v['fieldtypename'] = JZLANG('多图片'); break; case 7: $v['fieldtypename'] = JZLANG('单选下拉'); break; case 8: $v['fieldtypename'] = JZLANG('多选'); break; case 9: $v['fieldtypename'] = JZLANG('单附件'); break; case 10: $v['fieldtypename'] = JZLANG('多附件'); break; case 11: $v['fieldtypename'] = JZLANG('时间戳'); break; case 12: $v['fieldtypename'] = JZLANG('单选按钮'); break; case 13: $v['fieldtypename'] = JZLANG('单选关联'); break; case 14: $v['fieldtypename'] = JZLANG('小数'); break; case 15: $v['fieldtypename'] = JZLANG('多行录入'); break; case 16: $v['fieldtypename'] = JZLANG('多选关联'); break; case 17: $v['fieldtypename'] = JZLANG('栏目'); break; case 18: $v['fieldtypename'] = JZLANG('副栏目'); break; case 19: $v['fieldtypename'] = JZLANG('系统TAG'); break; case 20: $v['fieldtypename'] = JZLANG('绑定栏目单选'); break; case 21: $v['fieldtypename'] = JZLANG('绑定栏目多选'); break; } $v['edit_url'] = U('editFields',['id'=>$v['id']]); } JsonReturn(['code'=>0,'data'=>$data,'count'=>count($data)]); } $this->molds = M('Molds')->find(array('biaoshi'=>$this->frparam('molds',1))); $this->display('fields-list'); } function addFields(){ if($this->frparam('go',1)==1){ $data['field'] = strtolower($this->frparam('field',1)); $data['molds'] = strtolower($this->frparam('molds',1)); $data['fieldname'] = $this->frparam('fieldname',1); $data['tips'] = $this->frparam('tips',1); $data['fieldtype'] = $this->frparam('fieldtype'); $data['tids'] = $this->frparam('tids',1); $data['body'] = $this->frparam('body',1); $data['orders'] = $this->frparam('orders'); $data['ismust'] = $this->frparam('ismust'); $data['isshow'] = $this->frparam('isshow'); $data['ishome'] = $this->frparam('ishome'); $data['isadmin'] = $this->frparam('isadmin'); $data['issearch'] = $this->frparam('issearch'); $data['islist'] = $this->frparam('islist'); $data['format'] = $this->frparam('format',1); $data['vdata'] = $this->frparam('vdata',1); $data['isajax'] = $this->frparam('isajax'); $data['listorders'] = $this->frparam('listorders'); $data['isext'] = $this->frparam('isext'); $data['ldfield'] = $this->frparam('ldfield',1); $data['linkfield'] = $this->frparam('linkfield',1); if($data['fieldname']=='' || $data['field']==''){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段名和字段标识不能为空!'))); } //检测是否存在该模块 if(M('Fields')->find(array('field'=>$data['field'],'molds'=>$data['molds']))){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段标识已存在!'))); } //取消保护字段,可以继续创建 if(in_array($data['field'],['sql','jzcache','jzcachetime','table','orderby','limit','ispage','notin','in','empty','notempty','fields','like','day','as','file'])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('系统保护字段,不允许创建!'))); } // $sql = "select count(*) as n from information_schema.columns where table_name = '".DB_PREFIX.$data['molds']."' and TABLE_SCHEMA='".DB_PREFIX.$data['molds']."' and column_name = '".$data['field']."'"; // $check = M()->findSql($sql); // if($check[0]['n']){ // JsonReturn(array('code'=>1,'msg'=>'字段标识已存在!')); // } $sql = 'SHOW COLUMNS FROM '.DB_PREFIX.$data['molds']; $list = M()->findSql($sql); $isgo = true; //不管存不存在,都可以创建 foreach($list as $v){ if($v['Field']==$data['field']){ $isgo = false; //JsonReturn(array('code'=>1,'msg'=>'字段标识已存在!')); } } $data['tids'] = ($data['tids']!='')?(','.$data['tids'].','):$data['tids']; $sql = "ALTER TABLE ".DB_PREFIX.$data['molds']." ADD ".$data['field']." "; $data['fieldlong'] = $this->frparam('fieldlong_'.$data['fieldtype'],1); $data['remote'] = $this->frparam('field_remote_'.$data['fieldtype']); switch($data['fieldtype']){ case 1: case 2: case 18: case 19: $sql .= "VARCHAR(".$data['fieldlong'].") default "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= ' NULL '; } break; case 3: case 15: case 6: case 10: $sql .= "TEXT default "; $sql .= ' NULL '; break; case 4: case 17: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } break; case 11: if($data['fieldlong']!=11){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,时间属性必须长度为11'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } break; case 5: case 9: $sql .= "VARCHAR(".$data['fieldlong'].") default "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " NULL "; } break; case 7: case 8: case 12: $data['body'] = $this->frparam('body_'.$data['fieldtype'],1); $sql .= "VARCHAR(".$data['fieldlong'].") default "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " NULL "; } break; case 13: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } $data['body'] = $this->frparam('molds_select',1).','.$this->frparam('molds_list_field',1); break; case 14: if(strpos($data['fieldlong'],',')===false){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,decimal字段长度格式[整数位数,小数位数]'))); } $sql .= "DECIMAL(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '".$this->frparam('body_14',1)."' NOT NULL "; } break; case 16: $sql .= "VARCHAR(".$data['fieldlong'].") DEFAULT "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " NULL "; } $data['body'] = $this->frparam('molds_select_muti',1).','.$this->frparam('molds_list_field_muti',1); break; case 20: $sql .= "VARCHAR(".$data['fieldlong'].") DEFAULT "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " NULL "; } $data['body'] = $this->frparam('molds_select_tid_muti',1).','.$this->frparam('molds_list_field_tid_muti',1); break; case 21: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } $data['body'] = $this->frparam('molds_select_tid',1).','.$this->frparam('molds_list_field_tid',1); break; } //由于已经存在,所以不需要再执行一遍SQL if($isgo){ $x = M()->runSql($sql); } $n = M('Fields')->add($data); if(!$n){ //新增字段记录失败,删除新增字段--不需要删除 //$delsql = "ALTER TABLE ".DB_PREFIX.$data['molds']." DROP COLUMN ".$data['field']; //M()->runSql($delsql); JsonReturn(array('code'=>1,'msg'=>JZLANG('字段创建成功,但是字段表记录失败,请反馈官方解决!'))); } JsonReturn(array('code'=>0,'msg'=>JZLANG('字段创建成功!'))); } $this->classtypes = $this->classtypetree; $this->molds = $this->frparam('molds',1); $this->display('fields-add'); } function editFields(){ if($this->frparam('go',1)==1){ if($this->frparam('id')){ $data['field'] = strtolower($this->frparam('field',1)); $data['molds'] = strtolower($this->frparam('molds',1)); $data['fieldname'] = $this->frparam('fieldname',1); $data['tips'] = $this->frparam('tips',1); $data['fieldtype'] = $this->frparam('fieldtype'); $data['tids'] = $this->frparam('tids',1); $data['body'] = $this->frparam('body',1); $data['orders'] = $this->frparam('orders'); $data['ismust'] = $this->frparam('ismust'); $data['isshow'] = $this->frparam('isshow'); $data['ishome'] = $this->frparam('ishome'); $data['isadmin'] = $this->frparam('isadmin'); $data['issearch'] = $this->frparam('issearch'); $data['islist'] = $this->frparam('islist'); $data['format'] = $this->frparam('format',1); $data['vdata'] = $this->frparam('vdata',1); $data['isajax'] = $this->frparam('isajax'); $data['listorders'] = $this->frparam('listorders'); $data['isext'] = $this->frparam('isext'); $data['ldfield'] = $this->frparam('ldfield',1); $data['linkfield'] = $this->frparam('linkfield',1); if($data['fieldname']=='' || $data['field']==''){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段名和字段标识不能为空!'))); } $data['tids'] = ($data['tids']!='')?(','.$data['tids'].','):$data['tids']; $old = M('Fields')->find(array('id'=>$this->frparam('id'))); $data['fieldlong'] = $this->frparam('fieldlong_'.$data['fieldtype'],1); $data['remote'] = $this->frparam('field_remote_'.$data['fieldtype']); //只是更改样式,不更改字段属性 if($old['field']==$data['field']){ //判断长度是否不同 if($data['fieldlong']!=$old['fieldlong'] || $data['vdata']!=$old['vdata']){ $sql = "ALTER TABLE ".DB_PREFIX.$old['molds']." modify column ".$old['field']." "; switch($data['fieldtype']){ case 1: case 2: case 5: case 7: case 8: case 9: case 12: case 16: case 18: case 19: case 20: $sql.=" varchar(".$data['fieldlong'].") default"; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= ' NULL '; } break; case 3: case 15: case 6: case 10: $sql .= "TEXT default "; $sql .= ' NULL '; break; case 4: case 11: case 13: case 17: case 21: $sql.=" int(".$data['fieldlong'].") default "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= ' 0 '; } break; case 14: $sql.=" decimal(".$data['fieldlong'].") default "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '".$this->frparam('body_14',1)."' NOT NULL "; } break; } $x = M()->runSql($sql); } if($data['fieldtype']==7 || $data['fieldtype']==8 || $data['fieldtype']==12 || $data['fieldtype']==14){ $data['body'] = $this->frparam('body_'.$data['fieldtype'],1); } if($data['fieldtype']==13){ $data['body'] = $this->frparam('molds_select',1).','.$this->frparam('molds_list_field',1); } if($data['fieldtype']==16){ $data['body'] = $this->frparam('molds_select_muti',1).','.$this->frparam('molds_list_field_muti',1); } if($data['fieldtype']==20){ $data['body'] = $this->frparam('molds_select_tid_muti',1).','.$this->frparam('molds_list_field_tid_muti',1); } if($data['fieldtype']==21){ $data['body'] = $this->frparam('molds_select_tid',1).','.$this->frparam('molds_list_field_tid',1); } if(M('Fields')->update(array('id'=>$this->frparam('id')),$data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('字段修改成功!'))); }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段修改失败!'))); } }else{ if(in_array($data['field'],['id','sql','jzcache','jzcachetime','table','orderby','limit','ispage','notin','in','empty','notempty','fields','like','tids','day','as','istop','istuijian','ishot','isall','file'])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('系统保护字段,不允许创建!'))); } } $sql = "ALTER TABLE ".DB_PREFIX.$old['molds']." change ".$old['field']." ".$data['field']." "; switch($data['fieldtype']){ case 1: case 2: case 5: case 9: case 18: case 19: $sql .= "VARCHAR(".$data['fieldlong'].") default "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= ' NULL '; } break; case 3: case 15: case 6: case 10: $sql .= "TEXT default "; $sql .= ' NULL '; break; case 4: case 17: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } break; case 11: if($data['fieldlong']!=11){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,时间属性必须长度为11'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } break; case 14: if(strpos($data['fieldlong'],',')===false){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对,decimal字段长度格式[整数位数,小数位数]'))); } $sql .= "DECIMAL(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '".$this->frparam('body_14',1)."' NOT NULL "; } break; case 7: case 8: case 12: $sql .= "VARCHAR(".$data['fieldlong'].") default "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= ' NULL '; } $data['body'] = $this->frparam('body_'.$data['fieldtype'],1); break; case 13: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } $data['body'] = $this->frparam('molds_select',1).','.$this->frparam('molds_list_field',1); break; case 16: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "VARCHAR(".$data['fieldlong'].") default "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= ' NULL '; } $data['body'] = $this->frparam('molds_select_muti',1).','.$this->frparam('molds_list_field_muti',1); break; case 21: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "INT(".$data['fieldlong'].") DEFAULT "; if($data['vdata']){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= " '0' NOT NULL "; } $data['body'] = $this->frparam('molds_select_tid',1).','.$this->frparam('molds_list_field_tid',1); break; case 20: if($data['fieldlong']>11 || $data['fieldlong']<=0){ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段长度不对!'))); } $sql .= "VARCHAR(".$data['fieldlong'].") default "; if($data['vdata'] || $data['vdata']==0){ $sql .= "'".$data['vdata']."'"; }else{ $sql .= ' NULL '; } $data['body'] = $this->frparam('molds_select_tid_muti',1).','.$this->frparam('molds_list_field_tid_muti',1); break; } $x = M()->runSql($sql); if(M('Fields')->update(array('id'=>$this->frparam('id')),$data)){ JsonReturn(array('code'=>0,'msg'=>JZLANG('字段修改成功!'))); exit; }else{ JsonReturn(array('code'=>1,'msg'=>JZLANG('字段修改失败!'))); exit; } } } if($this->frparam('id')){ $this->data = M('Fields')->find(array('id'=>$this->frparam('id'))); } $this->classtypes = $this->classtypetree; $this->display('fields-edit'); } function get_fields(){ $tid = $this->frparam('tid',0,0); $isext = $this->frparam('isext',0,0); $sql = array(); $molds = strtolower($this->frparam('molds',5)); $moldsdata = M('molds')->find(['biaoshi'=>$molds]); if($tid && !in_array($molds,['orders','level','level_group','tags','attr','chain','collect','collect_type','links','link_type','pictures','comment'])){ $sql[] = " (tids like '%,".$tid.",%' or tids is null) "; } $id = $this->frparam('id'); if($id){ $data = M($molds)->find(array('id'=>$id)); }else{ $data = array(); } $sql[] = " isext=".$isext; $sql[] = " molds = '".$molds."' and isadmin=1 "; $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); $l = ''; $isagree = 0; if($this->admin['isadmin']==1 || ($this->admin['isadmin']!=1 && $this->admin['ischeck']==0)){ $isagree = 1; } foreach($fields_list as $k=>$v){ if(($v['field']=='isshow' && $isagree==0) || $v['field']=='tid' || $v['field']=='id'){ continue; } if(!array_key_exists($v['field'],$data)){ //使用默认值 $data[$v['field']] = $v['vdata']; } switch($v['fieldtype']){ case 1: $l .= '
'; } $l.='
'; break; case 2: $l .= '
{fun JZLANG('0表示输出所有')}
{fun JZLANG('单位')}:{fun JZLANG('分钟')}









================================================ FILE: app/admin/t/tpl/addmenu.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本信息')}
{fun JZLANG('栏目')} {fun JZLANG('标题')} {fun JZLANG('图片')} {fun JZLANG('链接')} {fun JZLANG('打开')} {fun JZLANG('显示')} {fun JZLANG('操作')}
{fun JZLANG('新增')}









================================================ FILE: app/admin/t/tpl/admin-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
*{fun JZLANG('将会成为您唯一的登入名')}
{fun JZLANG('6到16个字符,不改请留空')}
{fun JZLANG('6到16个字符,不改请留空')}
================================================ FILE: app/admin/t/tpl/admin-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
*{fun JZLANG('将会成为您唯一的登入名')}
{fun JZLANG('6到16个字符,不改请留空')}
{fun JZLANG('6到16个字符,不改请留空')}
================================================ FILE: app/admin/t/tpl/admin-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
================================================ FILE: app/admin/t/tpl/admin.html ================================================ {include="style"} {include="edit"}
*{fun JZLANG('将会成为您唯一的登入名')}
{if($isadmin)}
{else} {/if}
{fun JZLANG('6到16个字符,不改请留空')}
{fun JZLANG('6到16个字符,不改请留空')}
================================================ FILE: app/admin/t/tpl/article-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基础')}
  • {fun JZLANG('扩展')}
  • {fun JZLANG('设置')}
{if($molds['isclasstype']==1)}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{else} {/if}
{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}









================================================ FILE: app/admin/t/tpl/article-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基础')}
  • {fun JZLANG('扩展')}
  • {fun JZLANG('设置')}
{if($molds['isclasstype']==1)}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{else} {/if}
{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}









================================================ FILE: app/admin/t/tpl/article-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search} {fun JZLANG('搜索')}
================================================ FILE: app/admin/t/tpl/attr-list.html ================================================ {include="style"}
{if(checkAction('Jzattr/addAttr'))} {/if}
================================================ FILE: app/admin/t/tpl/beifen.html ================================================ {include="style"}
{if(checkAction('Index/backup'))} {/if} {fun JZLANG('备份数:')}{fun count($lists)} {foreach $lists as $v} {php $filename_arr = explode('.php',$v); $filename = $filename_arr[0]; $dir = APP_PATH.'backup'; $filesize = filesize($dir.'/'.$filename.'.php'); for($i=1;file_exists($dir.'/'.$filename.'_v'.$i.'.php')===true;$i++){ $filesize+=filesize($dir.'/'.$filename.'_v'.$i.'.php'); } $filesize = round($filesize/1024,2).'KB'; /} {/foreach}
{fun JZLANG('数据库备份名')} {fun JZLANG('大小')} {fun JZLANG('操作')}
{$v}{$filesize} {if(strpos($v,'_v')!==false)} {else} {if(checkAction('Index/huanyuan'))} {/if} {if(checkAction('Index/shanchu'))} {/if} {/if}
================================================ FILE: app/admin/t/tpl/cache.html ================================================ {include="style"}
{$datacache} kb
{fun JZLANG('文件夹cache/data,主要是网站内容缓存,栏目,详情页等')}
{$logincache} kb
{fun JZLANG('文件夹cache/tmp,主要是服务器session文件缓存,当前session将不会被清空')}
{$logcache} kb
{fun JZLANG('文件夹cache/log,包括错误日志、支付日志、登录日志等')}
{$tplcache} kb
{fun JZLANG('文件夹cache,主要是程序执行时生成的模板编译文件')}
{$imagecache} kb
{fun JZLANG('文件夹image,主要是程序执行时生成的自定义缩略图')}
================================================ FILE: app/admin/t/tpl/chain-list.html ================================================ {include="style"}
{if(checkAction('Jzchain/delAll'))} {fun JZLANG('批量删除')} {/if} {if(checkAction('Jzchain/addchain'))} {/if}
================================================ FILE: app/admin/t/tpl/chongzhi-add.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
{fun JZLANG('兑换率指1元相当于多少钱包/积分')}
================================================ FILE: app/admin/t/tpl/chongzhi-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}


================================================ FILE: app/admin/t/tpl/classtype-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{include="content"}
{fun JZLANG('默认不需要更改')}
{fun JZLANG('填写栏目命名后,系统将自动用作该栏目URL链接,如:news,访问该栏目链接:')}{fun get_domain()}/news.html。{fun JZLANG('多个相同URL,将覆盖前面的栏目')}
{fun JZLANG('设置列表页显示的内容条数')}
{fun JZLANG('请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面。默认栏目首页')}
{fun JZLANG('请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面,列表内的详情页。')}
{fun JZLANG('填写栏目外链后,访问栏目链接将会跳到外链,不填请留空!')}
{fun JZLANG('勾选后,前台会员发布会显示该栏目')}
{fun JZLANG('模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。')}
{loop table="member_group" as="v"} {/loop}
{fun JZLANG('栏目关闭后,前台不显示,也无法访问!')}
================================================ FILE: app/admin/t/tpl/classtype-addmany.html ================================================ {include="style"}
  • {fun JZLANG('基础')}
  • {fun JZLANG('高级')}
{fun JZLANG('请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面。默认栏目首页')}
{fun JZLANG('请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面,列表内的详情页。')}
{fun JZLANG('设置列表页显示的内容条数')}
{fun JZLANG('勾选后,前台会员发布会显示该栏目')}
{fun JZLANG('模型')} {fun JZLANG('栏目名')} {fun JZLANG('栏目上级')} {fun JZLANG('栏目URL')} {fun JZLANG('列表条数')} {fun JZLANG('栏目模板')} {fun JZLANG('详情页模板')} {fun JZLANG('导航是否显示')} {fun JZLANG('排序')}
================================================ FILE: app/admin/t/tpl/classtype-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{include="content"}
{fun JZLANG('默认不需要更改')}
{fun JZLANG('填写栏目命名后,系统将自动用作该栏目URL链接,如:news,访问该栏目链接:')}{fun get_domain()}/news.html。{fun JZLANG('多个相同URL,将覆盖前面的栏目')}
{fun JZLANG('设置列表页显示的内容条数')}
{fun JZLANG('请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面。默认栏目首页')}
{fun JZLANG('请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面,列表内的详情页。')}
{fun JZLANG('填写栏目外链后,访问栏目链接将会跳到外链,不填请留空!')}
{fun JZLANG('勾选后,前台会员发布会显示该栏目')}
{fun JZLANG(' 模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。')}
{php $gids = explode(',',$data['gids']); /} {loop table="member_group" as="v"} {/loop}
{fun JZLANG('栏目关闭后,前台不显示,也无法访问!')}
================================================ FILE: app/admin/t/tpl/classtype-list.html ================================================ {include="style"}
{if(checkAction('Classtype/changeClass'))}
{/if} {if(checkAction('Classtype/addclass'))} {/if} {if(checkAction('Classtype/addmany'))} {/if}
{loop table="classtype" pid="0" orderby="orders desc" as="v"} {if($admin['classcontrol']==0 ||$admin['isadmin'] || strpos($tids,','.$v['id'].',')!==false)} {else} {/if} {/loop}
ID {fun JZLANG('排序')} {$molds['name']} {fun JZLANG('模块名')} {fun JZLANG('导航显示')} {fun JZLANG('快捷操作')} {fun JZLANG('操作')}
{$v['id']} {if(checkAction('Classtype/editClassOrders'))} {else} {$v['orders']} {/if} {fun str_repeat('   ',$v['level'])} {if($classtypedata[$v['id']]['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {$v['classname']} {$moldslist[$v['molds']]['name']} {if($v['isclose']==0)} {if(checkAction('Classtype/change_status'))} {else} {if($v['isshow']==1)} {fun JZLANG('显示')} {else} {fun JZLANG('隐藏')} {/if} {/if} {else} 已关闭 {/if} {if(checkAction('Classtype/addclass'))} {fun JZLANG('添加下级')} {/if} {if(checkAction('Fields/index'))} {fun JZLANG('字段管理')} {/if} {if($v['molds']=='article')} {if(checkAction('Article/addarticle'))} {fun JZLANG('新增文章')} {/if} {else if($v['molds']=='product')} {if(checkAction('Product/addproduct'))} {fun JZLANG('新增商品')} {/if} {else} {if($v['molds']!='message' && $v['molds']!='page')} {if(checkAction('Extmolds/addmolds/molds/'.$v['molds']))} {fun JZLANG('新增内容')} {/if} {/if} {/if} {if(checkAction('Classtype/editclass'))} {fun JZLANG('编辑')} {/if} {fun JZLANG('预览')} {if(checkAction('Classtype/deleteclass'))} {fun JZLANG('删除')} {/if} {if($v['isshow']==1)} {fun JZLANG('显示')} {else} {fun JZLANG('隐藏')} {/if} - -
================================================ FILE: app/admin/t/tpl/collect-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('数字越大越靠前')}









================================================ FILE: app/admin/t/tpl/collect-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('数字越大越靠前')}









================================================ FILE: app/admin/t/tpl/collect-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
{if(checkAction('Collect/deleteAll'))} {fun JZLANG('批量删除')} {/if} {if(checkAction('Collect/addcollect'))} {fun JZLANG('新增图片')} {/if} {if(checkAction('Collect/collectType'))} {fun JZLANG('分类列表')} {/if} {if(checkAction('Collect/collectTypeAdd'))} {fun JZLANG('添加分类')} {/if} {fun JZLANG('共有数据:')}{$sum} {fun JZLANG('条')}
{foreach $fields_list as $v} {/foreach} {foreach $lists as $v} {foreach $fields_list as $vv} {/foreach} {/foreach}
ID {fun JZLANG('排序')} {fun JZLANG('标题')} {fun JZLANG('图片')} {fun JZLANG('所属分类')} {$v['fieldname']} {fun JZLANG('长')} {fun JZLANG('宽')} {fun JZLANG('是否显示')} {fun JZLANG('时间')} {fun JZLANG('操作')}
{$v['id']} {$v['orders']} {fun newstr($v['title'],30)} {fun get_info_table('collect_type',array('id'=>$v['tid']),'name')} {fun format_fields($vv,$v[$vv['field']])} {$v['h']} {$v['w']} {if($v['isshow']==1)}{fun JZLANG('显示')}{else}{fun JZLANG('不显示')}{/if} {fun date('Y-m-d H:i:s',$v['addtime'])} {if(checkAction('Collect/editcollect'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Collect/deletecollect'))} {fun JZLANG('删除')} {/if} {if(checkAction('Collect/copycollect'))} {fun JZLANG('复制')} {/if}
{$pages}
================================================ FILE: app/admin/t/tpl/collecttype-add.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
================================================ FILE: app/admin/t/tpl/collecttype-edit.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
================================================ FILE: app/admin/t/tpl/collecttype-list.html ================================================ {include="style"}
{fun JZLANG('返回列表')} {if(checkAction('Collect/collectTypeAdd'))} {fun JZLANG('添加分类')} {/if} {foreach $lists as $v} {/foreach}
ID {fun JZLANG('分类名')} {fun JZLANG('时间')} {fun JZLANG('操作')}
{$v['id']} {$v['name']} {fun date('Y-m-d H:i:s',$v['addtime'])} {if(checkAction('Collect/collectTypeEdit'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Collect/collectTypeDelete'))} {fun JZLANG('删除')} {/if}
================================================ FILE: app/admin/t/tpl/comment-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('同属于一个评论的ID,如果没有评论中的评论,则为0')}
{fun JZLANG('回复帖子ID')}
{include="content"}
{fun JZLANG('只能管理员删除评论,用户只能软删除评论')}









================================================ FILE: app/admin/t/tpl/comment-details.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('同属于一个评论的ID,如果没有评论中的评论,则为0')}
{fun JZLANG('回复帖子ID')}
{include="content"}
{fun JZLANG('只能管理员删除评论,用户只能软删除评论')}









================================================ FILE: app/admin/t/tpl/comment-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
================================================ FILE: app/admin/t/tpl/common/content.html ================================================
{if($data)} {else} {/if}
================================================ FILE: app/admin/t/tpl/common/edit.html ================================================ ================================================ FILE: app/admin/t/tpl/common/fields.html ================================================ $(function(){ $(document).on('click','.delete_file',function(){ //删除页面信息 $(this).parent().remove(); }) $(document).on("click",".layui-sys-icon",function(){ var fclass = $(this).attr('data-field'); layer.tips($(this).attr('data-info'), '.'+fclass); }) $(document).on("mouseover",".layui-sys-icon",function(){ var fclass = $(this).attr('data-field'); layer.tips($(this).attr('data-info'), '.'+fclass); }) }) function get_fields(tid,id){ var id = arguments[1]?arguments[1]:0; $.post("{fun U('Fields/get_fields')}",{molds:'{$fields_biaoshi}',tid:tid,id:id},function(r){ $("#content_fields").html(r); }); } function get_fields_ext(tid,id){ var id = arguments[1]?arguments[1]:0; $.post("{fun U('Fields/get_fields')}",{molds:'{$fields_biaoshi}',tid:tid,id:id,isext:1},function(r){ $("#ext_fields").html(r); }); } function deleteImage_auto(elm,field){ $(elm).prev().attr("src", "{__Tpl_style__}/style/images/nopic.jpg"); $('#'+field).val(""); } function goleft(a){ var str = $(a).parent().parent().parent().attr('class'); var arr = $("."+str+" .upload-icon-img").toArray(); var index = $('.'+str+' .upload-icon-img').index($(a).closest('.upload-icon-img')); var temp; if(index-1>=0){ temp = arr[index]; arr[index] = arr[index-1]; arr[index-1] = temp; $(a).parent().parent().parent().html(arr) } } function goright(a){ var str = $(a).parent().parent().parent().attr('class'); var arr = $("."+str+" .upload-icon-img").toArray(); var index = $('.'+str+' .upload-icon-img').index($(a).closest('.upload-icon-img')); var temp; if(index+1 $(function(){ /* var interval = setInterval(function(){ $.ajax({ url:"{fun U('Index/update_session_maxlifetime')}",//请求的url地址 dataType:"json",//返回格式为json async:true,//请求是否异步,默认为异步,这也是ajax重要特性 data:{},//参数值 type:"GET",//请求方式 beforeSend:function(){ //请求前的处理 }, success:function(r){ //请求成功时处理 console.log(r); }, complete:function(){ //请求完成的处理 }, error:function(){ //请求出错处理 } }) },30000); */ }) ================================================ FILE: app/admin/t/tpl/common/style.html ================================================ {fun webConf('web_name')} {php switch($webconf['admintpl']){ case 'tpl': echo ''; break; case 'default': echo ''; break; } /} ================================================ FILE: app/admin/t/tpl/common/uediter.php ================================================

'.$v['title'].'

'; }else{ $html = '
'; return $html; } ================================================ FILE: app/admin/t/tpl/ctype.html ================================================ {include="style"} {include="edit"}
  • {$ctypedata['title']}
  • {if($admin['gid']==1)}
  • {fun JZLANG('自定义配置')}
  • {/if}
{loop table="sysconfig" typeid="$ctypedata['id']" orderby="orders desc,id asc" as="v"} {if($v['type']==1)}
{if($v['tip'])} {/if} {if($admin['gid']==1)}
{!--$webconf['{$v['field']}']--}
{if($v['sys']!=1)}
{/if} {/if}
{else if($v['type']==2)}
{if($v['tip'])} {/if} {if($admin['gid']==1)}
{!--$webconf['{$v['field']}']--}
{if($v['sys']!=1)}
{/if} {/if}
{else if($v['type']==3)}
{if($admin['gid']==1)}
{/if} {if($v['sys']!=1 && $admin['gid']==1)}
{/if}
{else if($v['type']==4)} {php $edit = require(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/common/uediter.php'); echo $edit; /} {if($admin['gid']==1)}
{!--$webconf['{$v['field']}']--}
{if($v['sys']!=1)}
{/if} {/if} {else if($v['type']==5)}
{if($v['tip'])} {/if} {if($admin['gid']==1)}
{!--$webconf['{$v['field']}']--}
{if($v['sys']!=1)}
{/if} {/if}
{else if($v['type']==6)}
{if($v['tip'])} {/if} {if($admin['gid']==1)}
{!--$webconf['{$v['field']}']--}
{if($v['sys']!=1)}
{/if} {/if}
{else if($v['type']==7)}
{if($v['tip'])} {/if} {if($admin['gid']==1)}
{!--$webconf['{$v['field']}']--}
{if($v['sys']!=1)}
{/if} {/if}
{else if($v['type']==8)}
{if($admin['gid']==1)}
{/if} {if($v['sys']!=1 && $admin['gid']==1)}
{/if}
{/if} {/loop} {if($v['id']>7 && $admin['gid']==1)}
{/if}
{if($admin['gid']==1)}
{fun JZLANG('自定义配置')}


{/if}
================================================ FILE: app/admin/t/tpl/datacache.html ================================================ {include="style"}
{if(checkAction('sys/addcache'))} {/if}

{fun JZLANG('调用方式')}

{!--php $jzdata=jzcachedata('碎片标识');/--}

{!--foreach $jzdata as $v--}

{fun JZLANG('这里输出想要的内容,如:')}{!--$v['title']--}

{!--/foreach--}

{foreach $lists as $v} {/foreach}
ID {fun JZLANG('碎片名称')} {fun JZLANG('碎片标识')} {fun JZLANG('更新周期')} {fun JZLANG('操作')}
{$v['id']} {$v['title']} {$v['field']} {$v['times']}{fun JZLANG('分钟')} {if(checkAction('sys/viewcache'))} {fun JZLANG('查看SQL')} {/if} {if(checkAction('sys/editcache'))} {fun JZLANG('编辑')} {/if} {if(checkAction('sys/delcache'))} {fun JZLANG('删除')} {/if}
================================================ FILE: app/admin/t/tpl/desktop-add.html ================================================ {include="style"}
{fun JZLANG('系统默认指没有指定桌面配置的管理员,进入后台后默认的配置')}









================================================ FILE: app/admin/t/tpl/desktop-edit.html ================================================ {include="style"}
{fun JZLANG('系统默认指没有指定桌面配置的管理员,进入后台后默认的配置')}









================================================ FILE: app/admin/t/tpl/desktop.html ================================================ {include="style"}
{if(checkAction('Index/desktop_add'))} {/if} {fun JZLANG('共有数据:')}{$sum} {fun JZLANG('条')} {foreach $lists as $v} {/foreach}
ID {fun JZLANG('桌面名称')} {fun JZLANG('适用角色')} {fun JZLANG('系统')} {fun JZLANG('是否默认')} {fun JZLANG('备注')} {fun JZLANG('操作')}
{$v['id']} {$v['name']} {if($v['gid']==0)}{fun JZLANG('所有角色')}{else}{fun get_info_table('level_group',array('id'=>$v['gid']),'name')} {/if} {if($v['sys']==1)}{fun JZLANG('是')}{else}{fun JZLANG('否')}{/if} {if($v['isdefault']==1)}{fun JZLANG('是')}{else}{fun JZLANG('否')}{/if} {$v['ext']} {if(checkAction('Index/desktop_edit'))} {/if} {if(checkAction('Index/desktop_del'))} {/if}
{$pages}
================================================ FILE: app/admin/t/tpl/editcache.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本信息')}

{fun JZLANG('使用说明')}

1. {fun JZLANG('指定几个id或者几个tid的内容输出(栏目:不限制栏目)')}

{fun JZLANG('SQL中输入:')} id in(1,2,3) {fun JZLANG('或者')} tid in(2,3,4)

2. {fun JZLANG('模糊查询,查询标题跟 “网站建设” 相关的内容')}

{fun JZLANG('SQL中输入: ')}title like '%网站建设%'

3. {fun JZLANG('模糊查询,查询标题/内容跟 “网站建设” 相关的内容')}

{fun JZLANG('SQL中输入:')} (title like '%网站建设%' or body like '%网站建设%' )

4. {fun JZLANG('不支持联表查询')}

5. {fun JZLANG('注意字符串都要使用英文单引号')}

{fun JZLANG('如: ')} title='网站建设'

{fun JZLANG('建议英文,不要重复')}
{fun JZLANG('0表示输出所有')}
{fun JZLANG('单位:分钟')}









================================================ FILE: app/admin/t/tpl/editmenu.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本信息')}
{if(count($data['nav']))} {foreach $data['nav'] as $s} {/foreach} {else} {/if}
{fun JZLANG('栏目')} {fun JZLANG('标题')} {fun JZLANG('图片')} {fun JZLANG('链接')} {fun JZLANG('打开')} {fun JZLANG('显示')} {fun JZLANG('操作')}
{fun JZLANG('删除')} {fun JZLANG('新增')}
{fun JZLANG('新增')}









================================================ FILE: app/admin/t/tpl/extmolds-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{if($molds['isclasstype']==1)}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{else} {/if}









================================================ FILE: app/admin/t/tpl/extmolds-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{if($molds['isclasstype']==1)}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{else} {/if}









================================================ FILE: app/admin/t/tpl/extmolds-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
================================================ FILE: app/admin/t/tpl/fields-add.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
  • {if($molds=='level')}
  • {fun JZLANG('角色绑定')}
  • {else}
  • 栏{fun JZLANG('目绑定')}
  • {/if}
{fun JZLANG('简短的名称')}
{fun JZLANG('只能英文字母[或者后面+数字],必须含有英文字母,小写字母,简短')}
{fun JZLANG('选择')} {fun JZLANG('内容')} {fun JZLANG('说明')}
{fun JZLANG('单行文本')}
{fun JZLANG('多行文本')}
{fun JZLANG('带编辑器文本')}
{fun JZLANG('可以在页面动态新增内容输入框')}
{fun JZLANG('只能填写数字,长度不能超过11位')}
{fun JZLANG('金钱,小数等,保留2位')}
{fun JZLANG('时间日期')}
{fun JZLANG('单图片')}
{fun JZLANG('多图片,图集')}
{fun JZLANG('单项选择,下拉选择,如:红=1,黄=2,蓝=3')}
{fun JZLANG('单项选择,按钮选择,如:红=1,黄=2,蓝=3')}
{fun JZLANG('多项选择,如:红=1,黄=2,蓝=3')}
{fun JZLANG('一个附件,压缩包,Excel,Word文档')}
{fun JZLANG('多个附件,压缩包,Excel,Word文档')}
{fun JZLANG('单选关联,可以直接调用关联模块内容列表,列表显示对应字段内容')}
{fun JZLANG('多选关联,可以直接调用关联模块内容列表,列表显示对应字段内容')}
{fun JZLANG('栏目关联单选,可以直接绑定某个栏目下的内容,包括子栏目')}
{fun JZLANG('栏目关联多选,可以直接绑定某个栏目下的多个内容,包括子栏目')}
{fun JZLANG('系统栏目,不可修改')}
{fun JZLANG('系统副栏目,不可修改')}
{fun JZLANG('系统TAG,不可修改')}
{fun JZLANG('默认字段值,不填默认int类型的值是0,string类型的值是null。多选参数的值是两边带【,】,如【,1,】表示值为1')}
{fun JZLANG('用于填写时的提示信息,50字以内')}
{fun JZLANG('数字越大越靠前')}
{fun JZLANG('带有文本框编辑器的除外')}
{fun JZLANG('仅用于后台列表头部带有该字段搜索')}
{fun JZLANG('仅用于后台列表显示该字段')}
{fun JZLANG('仅用于后台列表显示该字段内容处理')}
{fun JZLANG('由于本系统对json数据封装,限制访问可以提高安全性')}
{fun JZLANG('填写联动字段,可以关联多个,用|分隔')}
{if($molds=='level')} {php if($admin['gid']!=1){ $levelgroup = M('level_group')->findAll('id!=1'); }else{ $levelgroup = M('level_group')->findAll(); } $levelgroup = set_class_haschild($levelgroup); $levelgroup = getTree($levelgroup); /} {foreach $levelgroup as $v} {/foreach}
{fun JZLANG('角色名')}
{fun str_repeat('   ',$v['level'])} {if($v['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {$v['name']}
{else} {foreach $classtypes as $v} {if($v['molds']==$molds || $molds=='classtype')} {/if} {/foreach}
{fun JZLANG('栏目名')}
{fun str_repeat('   ',$v['level'])} {if($v['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {$v['classname']}
{/if}
================================================ FILE: app/admin/t/tpl/fields-edit.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
  • {if($data['molds']=='level')}
  • {fun JZLANG('角色绑定')}
  • {else}
  • {fun JZLANG('栏目绑定')}
  • {/if}
{fun JZLANG('简短的名称')}
{fun JZLANG('只能英文字母[或者后面+数字],必须含有英文字母,小写字母,简短')}
{fun JZLANG('选择')} {fun JZLANG('内容')} {fun JZLANG('说明')}
{fun JZLANG('单行文本')}
{fun JZLANG('多行文本')}
{fun JZLANG('带编辑器文本')}
{fun JZLANG('可以在页面动态新增内容输入框')}
{fun JZLANG('只能填写数字,长度不能超过11位')}
{fun JZLANG('金钱,小数等,保留2位')}
{fun JZLANG('时间日期')}
{fun JZLANG('单图片')}
{fun JZLANG('多图片,图集')}
{fun JZLANG('单项选择,下拉选择,如:红=1,黄=2,蓝=3')}
{fun JZLANG('单项选择,按钮选择,如:红=1,黄=2,蓝=3')}
{fun JZLANG('多项选择,如:红=1,黄=2,蓝=3')}
{fun JZLANG('一个附件,压缩包,Excel,Word文档')}
{fun JZLANG('多个附件,压缩包,Excel,Word文档')}
{if($data['fieldtype']==13)} {php $vdata = explode(',',$data['body']) /} {else} {/if}
{fun JZLANG('关联模块内容ID')}
{if($data['fieldtype']==16)} {php $vdata = explode(',',$data['body']) /} {else} {/if}
{fun JZLANG('多选关联,可以直接调用关联模块内容列表,列表显示对应字段内容')}
{if($data['fieldtype']==21)} {php $vdata = explode(',',$data['body']) /} {else} {/if}
{fun JZLANG('栏目关联单选,关联模块内容ID')}
{if($data['fieldtype']==20)} {php $vdata = explode(',',$data['body']) /} {else} {/if}
{fun JZLANG('栏目关联多选,关联多个模块内容ID')}
{if($data['fieldtype']==17)}{$data['fieldlong']}{else}11{/if}
{fun JZLANG('系统栏目,不可修改')}
{if($data['fieldtype']==18)}{$data['fieldlong']}{else}255{/if}
{fun JZLANG('系统副栏目,不可修改')}
{if($data['fieldtype']==19)}{$data['fieldlong']}{else}255{/if}
{fun JZLANG('系统TAG,不可修改')}
{fun JZLANG('默认字段值,不填默认int类型的值是0,string类型的值是null。多选参数的值是两边带【,】,如【,1,】表示值为1')}
{fun JZLANG('用于填写时的提示信息,50字以内')}
{fun JZLANG('数字越大越靠前')}
{fun JZLANG('仅用于后台列表头部带有该字段搜索')}
{fun JZLANG('仅用于后台列表显示该字段')}
{fun JZLANG('仅用于后台列表显示该字段内容处理')}
{fun JZLANG('由于本系统对json数据封装,限制访问可以提高安全性')}
{fun JZLANG('填写联动字段,可以关联多个,用|分隔')}
{if($data['molds']=='level')} {php if($admin['gid']!=1){ $levelgroup = M('level_group')->findAll('id!=1'); }else{ $levelgroup = M('level_group')->findAll(); } $levelgroup = set_class_haschild($levelgroup); $levelgroup = getTree($levelgroup); /} {foreach $levelgroup as $v} {/foreach}
{fun JZLANG('角色名')}
{fun str_repeat('   ',$v['level'])} {if($v['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {$v['name']}
{else} {foreach $classtypes as $v} {if($v['molds']==$data['molds'] || $data['molds']=='classtype')} {/if} {/foreach}
{fun JZLANG('栏目名')}
{fun str_repeat('   ',$v['level'])} {if($v['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {$v['classname']}
{/if}
================================================ FILE: app/admin/t/tpl/fields-list-show.html ================================================ {include="style"}
{fun JZLANG('温馨提示:排序和宽度在列表点击也可以更改。')}
{fun JZLANG('排序:当前列表显示排序,不会影响录入排序,越大越靠前。')}
{fun JZLANG('搜索:在列表顶部的搜索中,可以搜索该字段。')}
{fun JZLANG('宽度:列表显示的宽度。由于屏幕宽度问题,可以根据自己关注的字段在列表中显示更清晰,默认100。')}
================================================ FILE: app/admin/t/tpl/fields-list.html ================================================ {include="style"}
{if(checkAction('Fields/addFields'))} {fun JZLANG('新增字段')} {/if}
================================================ FILE: app/admin/t/tpl/getchildren.html ================================================ {foreach $lists as $v}
{$v['id']} {if(checkAction('Classtype/editClassOrders'))} {else} {$v['orders']} {/if} {fun str_repeat('   ',$v['level'])} {if($classtypedata[$v['id']]['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {$v['classname']} {$moldslist[$v['molds']]['name']} {if($admin['classcontrol']==0 ||$admin['isadmin'] || strpos($tids,','.$v['id'].',')!==false)} {if($v['isclose']==0)} {if(checkAction('Classtype/change_status'))} {else} {if($v['isshow']==1)} {fun JZLANG('显示')} {else} {fun JZLANG('隐藏')} {/if} {/if} {else} 已关闭 {/if} {if(checkAction('Classtype/addclass'))} {fun JZLANG('添加下级')} {/if} {if(checkAction('Fields/index'))} {fun JZLANG('字段管理')} {/if} {if($v['molds']=='article')} {if(checkAction('Article/addarticle'))} {fun JZLANG('新增文章')} {/if} {else if($v['molds']=='product')} {if(checkAction('Product/addproduct'))} {fun JZLANG('新增商品')} {/if} {else} {if($v['molds']!='message' && $v['molds']!='page')} {if(checkAction('Extmolds/addmolds/molds/'.$v['molds']))} {fun JZLANG('新增内容')} {/if} {/if} {/if} {if(checkAction('Classtype/editclass'))} {fun JZLANG('编辑')} {/if} {fun JZLANG('预览')} {if(checkAction('Classtype/deleteclass'))} {fun JZLANG('删除')} {/if} {else} {if($v['isshow']==1)} {fun JZLANG('显示')} {else} {fun JZLANG('隐藏')} {/if} - - {/if} {/foreach} ================================================ FILE: app/admin/t/tpl/group-add.html ================================================ {include="style"}
{if($admin['gid']==1)}
{fun JZLANG('超级管理员拥有无上权利,无视下面权限限制')}
{else} {/if}
{fun JZLANG('超级管理员除外,发布的内容是否需要审核')}
{fun JZLANG('是否设置栏目权限,默认不设置。开启后下面的栏目权限设置才有效')}
{foreach $classtypetree as $v} {if($v['pid']==0)} {/if} {/foreach}
{fun JZLANG('顶级栏目')} {fun JZLANG('子栏目')}
{php $children = get_children($v,$classtypetree,5);/} {foreach $children as $vv} {/foreach}
{foreach $ruler_top as $v} {/foreach}
{fun JZLANG('主模块')} {fun JZLANG('子模块')}
{foreach $ruler_children[$v['id']] as $vv} {/foreach}
{fun JZLANG('关闭后,该分组管理员将不能登录')}
================================================ FILE: app/admin/t/tpl/group-edit.html ================================================ {include="style"}
{if($admin['gid']==1)}
{fun JZLANG('超级管理员拥有无上权利,无视下面权限限制')}
{else} {/if}
{fun JZLANG('超级管理员除外,发布的内容是否需要审核')}
{fun JZLANG('是否设置栏目权限,默认不设置。开启后下面的栏目权限设置才有效')}
{foreach $classtypetree as $v} {if($v['pid']==0)} {/if} {/foreach}
{fun JZLANG('顶级栏目')} {fun JZLANG('子栏目')}
{php $children = get_children($v,$classtypetree,5);/} {foreach $children as $vv} {/foreach}
{foreach $ruler_top as $v} {/foreach}
{fun JZLANG('主模块')} {fun JZLANG('子模块')}
{foreach $ruler_children[$v['id']] as $vv} {/foreach}
{fun JZLANG('关闭后,该分组管理员将不能登录')}
================================================ FILE: app/admin/t/tpl/group-list.html ================================================ {include="style"}
{if(checkAction('Admin/groupadd'))} {fun JZLANG('添加角色')} {/if} {fun JZLANG('共有数据:')}{$sum} {fun JZLANG('条')} {foreach $lists as $v} {else} {if($v['isagree']==1)} {fun JZLANG('正常')} {else} {fun JZLANG('封禁')} {/if} {/if} {/foreach}
ID {fun JZLANG('角色名')} {fun JZLANG('描述')} {fun JZLANG('状态')} {fun JZLANG('操作')}
{$v['id']} {$v['name']} {$v['description']} {if(checkAction('Admin/change_group_status'))} {if(checkAction('Admin/groupedit'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Admin/group_del'))} {fun JZLANG('删除')} {/if}
{$pages}
================================================ FILE: app/admin/t/tpl/index.html ================================================ {include="style"}
{if($top_num>0)} {/if}
  • {fun JZLANG('我的桌面')}
  • {fun JZLANG('关闭当前')}
  • {fun JZLANG('关闭其他')}
  • {fun JZLANG('关闭所有')}
{include="footer"} ================================================ FILE: app/admin/t/tpl/links-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}









================================================ FILE: app/admin/t/tpl/links-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本信息')}









================================================ FILE: app/admin/t/tpl/links-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
================================================ FILE: app/admin/t/tpl/linktype-add.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
================================================ FILE: app/admin/t/tpl/linktype-edit.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
================================================ FILE: app/admin/t/tpl/linktype-list.html ================================================ {include="style"}
{if(checkAction('Links/linktypeadd'))} {fun JZLANG('添加分类')} {/if} {foreach $lists as $v} {/foreach}
ID {fun JZLANG('分类名')} {fun JZLANG('时间')} {fun JZLANG('操作')}
{$v['id']} {$v['name']} {fun date('Y-m-d H:i:s',$v['addtime'])} {if(checkAction('Links/linktypeedit'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Links/linktypedelete'))} {fun JZLANG('删除')} {/if}
================================================ FILE: app/admin/t/tpl/login.html ================================================ {include="style"} ================================================ FILE: app/admin/t/tpl/loginlog.html ================================================ {include="style"}
================================================ FILE: app/admin/t/tpl/member-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('6到16个字符')}
================================================ FILE: app/admin/t/tpl/member-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{fun JZLANG('6到16个字符,不修改请留空')}
================================================ FILE: app/admin/t/tpl/member-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
================================================ FILE: app/admin/t/tpl/membergroup-add.html ================================================ {include="style"}
{foreach $ruler_top as $v} {/foreach}
{fun JZLANG('主模块')} {fun JZLANG('子模块')}
{if(isset($ruler_children[$v['id']]))} {foreach $ruler_children[$v['id']] as $vv} {/foreach} {/if}
{fun JZLANG('百分比折扣请填写0.01-1之间的小数(如5折,填0.5),无折扣时,该参数设置无效')}
================================================ FILE: app/admin/t/tpl/membergroup-edit.html ================================================ {include="style"}
{foreach $ruler_top as $v} {/foreach}
{fun JZLANG('主模块')} {fun JZLANG('子模块')}
{if(isset($ruler_children[$v['id']]))} {foreach $ruler_children[$v['id']] as $vv} {/foreach} {/if}
{fun JZLANG('百分比折扣请填写0.01-1之间的小数(如5折,填0.5),无折扣时,该参数设置无效')}
================================================ FILE: app/admin/t/tpl/membergroup-list.html ================================================ {include="style"}
{if(checkAction('Member/groupadd'))} {fun JZLANG('添加分组')} {/if} {if($webconf['isopenhomepower']==0)}{fun JZLANG('温馨提示:前台权限已关闭,设置权限不会生效。')}{else}{fun JZLANG('温馨提示:前台权限已开启,权限设置将直接影响前台访问,请谨慎操作!')}{/if} {foreach $fields_list as $v} {/foreach} {foreach $lists as $v} {foreach $fields_list as $vv} {/foreach} {/foreach}
ID {fun JZLANG('排序')} {fun JZLANG('分组名')} {fun JZLANG('描述')}{$v['fieldname']}{fun JZLANG('状态')} {fun JZLANG('操作')}
{$v['id']} {fun str_repeat('   ',$v['level'])} {if($v['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {$v['name']} {$v['description']}{$v[$vv['field']]} {if(checkAction('Member/change_group_status'))} {else} {if($v['isagree']==1)} {fun JZLANG('正常')} {else} {fun JZLANG('封禁')} {/if} {/if} {if(checkAction('Member/groupedit'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Member/group_del'))} {fun JZLANG('删除')} {/if}
================================================ FILE: app/admin/t/tpl/menu.html ================================================ {include="style"}
{if(checkAction('index/addmenu'))} {/if}
{foreach $lists as $v} {/foreach}
ID {fun JZLANG('导航名称')} {fun JZLANG('导航菜单')} {fun JZLANG('显示')} {fun JZLANG('操作')}
{$v['id']} {$v['name']} {php $nav = unserialize($v['nav']); /} {foreach $nav as $vv} {if($vv['tid'])} {if($vv['title'])}{$vv['title']}{else}{$classtypedata[$vv['tid']]['classname']}{/if} {else} {$vv['title']} {/if} {/foreach} {if($v['isshow']==1)}{fun JZLANG('显示')}{else}{fun JZLANG('隐藏')}{/if} {if(checkAction('index/editmenu'))} {fun JZLANG('编辑')} {/if} {if(checkAction('index/delmenu'))} {fun JZLANG('删除')} {/if}
================================================ FILE: app/admin/t/tpl/message-details.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本')}
  • {fun JZLANG('扩展')}
{if($molds['isclasstype']==1)}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{else} {/if}









================================================ FILE: app/admin/t/tpl/message-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
================================================ FILE: app/admin/t/tpl/molds-add.html ================================================ {include="style"}
{fun JZLANG('必须是英文字母,且不能是已存在的标识,标识即是数据库里的表名')}
{fun JZLANG('新增修改内容时必选')}
{fun JZLANG('列表展示、录入内容、修改内容三个页面是否展示栏目')}
{fun JZLANG('不同角色可以通过控制栏目权限来限制查看内容')}
{fun JZLANG('栏目绑定时是否显示该模型')}
{fun JZLANG('前台是否允许发布')}
{fun JZLANG('默认列表模板')}
{fun JZLANG('默认详情模板')}
{fun JZLANG('数值越小越靠前')}
{fun JZLANG('如果数据库已经有这个表了,就选择"是",否则就选"不是"')}
{fun JZLANG('如果后台无法预览,则选择 “否” ,列表中将不会出现 [预览]')}









================================================ FILE: app/admin/t/tpl/molds-edit.html ================================================ {include="style"}
{fun JZLANG('必须是英文字母,且不能是已存在的标识,标识即是数据库里的表名')}
{fun JZLANG('新增修改内容时必选')}
{fun JZLANG('列表展示、录入内容、修改内容三个页面是否展示栏目')}
{fun JZLANG('不同角色可以通过控制栏目权限来限制查看内容')}
{fun JZLANG('栏目绑定时是否显示该模型')}
{fun JZLANG('前台是否允许发布')}
{fun JZLANG('默认列表模板')}
{fun JZLANG('默认详情模板')}
{fun JZLANG('数值越小越靠前')}
{fun JZLANG('如果后台无法预览,则选择 “否” ,列表中将不会出现 [预览]')}









================================================ FILE: app/admin/t/tpl/molds-list.html ================================================ {include="style"}
{if(checkAction('Molds/addMolds'))} {fun JZLANG('新增模型')} {/if} {fun JZLANG('共有数据:')}{$sum} {fun JZLANG('条')} {foreach $lists as $v} {/foreach}
ID {fun JZLANG('排序')} {fun JZLANG('模型名称')} {fun JZLANG('模型标识')} {fun JZLANG('前台发布')} {fun JZLANG('模型状态')} {fun JZLANG('模型分类')} {fun JZLANG('操作')}
{$v['id']} {$v['orders']} {fun JZLANG($v['name'])} {$v['biaoshi']} {if($v['ishome']==0)} {fun JZLANG('隐藏')} {else} {fun JZLANG('允许')} {/if} {if($v['isopen']==0)} {fun JZLANG('已停用')} {else} {fun JZLANG('已启用')} {/if} {if($v['sys']==1)}{fun JZLANG('系统')}{else}{fun JZLANG('扩展')}{/if} {if(checkAction('Molds/editMolds'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Fields/index'))} {fun JZLANG('字段管理')} {/if} {if(checkAction('Molds/deleteMolds'))} {fun JZLANG('删除')} {/if} {if( (in_array($v['biaoshi'],['article','product']) || $v['sys']==0) && checkAction('Molds/restrucFields'))} {fun JZLANG('重构字段')} {/if}
{$pages}
================================================ FILE: app/admin/t/tpl/order-details.html ================================================ {include="style"}
{if($admin['gid']==1)}
{/if}
{php $body = explode('||',$data['body'])/} M($type['molds'])->find(['id'=>$d[1]]),'num'=>$d[2],'price'=>$d[3],'tid'=>$d[0]]; }else{ $new[]=['info'=>false,'num'=>$d[2],'price'=>$d[3],'tid'=>$d[0]]; } } } ?> {foreach $new as $v} {if($v['info'])} {else} {/if} {/foreach}
{fun JZLANG('主图')} {fun JZLANG('商品')} {fun JZLANG('价格')} {fun JZLANG('购买数量')} {fun JZLANG('总价')}
{$v['info']['title']} {fun JZLANG('¥')}{$v['price']}{fun JZLANG('元')} {$v['num']} {fun JZLANG('¥')}{$v['price']*$v['num']}{fun JZLANG('元')}
[{fun JZLANG('商品已删除')}] [{fun JZLANG('商品已删除')}] {fun JZLANG('¥')}{$v['price']}{fun JZLANG('元')} {$v['num']} {fun JZLANG('¥')}{$v['price']*$v['num']}{fun JZLANG('元')}
{fun JZLANG('收货信息:')} {fun JZLANG('收件人:')}{$data['receive_username']}{fun JZLANG('联系手机:')}{$data['receive_tel']}{fun JZLANG('联系邮箱:')}{$data['receive_email']}{fun JZLANG('收货地址:')}{$data['receive_address']}
{fun JZLANG('折扣:')} -{fun JZLANG('¥')}{$data['discount']}{fun JZLANG('元')}
{fun JZLANG('运费:')} +{fun JZLANG('¥')}{$data['yunfei']}{fun JZLANG('元')}
{fun JZLANG('合计:')} {fun JZLANG('¥')}{$data['price']-$data['discount']+$data['yunfei']}{fun JZLANG('元')}
{fun JZLANG('订单更改为‘已出货’,点‘确定修改’后,将发送一封邮件通知客户。订单未变化状态则不会发送邮件')}
================================================ FILE: app/admin/t/tpl/order-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}


{$fields_search}
================================================ FILE: app/admin/t/tpl/pictures.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{fun JZLANG('批量删除')} {fun JZLANG('共有数据:')}{$sum} {fun JZLANG('条')} {foreach $lists as $v} {/foreach}
ID {fun JZLANG('上传前台')} {fun JZLANG('缩略图')} {fun JZLANG('所属栏目')} {fun JZLANG('所属模块')} {fun JZLANG('本地文件')} {fun JZLANG('文件大小')} {fun JZLANG('添加时间')} {fun JZLANG('操作')}
{$v['id']} {if($v['path']=='Home')}{fun JZLANG('前台')}{else}{fun JZLANG('后台')}{/if} {if(in_array($v['filetype'],['png','gif','jpg','jpeg']))}{else}{$v['filetype']}{/if} {if($v['tid']==0)}-{else}{$classtypedata[$v['tid']]['classname']}{/if} {if($v['molds']=='' || empty($v['molds']))}{fun JZLANG('其他')}{else}{if($v['molds']=='sysconfig')}{fun JZLANG('系统配置')}{else}{fun get_info_table('molds',['biaoshi'=>$v['molds']],'name')}{/if}{/if} {$v['litpic']} {$v['size']} kb {fun date('Y-m-d H:i:s',$v['addtime'])}
{$pages}
================================================ FILE: app/admin/t/tpl/plugins-list.html ================================================ {include="style"}
{foreach $lists as $v} {/foreach}
{fun JZLANG('插件名')} {fun JZLANG('版本')} {fun JZLANG('作者')} {fun JZLANG('平台')} {fun JZLANG('简介')} {fun JZLANG('插件文件')} {fun JZLANG('开关')} {fun JZLANG('安装说明')} {fun JZLANG('操作')}
{$v['name']} v{$v['version']}{if($v['isupdate'])}{fun JZLANG('新')}{/if} {$v['author']} {if($v['official']==1)}{fun JZLANG('官方')}{else if($v['official']==2)}{fun JZLANG('本地')}{else}{fun JZLANG('第三方')}{/if} {$v['description']} {$v['filepath']} {if(checkAction('Plugins/change_status'))} {if($v['isinstall'])} {else} - {/if} {else} - {/if} {if(checkAction('Plugins/desc') && $v['exists'])} {else} - {/if} {if(checkAction('Plugins/action_do'))} {if($v['isinstall'])} {fun JZLANG('配置')} {fun JZLANG('导出')} {fun JZLANG('卸载')} {fun JZLANG('删除')} {else if($v['exists'])} {fun JZLANG('安装')} {fun JZLANG('删除')} {else}
{fun JZLANG('下载')}
{/if} {else} - {/if}
{$pages}
================================================ FILE: app/admin/t/tpl/plugins-update.html ================================================ {include="style"}

{$plugin['name']}

{fun JZLANG('当前版本:')}v{$plugin['version']}  {fun JZLANG('最新版本:')}v{$data['version']}  {fun JZLANG('作者:')}{$plugin['author']}  {fun JZLANG('更新时间:')}{$data['time']}

{fun JZLANG('更新内容')}
{fun nl2br($data['data'])}
================================================ FILE: app/admin/t/tpl/power-add.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
{fun JZLANG('对应的控制器/函数,如果是顶级,则只需要写控制器名')}
{if($webconf['isrelative']==1)} {/if}
{if($webconf['isrelative']==0)} {/if}
================================================ FILE: app/admin/t/tpl/power-edit.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
{fun JZLANG('对应的控制器/函数,如果是顶级,则只需要写控制器名')}
{if($webconf['isrelative']==1)} {/if}
{if($webconf['isrelative']==0)} {/if}
================================================ FILE: app/admin/t/tpl/power-list.html ================================================ {include="style"}
{if(checkAction('Member/addrulers'))} {fun JZLANG('添加权限')} {/if} {if($webconf['isopenhomepower']==0)}{fun JZLANG('温馨提示:前台权限已关闭,设置权限不会生效。')}{else}{fun JZLANG('温馨提示:前台权限已开启,权限设置将直接影响前台访问,请谨慎操作!')}{/if}
{foreach $lists as $v} {/foreach}
ID {fun JZLANG('功能')} {fun JZLANG('控制器/方法')} {fun JZLANG('操作')}
{$v['id']} {fun str_repeat('   ',$v['level'])} {if($v['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {fun JZLANG($v['name'])} {$v['action']} {if(checkAction('Member/editrulers'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Member/addrulers'))} {if($v['pid']==0)} {fun JZLANG('添加子功能')} {/if} {/if} {if(checkAction('Member/deleterulers'))} {fun JZLANG('删除')} {/if}
================================================ FILE: app/admin/t/tpl/power-tree.html ================================================ {include="style"}
{foreach $classtypetree as $v} {if($v['pid']==0)} {/if} {/foreach}
{fun JZLANG('顶级栏目')} {fun JZLANG('子栏目')}
{php $children = get_children($v,$classtypetree,5);/} {foreach $children as $vv} {/foreach}
{foreach $ruler_top as $v} {/foreach}
{fun JZLANG('主模块')} {fun JZLANG('子模块')}
{$v['name']}
{foreach $ruler_children[$v['id']] as $vv} {/foreach}
================================================ FILE: app/admin/t/tpl/product-add.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基础')}
  • {fun JZLANG('扩展')}
  • {fun JZLANG('设置')}
{if($molds['isclasstype']==1)}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{else} {/if}
{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}









================================================ FILE: app/admin/t/tpl/product-edit.html ================================================ {include="style"} {include="edit"}
  • {fun JZLANG('基本信息')}
  • {fun JZLANG('扩展信息')}
{if($molds['isclasstype']==1)}
{fun JZLANG('填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!')}
{else} {/if}
{fun JZLANG('此规则配置仅在不填留空的情况下才会触发')}









================================================ FILE: app/admin/t/tpl/product-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

{$fields_search}
================================================ FILE: app/admin/t/tpl/recycle-list.html ================================================ {include="style"}

{fun JZLANG('搜索')}

================================================ FILE: app/admin/t/tpl/restrucfields.html ================================================ {include="style"}
{fun JZLANG('重构字段可以快速将外部表引入CMS内,使其兼容CMS模型。')}
{fun JZLANG('重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改')}
{fun JZLANG('温馨提示:外部表必须有个字段为id,且必须是自增主键。如果没有,请先在数据库手动增加这个字段或者把已有的自增字段改成id。')}
{foreach $fields as $v} {/foreach}
{fun JZLANG('字段标识')} {fun JZLANG('数据类型')} {fun JZLANG('字段名称')} {fun JZLANG('录入类型')} {fun JZLANG('前台显示')} {fun JZLANG('后台显示')} {fun JZLANG('列表显示')}
{$v['field']} {$v['type']}
================================================ FILE: app/admin/t/tpl/ruler-add.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
{fun JZLANG('对应的控制器/函数,如果是顶级,则只需要写控制器名')}
{fun JZLANG('桌面管理配置时,将调用独立功能')}
{if($webconf['isrelative']==1)} {/if}
{if($webconf['isrelative']==0)} {/if}
================================================ FILE: app/admin/t/tpl/ruler-edit.html ================================================ {include="style"}
  • {fun JZLANG('基本信息')}
{fun JZLANG('对应的控制器/函数,如果是顶级,则只需要写控制器名')}
{fun JZLANG('桌面管理配置时,将调用独立功能')}
{if($webconf['isrelative']==1)} {/if}
{if($webconf['isrelative']==0)} {/if}
================================================ FILE: app/admin/t/tpl/ruler-list.html ================================================ {include="style"}
{if(checkAction('Rulers/addrulers'))} {fun JZLANG('添加权限')} {/if}
{foreach $lists as $v} {/foreach}
ID {fun JZLANG('功能')} {fun JZLANG('控制器/方法')} {fun JZLANG('归属')} {fun JZLANG('操作')}
{$v['id']} {fun str_repeat('   ',$v['level'])} {if($v['haschild'])} {else} {if($v['level'])}|——{/if} {/if} {fun JZLANG($v['name'])} {$v['fc']} {if($v['sys']==1)}{fun JZLANG('系统')}{else}{fun JZLANG('插件')}{/if} {if(checkAction('Rulers/editrulers'))} {fun JZLANG('编辑')} {/if} {if(checkAction('Rulers/addrulers'))} {if($v['pid']==0)} {fun JZLANG('添加子功能')} {/if} {/if} {if(checkAction('Rulers/deleterulers'))} {fun JZLANG('删除')} {/if}
================================================ FILE: app/admin/t/tpl/showlabel.html ================================================ {include="style"}
  • 标签生成
  • 公共配置输出
  • 栏目相关输出
  • 文章详情输出
  • 商品详情输出
  • 友情链接输出
  • 轮播图输出
  • loop标签解析
  • 常用标签
文章模块标签生成
选择栏目 是否分页 输出子类数据 排序 输出条数 操作

							  
商品模块标签生成
选择栏目 是否分页 输出子类数据 排序 输出条数 操作

							  
扩展配置统一使用规则: 标签值{!--$customconf[配置参数]--} 或者 通过方法获取标签值{!--fun get_custom(配置参数)--}
自定义配置
{loop table="sysconfig" orderby="id asc" notin="type|0" as="v"} {$v['title']}
{!--$customconf['{$v['field']}']--}
{/loop}
系统配置统一使用规则:{!--$webconf[配置参数]--} 或者 通过方法获取{!--fun webConf(配置参数)--}
系统配置
{loop table="sysconfig" orderby="id asc" type="0" as="v"} {$v['title']}
{!--$webconf['{$v['field']}']--}
{/loop}
全局栏目属性输出
所谓全局也就是整个前台模板体系里都能够使用的标签
{!--$classtypedata[$id][$str]--}
							  $id:栏目的ID
							  $str:栏目对应的字段参数
							  如:针对于栏目ID等于1的栏目,我们可以这样输出以下内容:
							  栏目名:{!--$classtypedata[1]['classname']--}
								模块标识:{!--$classtypedata[1]['molds']--}
								缩略图:{!--$classtypedata[1]['litpic']--}
								当前栏目URL:{!--$classtypedata[1]['url']--}
								描述:{!--$classtypedata[1]['description']--}
								关键词:{!--$classtypedata[1]['keywords']--}
								内容:{!--$classtypedata[1]['body']--}
								列表输出条数:{!--$classtypedata[1]['lists_num']--}
								栏目评论数:{!--$classtypedata[1]['comment_num']--}
								上级栏目ID:{!--$classtypedata[1]['pid']--}
								上级栏目名:{!--$classtypedata[$classtypedata[1]['pid']]['classname']--}
								上级栏目URL:{!--$classtypedata[$classtypedata[1]['pid']]['url']--}
导航高亮及输出
推荐使用,执行速度快,性能高
//判断是否首页,输出高亮代码
								
  • 首页
  • {!--foreach $classtypedata as $v--} //判断输出可显示的栏目 {!--if($v['isshow']==1)--} //输出一级栏目 {!--if($v['pid']==0)--}
  • //判断是否当前栏目,输出高亮代码 {!--$v['classname']--} //判断是否有下级,输出下级分类 {!--if($v['haschild'])--} {!--/if--}
  • {!--/if--} {!--/if--} {!--/foreach--}
    不推荐使用,但也能实现.【loop遍历】
    {!--loop table="classtype" isshow="1" pid="0" as="v"--}
    								栏目名:{!--$v['classname']--}
    								栏目URL:{!--$v['url']--}
    								栏目简介:{!--$v['description']--}
    								栏目缩略图[banner]:{!--$v['litpic']--}
    								判断是否有下级:
    								{!--if(haschild($classtypedata,$v['id']))--}
    								有下级则输出,输出下级栏目
    								{!--foreach $classtypedata[$v['id']]['children']['list'] as $vv--}
    									栏目名:{!--$vv['classname']--}
    									栏目URL:{!--$vv['url']--}
    									栏目简介:{!--$vv['description']--}
    									栏目缩略图[banner]:{!--$vv['litpic']--}
    									
    								{!--/foreach--}
    								{!--else--}
    								没有下级则输出
    								{!--/if--}
    								{!--/loop--}
    输出下级栏目的方式(两种)
    ①推荐使用.如输出栏目ID为1的下级栏目
    								{!--foreach $classtypedata[1]['children']['list'] as $v--}
    								{!--/foreach--}
    								
    ②不推荐,但是也能输出loop
    								{!--loop table="classtype" pid="2" isshow="1" as="v"}
    								栏目名:{!--$v['classname']--}
    								栏目URL:{!--$v['url']--}
    								栏目简介:{!--$v['description']--}
    								栏目缩略图[banner]:{!--$v['litpic']--}
    								{!--/loop--}
    输出当前栏目下的同级分类
    {!--foreach $classtypedata as $v--}
    							  {!--if($type['pid']==$v['pid'])--}//父类相同,那么他们就是同级了,需要注意的是当前栏目为顶级栏目(pid=0)的时候是输出所有顶级栏目的
    							  栏目名:{!--$v['classname']--}   栏目链接:{!--$v['url']--}
    							  {!--/if--}
    							  {!--/foreach--}
    输出当前栏目下的直系上级同级分类
    {!--foreach $classtypedata as $v--}
    							  {!--if($classtypedata[$type['pid']]['pid']==$v['pid'])--}//父类相同,那么他们就是同级了,需要注意的是当前栏目为顶级栏目(pid=0)的时候是输出所有顶级栏目的
    							  栏目名:{!--$v['classname']--}   栏目链接:{!--$v['url']--}
    							  {!--/if--}
    							  {!--/foreach--}
    栏目详情页输出
    基本信息输出
    ID:{!--$type['id']--}
    								当前位置:{!--$positions--}
    								栏目名:{!--$type['classname']--}
    								模块标识:{!--$type['molds']--}
    								缩略图:{!--$type['litpic']--}
    								当前栏目URL:{!--$type['url']--} 或 {!--$classtypedata[type['id']]['url']--}
    								描述:{!--$type['description']--}
    								关键词:{!--$type['keywords']--}
    								内容:{!--$type['body']--}
    								列表输出条数:{!--$type['lists_num']--}
    								栏目评论数:{!--$type['comment_num']--}
    								上级栏目ID:{!--$type['pid']--}
    								上级栏目名:{!--$classtypedata[$type['pid']]['classname']--}
    								上级栏目URL:{!--$classtypedata[$type['pid']]['url']--}
    栏目列表输出
    {!--foreach $lists as $v--}
    								内容输出规则:{!--$v[字段名]--}
    								标题:{!--$v['title']--}
    								内容链接:{!--$v['url']--}
    								热度/点击量:{!--$v['hits']--}
    								评论数:{!--$v['comment_num']--}
    								所属栏目id:{!--$v['tid']--}
    								所属栏目名:{!--$classtypedata[$v['tid']]['classname']--}
    								所属栏目URL:{!--$classtypedata[$v['tid']]['url']--}
    								简介:{!--$v['description']--}
    								链接:{!--$v['url']--}
    								缩略图:{!--$v['litpic']--}
    								内容:{!--$v['body']--}
    								时间:[了解更多日期格式请查看底部附录]
    									格式:年-月-日:{!--fun date('Y-m-d',$v['addtime'])--}
    									格式:年-月-日 时:分:秒:{!--fun date('Y-m-d H:i:s',$v['addtime'])--}
    									格式:年/月/日:{!--fun date('Y/m/d',$v['addtime'])--}
    								{!--/foreach--}
    栏目分页输出
    默认输出:
    								{!--$pages--}
    								自定义输出:
    								{!--if($listpage['list'])--}//判断是否有分页数据
    								
    					{!--/if--}
    $jz变量可以输出所有内容
    内容页也可以使用$type调用栏目所有内容的哦~
    文章标题:{!--$jz['title']--}
    						 当前位置:{!--$positions--}
    						 文章SEO标题:{!--$jz['seo_title']--}
    						 文章关键词:{!--$jz['keywords']--}
    						 文章点击量:{!--$jz['hits']--}自增操作{!--fun incrData('article',$jz['id'],'hits')--}
    						 文章缩略图:{!--$jz['litpic']--}
    						 文章简介:{!--$jz['description']--}
    						 文章内容:{!--$jz['body']--}
    						 文章作者:{!--fun adminInfo($jz['userid'],'name')--}
    						 文章更新时间:{!--fun date('Y-m-d',$jz['addtime'])--}
    						 其他字段内容统一输出:{!--$v[字段参数]--}
    						 *自定义当前位置:【不要求完全掌握,知道可以遍历输出面包屑导航即可】
    						 {!--loop $positions_data as $v--}
    						 {!--php echo ''.$v['classname'].''/--}
    						 {!--/loop--}
    上一页
    判断是否有上一篇
    							{!--if($aprev)--}
    							上一篇链接:{!--$aprev['url']--}
    							上一篇标题:{!--$aprev['title']--}
    							{!--else--}
    							如果没有上一篇,则输出这里的内容
    							{!--/if--}
    							
    下一页
    判断是否有下一篇
    						{!--if($anext)--}
    							下一篇的链接:{!--$anext['url']--}
    							下一篇的标题:{!--$anext['title']--}
    							{!--else--}
    							如果没有下一篇,则输出这里的内容
    							{!--/if--}
    点赞
    {!--if(checkLikes($type['id'],$jz['id']))--}
    						已点赞
    						{!--else--}
    						点赞
    						{!--/if--}
    相关点赞js
    function likes(tid,id){
    		$.ajax({
    				 url:"{!--fun U('user/likesAction')--}",//请求的url地址
    				 dataType:"json",//返回格式为json
    				 async:true,//请求是否异步,默认为异步,这也是ajax重要特性
    				 data:{tid:tid,id:id,ajax:1},//参数值
    				 type:"POST",//请求方式
    				 beforeSend:function(){
    					//请求前的处理
    					},
    					 success:function(r){
    						if(r.code==0){
    							alert(r.msg);
    							window.location.reload();
    						}else{
    							alert(r.msg);
    						}
    							
    					},
    					 complete:function(){
    					//请求完成的处理
    					},
    					 error:function(){
    					//请求出错处理
    						alert('网络错误');
    					}
    
    						
    				
    			})
    	}
    收藏
    {!--if(checkCollect($type['id'],$jz['id']))--}
    						已收藏
    						{!--else--}
    						收藏
    						{!--/if--}
    相关收藏js
    function collect(tid,id){
    		$.ajax({
    				 url:"{!--fun U('user/collectAction')--}",//请求的url地址
    				 dataType:"json",//返回格式为json
    				 async:true,//请求是否异步,默认为异步,这也是ajax重要特性
    				 data:{tid:tid,id:id,ajax:1},//参数值
    				 type:"POST",//请求方式
    				 beforeSend:function(){
    					//请求前的处理
    					},
    					 success:function(r){
    						if(r.code==0){
    							alert(r.msg);
    							window.location.reload();
    						}else{
    							alert(r.msg);
    						}
    							
    					},
    					 complete:function(){
    					//请求完成的处理
    					},
    					 error:function(){
    					//请求出错处理
    						alert('网络错误');
    					}
    
    						
    				
    			})
    	}
    $jz变量可以输出所有内容
    内容页也可以使用$type调用栏目所有内容的哦~
    商品标题:{!--$jz['title']--}
    						 当前位置:{!--$positions--}
    						 商品SEO标题:{!--$jz['seo_title']--}
    						 商品关键词:{!--$jz['keywords']--}
    						 商品点击量:{!--$jz['hits']--}自增操作{!--fun incrData('product',$jz['id'],'hits')--}
    						 商品主图:{!--$jz['litpic']--}
    						 商品价格:{!--$jz['price']--}
    						 商品库存:{!--$jz['stock_num']--}
    						 商品简介:{!--$jz['description']--}
    						 商品内容:{!--$jz['body']--}
    						 商品上传管理员:{!--fun adminInfo($jz['userid'],'name')--}
    						 商品更新时间:{!--fun date('Y-m-d',$jz['addtime'])--}
    						 其他字段内容统一输出:{!--$v[字段参数]--}
    						 *自定义当前位置:【不要求完全掌握,知道可以遍历输出面包屑导航即可】
    						 {!--loop $position_data as $v--}
    						 {!--php echo ''.$v['classname'].''/--}
    						 {!--/loop--}
    商品图集
    {!--php $pictures = explode('||',$jz['pictures'])/--}
    									{!--foreach $pictures as $v--}
    									{!--if($v!='')--}
    									图片链接:{!--$v--}	
    									{!--/if--}
    									{!--/foreach--}
    商品属性
    {!--php $product_fields = get_fields_show($jz['tid'],$type['molds'])/--}
    						{!--foreach $product_fields as $v--}
    						属性名:{!--$v['fieldname']--}
    						{!--if($v['fieldtype']==7)--}
    						
    						输出单选值:{!--fun get_key_field_select($jz[$v['field']],$type['molds'],$v['field'])--}
    						{!--else if($v['fieldtype']==8)--}
    						
    						输出多选值,并用空格分隔:{!--fun implode(' ',get_key_field_select($jz[$v['field']],$type['molds'],$v['field']))--}
    						{!--else--}
    						
    						输出原值:{!--$jz[$v['field']]--}
    						{!--/if--}
    						{!--/foreach--}
    点评/星星数【五颗星为满分,评分数为总星数/投票数,点了星星并提交评论才算评分成功】
    {!--php $comment = show_comment($jz['tid'],$jz['id'])/--} {!--php $star_num = $comment['average']/--} {!--if($comment['data'])--} {!--for $i=1;$i<=$star_num;$i++--} {!--/for--} {!--if(round($star_num)!=$star_num)--} {!--/if--} {!--if($star_num<5)--} {!--for $i=1;$i<=(5-$star_num);$i++--} {!--/for--} {!--/if--} {!--$star_num--} - {!--$comment['count']--} 票 {!--else--} 0 - 0 票 {!--/if--}
    加入购物车
    加入购物车JS
    function addcart(tid,id,num){
    								$.ajax({
    									 url:"{!--fun U('user/addcart')--}",//请求的url地址
    									 dataType:"json",//返回格式为json
    									 async:true,//请求是否异步,默认为异步,这也是ajax重要特性
    									 data:{tid:tid,id:id,num:num,ajax:1},//参数值
    									 type:"POST",//请求方式
    									 beforeSend:function(){
    										//请求前的处理
    										},
    										 success:function(r){
    											if(r.code==0){
    												window.location.href=r.url;
    											}else{
    												alert(r.msg);
    											}
    												
    										},
    										 complete:function(){
    										//请求完成的处理
    										},
    										 error:function(){
    										//请求出错处理
    											alert('网络错误');
    										}
    
    											
    									
    								})
    						   }
    						   
    相关产品
    {!--loop table="$type['molds']" notin="id|$jz['id']" limit="3" as="v"--}
    						   notin:表示除当前ID外的产品
    						   {!--/loop--}
    上一个
    判断是否有上一个
    							{!--if($aprev)--}
    							上一个链接:{!--$aprev['url']--}
    							上一个标题:{!--$aprev['title']--}
    							{!--else--}
    							如果没有上一个,则输出这里的内容
    							{!--/if--}
    							
    下一个
    判断是否有下一个
    						{!--if($anext)--}
    							下一个的链接:{!--$anext['url']--}
    							下一个的标题:{!--$anext['title']--}
    							{!--else--}
    							如果没有下一个,则输出这里的内容
    							{!--/if--}
    点赞
    判断是否有点赞
    						{!--if(checkLikes($type['id'],$jz['id']))--}
    						有点赞,则输出这里
    						已点赞
    						{!--else--}
    						没有点赞则输出这里
    						点赞
    						{!--/if--}
    相关点赞js
    function likes(tid,id){
    		$.ajax({
    				 url:"{!--fun U('user/likesAction')--}",//请求的url地址
    				 dataType:"json",//返回格式为json
    				 async:true,//请求是否异步,默认为异步,这也是ajax重要特性
    				 data:{tid:tid,id:id,ajax:1},//参数值
    				 type:"POST",//请求方式
    				 beforeSend:function(){
    					//请求前的处理
    					},
    					 success:function(r){
    						if(r.code==0){
    							alert(r.msg);
    							window.location.reload();
    						}else{
    							alert(r.msg);
    						}
    							
    					},
    					 complete:function(){
    					//请求完成的处理
    					},
    					 error:function(){
    					//请求出错处理
    						alert('网络错误');
    					}
    
    						
    				
    			})
    	}
    收藏
    {!--if(checkCollect($type['id'],$jz['id']))--}
    						已收藏
    						{!--else--}
    						收藏
    						{!--/if--}
    相关收藏js
    function collect(tid,id){
    		$.ajax({
    				 url:"{!--fun U('user/collectAction')--}",//请求的url地址
    				 dataType:"json",//返回格式为json
    				 async:true,//请求是否异步,默认为异步,这也是ajax重要特性
    				 data:{tid:tid,id:id,ajax:1},//参数值
    				 type:"POST",//请求方式
    				 beforeSend:function(){
    					//请求前的处理
    					},
    					 success:function(r){
    						if(r.code==0){
    							alert(r.msg);
    							window.location.reload();
    						}else{
    							alert(r.msg);
    						}
    							
    					},
    					 complete:function(){
    					//请求完成的处理
    					},
    					 error:function(){
    					//请求出错处理
    						alert('网络错误');
    					}
    
    						
    				
    			})
    	}
    {!--loop table="links" isshow="1" orderby="orders desc" as="v"--}
    							 链接名:{!--$v['title']--}
    							 链接URL:{!--$v['url']--}
    							 {!--/loop--}
    轮播图分类输出
    {!--loop table="collect_type" as="v"--}
    							 轮播图分类名字:{!--$v['name']--}
    							 创建时间:{!--fun date('Y-m-d',$v['addtime'])--}
    							 {!--/loop--}
    根据分类输出轮播图
    {!--loop table="collect" orderby="orders desc" tid="1" isshow="1" as="v"--}
    							 轮播图标题:{!--$v['title']--}
    							 轮播图描述:{!--$v['description']--}
    							 轮播图图片:{!--$v['litpic']--}
    							 轮播图链接:{!--$v['url']--}
    							 创建时间:{!--fun date('Y-m-d',$v['addtime'])--}
    							 {!--/loop--}
    通用说明
    {!--loop table="表名" tid="栏目ID" limit="输出条数" ispage="值1" isall="值1" notin="字段|值" like="字段|值,字段2|值2" as="变量标签,默认v"--}
    						 这里面输出内容格式:{!--$v[字段参数]--}
    						 {!--$v_n--}:计数,从1开始计(v1.6更改)
    						 table:数据库的表名
    						 tid:对应表中的栏目ID,默认每条数据都会有tid字段,可以根据此值输出对应的栏目数据
    						 limit:输出的条数
    						 ispage:数值可以是非0的任何数字,如果填写了该参数,则loop循环结束后可以调出分页
    						 isall:数值可以是非0的任何数字,如果填写了该参数,则查询数据的时候会调用tid栏目的下级数据(如果没有tid,则忽略)
    						 notin:表示查询除某个字段值意外的数据,如:id|1,表示除id=1以外的数据 as:默认循环变量为小写字母v,可以自定义非数字开头的字母(严格意义上说,不能出现PHP的关键字)
    						 like:表示查询存在某个值的数据,目前仅支持的形式有:[字段|值],[字段1|值1,字段2|值2],[字段|变量] 如:title|测试,表示title中含有‘测试’这个单词的数据。
    						 as:默认循环变量为小写字母v,可以自定义非数字开头的字母(严格意义上说,不能出现PHP的关键字)
    						 {!--/loop--}
    如果有ispage参数,那么loop后面可以调用分页【特别说明:$v是loop里面的as="v"里面的v,要灵活转换】
    默认tpl模板输出:{!--$v_pages--}
    						 总条数:{!--$v_sum--}
    						 总页数:{!--$v_allpage--}
    						 分页列表:{!--$v_listpage--}
    						 分页前一条:{!--$v_prevpage--}
    						 分页后一条:{!--$v_nextpage--}
    						 自定义输出:
    						 
      {!--if($v_listpage['list'])--}
    • {!--foreach $v_listpage['list'] as $ss--}
    • {!--$ss['num']--}
    • {!--/foreach--}
    • {!--/if--}
    举例说明:输出文章栏目ID为2,3,4的所有数据,并输出分页,每页10条,变量为v
    {!--loop table="article" tid="2,3,4" isall="1" ispage="1" limit="10" as="v"--}
    						 标题:{!--$v['title']--}
    						 简介:{!--$v['description']--} 截取20个字:{!--fun newstr($v['description'],40)--}
    						 缩略图:{!--$v['litpic']--}
    						 时间:{!--fun date('Y-m-d',$v['addtime'])--}
    						 内容:{!--$v['body']--}
    						 其余内容按照统一规则:{!--$v[字段参数]--}
    						 {!--/loop--}
    						 输出分页
    						 
      {!--if($v_listpage['list'])--}
    • {!--foreach $v_listpage['list'] as $ss--}
    • {!--$ss['num']--}
    • {!--/foreach--}
    • {!--/if--}
    输出任何一条数据的万能标签【一条数据】
    {!--fun get_info_table($table,$where=null,$str=null)--}
    						$table:表名,模块名,从数据库或模块列表可查看
    						$where:查询条件。如:['id'=>1],表示查询条件为id=1
    						$str:获取字段,默认null,返回数组,如果有对应的字段,则返回查询得到的数据的对应字段值。字段可以从数据库中查看。
    输出任意多条数据的万能标签【多条数据】
    {!--fun get_all_info_table($table,$where=null,$order=null,$limit=null,$field=null)--}
    						$table:表名,模块名,从数据库或模块列表可查看
    						$where:查询条件。如:['id'=>1],表示查询条件为id=1
    						$order:查询排序,默认null,表示按系统排序ID正序。如:'id desc'表示ID倒序,'addtime desc,id desc'表示按最新时间,并且ID倒序
    						$limit:查询条数,默认null,表示查询所有数据。
    						$field:查询字段,默认null,表示可以输出哪些字段。
    IF逻辑判断
    {!--if(判断1)--}
    						//如果判断1为真,则输出这里
    						{!--else if(判断2)--}
    						//如果判断1为假,判断2为真,则输出这里
    						{!--else--}
    						//否则输出这里(判断1、判断2都为假)
    						{!--/if--}
    Foreach循环输出
    {!--foreach $lists as $v--}
    						这里循环输出{!--$v--}对应的参数值
    						{!--/foreach--}
    For循环输出
    {!--for $i=1;$i<5;$i++--}
    						这里输出{!--$i--}从1开始递增
    						{!--/for--}
    使用PHP函数/方法【要求一定要掌握的技能】
    {!--fun 函数--}   如输出当前日期函数:{!--fun date('Y-m-d',time())--}
    通过函数方式获取默认配置参数
    {!--fun webConf(配置参数)--}
    通过函数方式获取自定义配置参数值【只能获取值或者数组】
    {!--fun get_custom(配置参数=null)--}  如果没有输入配置参数,则返回自定义配置数组
    各种端口检测【手机端检测】【微信端检测】
    判断是否为手机端:{!--if(isMobile())--}如果真,这里输出手机端内容{!--/if--}
    						判断是否为微信端:{!--if(isWeixin())--}如果真,这里输出微信端内容{!--/if--}
    各种链接创建【链接生成】
    指定一个模块的一条数据链接生成:{!--fun gourl($id,$htmlurl=null,$molds='article')--}这里的$id指内容ID,$htmlurl指栏目静态链接名,$molds指模块标识
    						指定一个栏目的URL链接:{!--$classtypedata[$id]['url']--}这里的$id指栏目的ID值
    						创建一个自定义URL:{!--fun U($action)--}这里的$action可以是一个方法名,也可以是控制器+方法
    						如:{!--fun U('index')--}则输出当前页面控制器下面的index方法的执行链接
    						如:{!--fun U('Home/index')--}则输出Home控制器下面的index方法的执行链接
    通过函数方式获取文章作者,上传商品管理员信息
    {!--fun adminInfo($str=null)--}默认传入字段参数为null,返回数组
    						{!--fun adminInfo('name')--}管理员姓名
    						{!--fun adminInfo('tel')--}管理员电话
    						{!--fun adminInfo('email')--}管理员邮箱
    字符串截取【默认字符集为UTF-8,且中文为2个字符一个汉字】
    {!--fun newstr($data,20)--}表示截取$data中的前20个字符
    检查后台管理员的某个操作权限
    {!--if( checkAction($action))--}如果真,则执行这里{!--/if--}$action可以是整个模块的控制器名,也可以是单独某个操作名。
    						如:{!--if(checkAction('Article'))--}如果返回真,则只需这里的代码{!--/if--}检查用户对文章模块是否有操作权限。
    						{!--if(checkAction('Article/addarticle'))--}如果返回真,则只需这里的代码{!--/if--}单独检查用户是否有新增文章的权限
    PHP变量输出
    {!--$v--}输出$v变量的值
    模板执行PHP语句【注意中间的空格】
    {!--php 这里写PHP的内容/--}
    模板输出原生标签
    用{!--!------}代替{}
    附录
    时间参数表:
    							格式:年-月-日:{!--fun date('Y-m-d',$v['addtime'])--}
    格式:年-月-日 时:分:秒:{!--fun date('Y-m-d H:i:s',$v['addtime'])--}
    格式:年/月/日:{!--fun date('Y/m/d',$v['addtime'])--}
    							a - "am" 或是 "pm"
    A - "AM" 或是 "PM"
    d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31"
    D - 星期几,三个英文字母; 如: "Fri"
    F - 月份,英文全名; 如: "January"
    h - 12 小时制的小时; 如: "01" 至 "12"
    H - 24 小时制的小时; 如: "00" 至 "23"
    g - 12 小时制的小时,不足二位不补零; 如: "1" 至 12"
    G - 24 小时制的小时,不足二位不补零; 如: "0" 至 "23"
    i - 分钟; 如: "00" 至 "59"
    j - 几日,二位数字,若不足二位不补零; 如: "1" 至 "31"
    l - 星期几,英文全名; 如: "Friday"
    m - 月份,二位数字,若不足二位则在前面补零; 如: "01" 至 "12"
    n - 月份,二位数字,若不足二位则不补零; 如: "1" 至 "12"
    M - 月份,三个英文字母; 如: "Jan"
    s - 秒; 如: "00" 至 "59"
    S - 字尾加英文序数,二个英文字母; 如: "th","nd"
    t - 指定月份的天数; 如: "28" 至 "31"
    U - 总秒数
    w - 数字型的星期几,如: "0" (星期日) 至 "6" (星期六)
    Y - 年,四位数字; 如: "1999"
    y - 年,二位数字; 如: "99"
    z - 一年中的第几天; 如: "0" 至 "365" 









    ================================================ FILE: app/admin/t/tpl/sitemap.html ================================================ {include="style"}
    {if($webconf['iswap']==1)}{fun JZLANG('手机端已开启,sitemap将包含手机端URL,请注意【手机静态目录')}-[ {$webconf['mobile_html']} ]】{if($webconf['mobile_html']!='/')},{fun JZLANG('如果不生成静态文件,请改为')}[ / ]{/if}{else}{fun JZLANG('手机端未开启,sitemap不会包含手机端URL')}{/if}
    {fun JZLANG('PC端网站地图:')}sitemap.xml
    {fun JZLANG('手机端网站地图:')}mobile_sitemap.xml
    如果是txt类型文件,则生成如下文件:
    {fun JZLANG('PC端网站地图:')}sitemap.txt
    {fun JZLANG('手机端网站地图:')}mobile_sitemap.txt
    {fun JZLANG('网站地图')}
    {loop table="molds" sys="0" ismust="1" as="v"} {/loop}
    {fun JZLANG('模块名称')} {fun JZLANG('更新频率')} {fun JZLANG('站内权重')} {fun JZLANG('输出范围')}
    {fun JZLANG('栏目模块')}
    {fun JZLANG('文章模块')}
    {fun JZLANG('商品模块')}
    {$v['name']}{fun JZLANG('模块')}
    TAGS{fun JZLANG('模块')}
    {id},{keywords}自动替换变量,链接必须 / 开头,否则出错
    ================================================ FILE: app/admin/t/tpl/style/css/font.css ================================================ /* @font-face { font-family: 'iconfont'; src: url('../fonts/iconfont.eot'); src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'), url('../fonts/iconfont.woff') format('woff'), url('../fonts/iconfont.ttf') format('truetype'), url('../fonts/iconfont.svg#iconfont') format('svg'); } .iconfont{ font-family:"iconfont" !important; font-size:16px;font-style:normal; -webkit-font-smoothing: antialiased; -webkit-text-stroke-width: 0.2px; -moz-osx-font-smoothing: grayscale; } */ @font-face { font-family: 'iconfont'; src: url('../fonts/iconfont.eot'); src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'), url('../fonts/iconfont.woff2') format('woff2'), url('../fonts/iconfont.woff') format('woff'), url('../fonts/iconfont.ttf') format('truetype'), url('../fonts/iconfont.svg#iconfont') format('svg'); } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } ================================================ FILE: app/admin/t/tpl/style/css/iconfont.css ================================================ @font-face { font-family: "iconfont"; /* Project id 1357552 */ src: url('iconfont.woff2?t=1638967197290') format('woff2'), url('iconfont.woff?t=1638967197290') format('woff'), url('iconfont.ttf?t=1638967197290') format('truetype'); } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .icon-xiangshangshouqi:before { content: "\e964"; } .icon-zhixiangxia:before { content: "\e965"; } .icon-diyiye:before { content: "\e966"; } .icon-zuihouye:before { content: "\e967"; } .icon-biaotou-zhengxu:before { content: "\e968"; } .icon-biaotou-kepaixu:before { content: "\e969"; } .icon-biaotou-daoxu:before { content: "\e96a"; } .icon-huidingbu:before { content: "\e96b"; } .icon-xiangzuojiaohuan:before { content: "\e96c"; } .icon-xianghujiaohuan:before { content: "\e96d"; } .icon-xiangyoujiaohuan:before { content: "\e96e"; } .icon-shuzhixiajiang:before { content: "\e96f"; } .icon-quanping:before { content: "\e970"; } .icon-hengxiangzhankai:before { content: "\e971"; } .icon-shuzhishangsheng:before { content: "\e972"; } .icon-tuichuquanping:before { content: "\e973"; } .icon-hengxiangshouqi:before { content: "\e974"; } .icon-shuaxin:before { content: "\e975"; } .icon-tongbu:before { content: "\e976"; } .icon-jiazailoading-A:before { content: "\e977"; } .icon-jiazailoading-B:before { content: "\e978"; } .icon-weizhi-xianxing:before { content: "\e979"; } .icon-weizhi:before { content: "\e97a"; } .icon-daohang:before { content: "\e97b"; } .icon-dingwei:before { content: "\e97c"; } .icon-jiankongshexiangtou-xianxing:before { content: "\e97d"; } .icon-tuodiantu:before { content: "\e97e"; } .icon-jiankongshexiangtou:before { content: "\e97f"; } .icon-leidatance:before { content: "\e980"; } .icon-baobiao:before { content: "\e981"; } .icon-bingtu-xianxing:before { content: "\e982"; } .icon-baobiao-xianxing:before { content: "\e983"; } .icon-bingtu:before { content: "\e984"; } .icon-tiaoxingtu:before { content: "\e985"; } .icon-tiaoxingtu-xianxing:before { content: "\e986"; } .icon-zhexiantu:before { content: "\e987"; } .icon-zhexiantu-xianxing:before { content: "\e988"; } .icon-zhinanzhidao-xianxing:before { content: "\e989"; } .icon-ditu:before { content: "\e98a"; } .icon-zhinanzhidao:before { content: "\e98b"; } .icon-tousu:before { content: "\e98c"; } .icon-xunjianjianyan:before { content: "\e98d"; } .icon-dianpu:before { content: "\e98e"; } .icon-yunshuzhongwuliu-xianxing:before { content: "\e88f"; } .icon-dianpu-xianxing:before { content: "\e98f"; } .icon-yunshuzhongwuliu:before { content: "\e890"; } .icon-kuaidiyuan:before { content: "\e990"; } .icon-baoguofahuo:before { content: "\e891"; } .icon-kuaidiyuan-xianxing:before { content: "\e991"; } .icon-baoguofahuo-xianxing:before { content: "\e892"; } .icon-daikuan-xianxing:before { content: "\e992"; } .icon-chaibaoguoqujian:before { content: "\e893"; } .icon-huankuan-xianxing:before { content: "\e993"; } .icon-chaibaoguoqujian-xianxing:before { content: "\e894"; } .icon-tuikuan-xi:before { content: "\e994"; } .icon-zitigui:before { content: "\e895"; } .icon-rili-xianxing-xi:before { content: "\e995"; } .icon-zitigui-xianxing:before { content: "\e896"; } .icon-jisuanqilishuai-xianxing-xi:before { content: "\e996"; } .icon-caigou-xianxing:before { content: "\e897"; } .icon-yonghuziliao:before { content: "\e997"; } .icon-caigou:before { content: "\e898"; } .icon-yonghuziliao-xianxing:before { content: "\e998"; } .icon-shangpin:before { content: "\e899"; } .icon-pifuzhuti:before { content: "\e999"; } .icon-shangpin-xianxing:before { content: "\e89a"; } .icon-pifuzhuti-xianxing:before { content: "\e99a"; } .icon-peizaizhuangche:before { content: "\e89b"; } .icon-diamond:before { content: "\e99b"; } .icon-peizaizhuangche-xianxing:before { content: "\e89c"; } .icon-diamond-o:before { content: "\e99c"; } .icon-zhiliang-xianxing:before { content: "\e89d"; } .icon-sheji-xianxing:before { content: "\e99d"; } .icon-zhiliang:before { content: "\e89e"; } .icon-kaifa-xianxing:before { content: "\e99e"; } .icon-anquanbaozhang:before { content: "\e89f"; } .icon-yinhangqia:before { content: "\e99f"; } .icon-anquanbaozhang-xianxing:before { content: "\e8a0"; } .icon-yinhangqia-xianxing:before { content: "\e9a0"; } .icon-cangkucangchu:before { content: "\e8a1"; } .icon-hongbao-xianxing:before { content: "\e9a1"; } .icon-cangkucangchu-xianxing:before { content: "\e8a2"; } .icon-hongbao:before { content: "\e9a2"; } .icon-zhongzhuanzhan-xianxing:before { content: "\e8a3"; } .icon-aixin:before { content: "\e9a3"; } .icon-zhongzhuanzhan:before { content: "\e8a4"; } .icon-bianji:before { content: "\e9a4"; } .icon-kucun-xianxing:before { content: "\e8a5"; } .icon-Dyanjing:before { content: "\e9a5"; } .icon-kucun:before { content: "\e8a6"; } .icon-caidan:before { content: "\e9a6"; } .icon-moduanwangdian-xianxing:before { content: "\e8a7"; } .icon-anquan:before { content: "\e9a7"; } .icon-moduanwangdian:before { content: "\e8a8"; } .icon-bangzhu:before { content: "\e9a8"; } .icon-qianshoushenpitongguo-xianxing:before { content: "\e8a9"; } .icon-buganxingqu:before { content: "\e9a9"; } .icon-qianshoushenpitongguo:before { content: "\e8aa"; } .icon-bofangjilu:before { content: "\e9aa"; } .icon-juqianshou-xianxing:before { content: "\e8ab"; } .icon-chuangzuo:before { content: "\e9ab"; } .icon-juqianshou:before { content: "\e8ac"; } .icon-chenggong:before { content: "\e9ac"; } .icon-jijianfasong-xianxing:before { content: "\e8ad"; } .icon-ceshi:before { content: "\e9ad"; } .icon-jijianfasong:before { content: "\e8ae"; } .icon-dianhua1:before { content: "\e9ae"; } .icon-qiyeyuanquwuye:before { content: "\e8af"; } .icon-dianzan:before { content: "\e9af"; } .icon-qiyeyuanquwuye-xianxing:before { content: "\e8b0"; } .icon-dingwei1:before { content: "\e9b0"; } .icon-jiesuan-xianxing:before { content: "\e8b1"; } .icon-diantong_guan:before { content: "\e9b1"; } .icon-jiesuan:before { content: "\e8b2"; } .icon-dianying:before { content: "\e9b2"; } .icon-jifen1:before { content: "\e8b3"; } .icon-ditu1:before { content: "\e9b3"; } .icon-jifen-xianxing:before { content: "\e8b4"; } .icon-diantong_kai:before { content: "\e9b4"; } .icon-youhuijuan-xianxing:before { content: "\e8b5"; } .icon-dianyingpiao:before { content: "\e9b5"; } .icon-ziliaoshouce:before { content: "\e8b6"; } .icon-dingdan:before { content: "\e9b6"; } .icon-ziliaoshouce-xianxing:before { content: "\e8b7"; } .icon-gengduo:before { content: "\e9b7"; } .icon-youhuijuan:before { content: "\e8b8"; } .icon-fanbei:before { content: "\e9b8"; } .icon-guize:before { content: "\e8b9"; } .icon-faxian:before { content: "\e9b9"; } .icon-danju-xianxing:before { content: "\e8ba"; } .icon-ertongpiao:before { content: "\e9ba"; } .icon-zuzhijiagoujiekou:before { content: "\e8bb"; } .icon-gongyi:before { content: "\e9bb"; } .icon-danju:before { content: "\e8bc"; } .icon-hongbao1:before { content: "\e9bc"; } .icon-chuangjiandanju-xianxing:before { content: "\e8bd"; } .icon-fuzhi:before { content: "\e9bd"; } .icon-chuangjiandanju:before { content: "\e8be"; } .icon-fenxiang:before { content: "\e9be"; } .icon-zhangdan-xianxing:before { content: "\e8bf"; } .icon-huatifuhao:before { content: "\e9bf"; } .icon-zhangdan:before { content: "\e8c0"; } .icon-huiyuan:before { content: "\e9c0"; } .icon-tijikongjian:before { content: "\e8c1"; } .icon-aliyu:before { content: "\e9c1"; } .icon-tijikongjian-xianxing:before { content: "\e8c2"; } .icon-jiju:before { content: "\e9c2"; } .icon-yewu-xianxing:before { content: "\e8c3"; } .icon-jianshao:before { content: "\e9c3"; } .icon-yewu:before { content: "\e8c4"; } .icon-kabao:before { content: "\e9c4"; } .icon-yingyongchengxu-xianxing:before { content: "\e8c5"; } .icon-huati:before { content: "\e9c5"; } .icon-yingyongchengxu:before { content: "\e8c6"; } .icon-guanzhu:before { content: "\e9c6"; } .icon-biaozhun:before { content: "\e8c7"; } .icon-maiyizengyi:before { content: "\e9c7"; } .icon-biaozhun-xianxing:before { content: "\e8c8"; } .icon-mima:before { content: "\e9c8"; } .icon-quanxianyuechi:before { content: "\e8c9"; } .icon-nan:before { content: "\e9c9"; } .icon-quanxianyuechi-xianxing:before { content: "\e8ca"; } .icon-nv:before { content: "\e9ca"; } .icon-ziyuan:before { content: "\e8cb"; } .icon-lihe:before { content: "\e9cb"; } .icon-ziyuan-xianxing:before { content: "\e8cc"; } .icon-paihangbang:before { content: "\e9cc"; } .icon-mobankuangjia-xianxing:before { content: "\e8cd"; } .icon-lipinka:before { content: "\e9cd"; } .icon-mobankuangjia:before { content: "\e8ce"; } .icon-pengyouquan:before { content: "\e9ce"; } .icon-xinwenzixun:before { content: "\e8cf"; } .icon-mingxinghuodong:before { content: "\e9cf"; } .icon-xinwenzixun-xianxing:before { content: "\e8d0"; } .icon-qupiao:before { content: "\e9d0"; } .icon-hezuoguanxi-xianxing:before { content: "\e8d1"; } .icon-saoyisao:before { content: "\e9d1"; } .icon-hezuoguanxi:before { content: "\e8d2"; } .icon-rili1:before { content: "\e9d2"; } .icon-xianlu:before { content: "\e8d3"; } .icon-pinglun:before { content: "\e9d3"; } .icon--fuwu-xianxing:before { content: "\e8d4"; } .icon-qinghuiyuan:before { content: "\e9d4"; } .icon--fuwu:before { content: "\e8d5"; } .icon-riqian:before { content: "\e9d5"; } .icon--kefu-xianxing:before { content: "\e8d6"; } .icon-shandian:before { content: "\e9d6"; } .icon--kefu:before { content: "\e8d7"; } .icon-shaixuan:before { content: "\e9d7"; } .icon--guoji-xianxing:before { content: "\e8d8"; } .icon-shangquan:before { content: "\e9d8"; } .icon--guoji:before { content: "\e8d9"; } .icon-shanchu:before { content: "\e9d9"; } .icon-haiguan-xianxing:before { content: "\e8da"; } .icon-shezhi1:before { content: "\e9da"; } .icon-haiguan:before { content: "\e8db"; } .icon-shangchuan:before { content: "\e9db"; } .icon-touchengkongyun:before { content: "\e8dc"; } .icon-shequ:before { content: "\e9dc"; } .icon-weicheng:before { content: "\e8dd"; } .icon-shengyinguanbi:before { content: "\e9dd"; } .icon-caiwu:before { content: "\e8de"; } .icon-shibai:before { content: "\e9de"; } .icon-caiwu-xianxing:before { content: "\e8df"; } .icon-shijian1:before { content: "\e9df"; } .icon-mianfei:before { content: "\e8e0"; } .icon-shengyin:before { content: "\e9e0"; } .icon-mianfei-xianxing:before { content: "\e8e1"; } .icon-shoucang1:before { content: "\e9e1"; } .icon-tuikuan:before { content: "\e8e2"; } .icon-shouji:before { content: "\e9e2"; } .icon-jisuanqilishuai:before { content: "\e8e3"; } .icon-shouye1:before { content: "\e9e3"; } .icon-jisuanqilishuai-xianxing:before { content: "\e8e4"; } .icon-shuju:before { content: "\e9e4"; } .icon-checkbox-weixuan:before { content: "\e8e5"; } .icon-shuaxin1:before { content: "\e9e5"; } .icon-checkbox-xuanzhong:before { content: "\e8e6"; } .icon-sousuo1:before { content: "\e9e6"; } .icon-Raidobox-weixuan:before { content: "\e8e7"; } .icon-tanhao:before { content: "\e9e7"; } .icon-Raidobox-xuanzhong:before { content: "\e8e8"; } .icon-taolunqu:before { content: "\e9e8"; } .icon-checkbox-xuanzhongbufen:before { content: "\e8e9"; } .icon-tianjiayouhuiquan:before { content: "\e9e9"; } .icon-youxiajiaogouxuan:before { content: "\e8ea"; } .icon-tishi:before { content: "\e9ea"; } .icon-sousuo-xianxing:before { content: "\e8eb"; } .icon-tupian1:before { content: "\e9eb"; } .icon-shezhi-xianxing:before { content: "\e8ec"; } .icon-tuipiao:before { content: "\e9ec"; } .icon-shezhi:before { content: "\e8ed"; } .icon-weixuanzhong:before { content: "\e9ed"; } .icon-shouye:before { content: "\e8ee"; } .icon-weibo:before { content: "\e9ee"; } .icon-shouye-xianxing:before { content: "\e8ef"; } .icon-wenjuan:before { content: "\e9ef"; } .icon-sousuo:before { content: "\e8f0"; } .icon-wode:before { content: "\e9f0"; } .icon-wenti-xianxing:before { content: "\e8f1"; } .icon-weixin3:before { content: "\e9f1"; } .icon-wenti:before { content: "\e8f2"; } .icon-wodeguanzhu:before { content: "\e9f2"; } .icon-dianhua-xianxingyuankuang:before { content: "\e8f3"; } .icon-xiami:before { content: "\e9f3"; } .icon-liaotianduihua:before { content: "\e8f4"; } .icon-xiangkan:before { content: "\e9f4"; } .icon-liaotianduihua-xianxing:before { content: "\e8f5"; } .icon-xiangji:before { content: "\e9f5"; } .icon-dianhua:before { content: "\e8f6"; } .icon-xiaoxi:before { content: "\e9f6"; } .icon-dianhua-yuankuang:before { content: "\e8f7"; } .icon-xiazai:before { content: "\e9f7"; } .icon-xin-xianxing:before { content: "\e8f8"; } .icon-xiaojuchang:before { content: "\e9f8"; } .icon-lingdang:before { content: "\e8f9"; } .icon-xiaoshi:before { content: "\e9f9"; } .icon-lingdang-xianxing:before { content: "\e8fa"; } .icon-xiaoxizhongxin:before { content: "\e9fa"; } .icon-xin:before { content: "\e8fb"; } .icon-yinhangka:before { content: "\e9fb"; } .icon-laba-xianxing:before { content: "\e8fc"; } .icon-yanjing:before { content: "\e9fc"; } .icon-laba:before { content: "\e8fd"; } .icon-yingchengka:before { content: "\e9fd"; } .icon-maikefeng-xianxing:before { content: "\e8fe"; } .icon-yixiangkan:before { content: "\e9fe"; } .icon-shoucang:before { content: "\e8ff"; } .icon-yingpingmoban:before { content: "\e9ff"; } .icon-maikefeng:before { content: "\e900"; } .icon-yanchu:before { content: "\ea00"; } .icon-xihuan-xianxing:before { content: "\e901"; } .icon-xiaomi:before { content: "\ea01"; } .icon-shoucang-xianxing:before { content: "\e902"; } .icon-yingyuan:before { content: "\ea02"; } .icon-xihuan:before { content: "\e903"; } .icon-zengjia:before { content: "\ea03"; } .icon-gengduo-hengxiang:before { content: "\e904"; } .icon-yuyin:before { content: "\ea04"; } .icon-gengduo-shuxiang:before { content: "\e905"; } .icon-youhuiquan:before { content: "\ea05"; } .icon-shijian-xianxing:before { content: "\e906"; } .icon-WIFI:before { content: "\ea06"; } .icon-shengboyuyinxiaoxi:before { content: "\e907"; } .icon-zhibo:before { content: "\ea07"; } .icon-shijian:before { content: "\e908"; } .icon-youkuhuiyuan:before { content: "\ea08"; } .icon-shangchuandaochu:before { content: "\e909"; } .icon-yulebao:before { content: "\ea09"; } .icon-xiazaidaoru:before { content: "\e90a"; } .icon-zhiwen:before { content: "\ea0a"; } .icon-baocun-xianxing:before { content: "\e90b"; } .icon-aixin1:before { content: "\ea0b"; } .icon-shanguangdeng:before { content: "\e90c"; } .icon-chenggong1:before { content: "\ea0c"; } .icon-shanguangdeng-zidong:before { content: "\e90d"; } .icon-dianzan1:before { content: "\ea0d"; } .icon-shanguangdeng-guanbi:before { content: "\e90e"; } .icon-dianhua2:before { content: "\ea0e"; } .icon-baocun:before { content: "\e90f"; } .icon-bangzhu1:before { content: "\ea0f"; } .icon-yonghu-xianxing:before { content: "\e910"; } .icon-dianyingpiao1:before { content: "\ea10"; } .icon-yonghu:before { content: "\e911"; } .icon-faxian1:before { content: "\ea11"; } .icon-jiaosequnti:before { content: "\e912"; } .icon-dingwei2:before { content: "\ea12"; } .icon-morentouxiang:before { content: "\e913"; } .icon-gonggao:before { content: "\ea13"; } .icon-zhucetianjiahaoyou:before { content: "\e914"; } .icon-huati1:before { content: "\ea14"; } .icon-renwu:before { content: "\e915"; } .icon-jianshao1:before { content: "\ea15"; } .icon-zhongwenmoshi:before { content: "\e916"; } .icon-huiyuan1:before { content: "\ea16"; } .icon-fujian:before { content: "\e917"; } .icon-pinglun1:before { content: "\ea17"; } .icon-bianjishuru-xianxing:before { content: "\e918"; } .icon-shequ1:before { content: "\ea18"; } .icon-bianjishuru:before { content: "\e919"; } .icon-shibai1:before { content: "\ea19"; } .icon-yingwenmoshi:before { content: "\e91a"; } .icon-shijian2:before { content: "\ea1a"; } .icon-jianpan-xianxing:before { content: "\e91b"; } .icon-shandian1:before { content: "\ea1b"; } .icon-jianpan:before { content: "\e91c"; } .icon-wode1:before { content: "\ea1c"; } .icon-rili:before { content: "\e91d"; } .icon-shouye2:before { content: "\ea1d"; } .icon-weichuqin:before { content: "\e91e"; } .icon-shouji1:before { content: "\ea1e"; } .icon-kaoqinchuqin:before { content: "\e91f"; } .icon-tanhao1:before { content: "\ea1f"; } .icon-paizhao:before { content: "\e920"; } .icon-shoucang2:before { content: "\ea20"; } .icon-paizhao-xianxing:before { content: "\e921"; } .icon-shuju1:before { content: "\ea21"; } .icon-tupian-xianxing:before { content: "\e922"; } .icon-wenda:before { content: "\ea22"; } .icon-tupian:before { content: "\e923"; } .icon-yanjing1:before { content: "\ea23"; } .icon-saomiao:before { content: "\e924"; } .icon-yingchengka1:before { content: "\ea24"; } .icon-xianshikejian:before { content: "\e925"; } .icon-xiangji1:before { content: "\ea25"; } .icon-suoding:before { content: "\e926"; } .icon-yingyuan1:before { content: "\ea26"; } .icon-yincangbukejian:before { content: "\e927"; } .icon-yinhangyouhui:before { content: "\ea27"; } .icon-jiesuo:before { content: "\e928"; } .icon-xiaoshi1:before { content: "\ea28"; } .icon-anzhuangshigong-xianxing:before { content: "\e929"; } .icon-yanchu1:before { content: "\ea29"; } .icon-shaixuanguolv:before { content: "\e92a"; } .icon-zengjia1:before { content: "\ea2a"; } .icon-anzhuangshigong:before { content: "\e92b"; } .icon-dianying1:before { content: "\ea2b"; } .icon-zhuxiaoguanji:before { content: "\e92c"; } .icon-youhuiquan1:before { content: "\ea2c"; } .icon-haoping-yuankuang:before { content: "\e92d"; } .icon-remen:before { content: "\ea2d"; } .icon-chaping-yuankuang:before { content: "\e92e"; } .icon-chuangzuo1:before { content: "\ea2e"; } .icon-chaping:before { content: "\e92f"; } .icon-haoping:before { content: "\e930"; } .icon-yiban:before { content: "\e931"; } .icon-manyi:before { content: "\e932"; } .icon-bumanyi:before { content: "\e933"; } .icon-liebiaoshitucaidan:before { content: "\e934"; } .icon-gonggeshitu:before { content: "\e935"; } .icon-Phoneshouji:before { content: "\e936"; } .icon-PCtaishiji:before { content: "\e937"; } .icon-PDAshouchigongzuoshebei:before { content: "\e938"; } .icon-jia-fangkuang:before { content: "\e939"; } .icon-jia-xianxingfangkuang:before { content: "\e93a"; } .icon-jia-xianxingyuankuang:before { content: "\e93b"; } .icon-jia-yuankuang:before { content: "\e93c"; } .icon-jian-fangkuang:before { content: "\e93d"; } .icon-jia:before { content: "\e93e"; } .icon-jian-yuankuang:before { content: "\e93f"; } .icon-jian:before { content: "\e940"; } .icon-jian-xianxingfangkuang:before { content: "\e941"; } .icon-zhengquewancheng-xianxingyuankuang:before { content: "\e942"; } .icon-zhengquewancheng-yuankuang:before { content: "\e943"; } .icon-zhengquewancheng:before { content: "\e944"; } .icon-jian-xianxingyuankuang:before { content: "\e945"; } .icon-cuowuguanbiquxiao-xianxingfangkuang:before { content: "\e946"; } .icon-cuowuguanbiquxiao-yuankuang:before { content: "\e947"; } .icon-cuowuguanbiquxiao-xianxingyuankuang:before { content: "\e948"; } .icon-cuowuguanbiquxiao:before { content: "\e949"; } .icon-cuowuguanbiquxiao-fangkuang:before { content: "\e94a"; } .icon-xinxi-xianxingyuankuang:before { content: "\e94b"; } .icon-xinxi:before { content: "\e94c"; } .icon-wenhao-xianxingyuankuang:before { content: "\e94d"; } .icon-wenhao:before { content: "\e94e"; } .icon-wenhao-yuankuang:before { content: "\e94f"; } .icon-xinxi-yuankuang:before { content: "\e950"; } .icon-gantanhao-sanjiaokuang:before { content: "\e951"; } .icon-gantanhao-yuankuang:before { content: "\e952"; } .icon-gantanhao-xianxingyuankuang:before { content: "\e953"; } .icon-gantanhao-xianxingsanjiaokuang:before { content: "\e954"; } .icon-gantanhao:before { content: "\e955"; } .icon-shangyiyehoutuifanhui-xianxingyuankuang:before { content: "\e956"; } .icon-shangyiyehoutuifanhui-yuankuang:before { content: "\e957"; } .icon-xiayiyeqianjinchakangengduo-xianxingyuankuang:before { content: "\e958"; } .icon-xiayiyeqianjinchakangengduo-yuankuang:before { content: "\e959"; } .icon-shangyiyehoutuifanhui:before { content: "\e95a"; } .icon-xiayiyeqianjinchakangengduo:before { content: "\e95b"; } .icon-xiangxiazhankai-xianxingyuankuang:before { content: "\e95c"; } .icon-xiangxiazhankai-yuankuang:before { content: "\e95d"; } .icon-xiangxiazhankai:before { content: "\e95e"; } .icon-xiangshangshouqi-yuankuang:before { content: "\e95f"; } .icon-xiangshangshouqi-xianxingyuankuang:before { content: "\e960"; } .icon-zhixiangzuo:before { content: "\e961"; } .icon-zhixiangyou:before { content: "\e962"; } .icon-zhixiangshang:before { content: "\e963"; } .icon-weixin2:before { content: "\e601"; } .icon-zhifubao:before { content: "\e600"; } .icon-qq:before { content: "\e62e"; } .icon-weixin:before { content: "\e60e"; } .icon-weixin1:before { content: "\e621"; } .icon-qq1:before { content: "\e607"; } .icon-qq2:before { content: "\e66a"; } .icon-umidd17:before { content: "\e603"; } .icon-electrical:before { content: "\e6d4"; } .icon-home:before { content: "\e6d7"; } .icon-electronics:before { content: "\e6da"; } .icon-gifts:before { content: "\e6db"; } .icon-lights:before { content: "\e6de"; } .icon-sports:before { content: "\e6e0"; } .icon-toys:before { content: "\e6e1"; } .icon-auto:before { content: "\e6e3"; } .icon-jewelry:before { content: "\e6e4"; } .icon-trade-assurance:before { content: "\e6e5"; } .icon-browse:before { content: "\e6e6"; } .icon-rfqqm:before { content: "\e6e7"; } .icon-rfqquantity:before { content: "\e6e8"; } .icon-atmaway:before { content: "\e6e9"; } .icon-rfq1:before { content: "\e6eb"; } .icon-scanning:before { content: "\e6ec"; } .icon-compare:before { content: "\e6ee"; } .icon-filter:before { content: "\e6f1"; } .icon-pin:before { content: "\e6f2"; } .icon-history:before { content: "\e6f3"; } .icon-productfeatures:before { content: "\e6f4"; } .icon-supplierfeatures:before { content: "\e6f5"; } .icon-similarproduct:before { content: "\e6f6"; } .icon-link:before { content: "\e6f7"; } .icon-cut:before { content: "\e6f8"; } .icon-navlist:before { content: "\e6fa"; } .icon-imagetext:before { content: "\e6fb"; } .icon-text:before { content: "\e6fc"; } .icon-move:before { content: "\e6fd"; } .icon-subtract:before { content: "\e6fe"; } .icon-dollar:before { content: "\e702"; } .icon-raw:before { content: "\e704"; } .icon-office:before { content: "\e705"; } .icon-agriculture:before { content: "\e707"; } .icon-machinery:before { content: "\e709"; } .icon-assessedbadge:before { content: "\e70a"; } .icon-gerenzhongxin:before { content: "\e70b"; } .icon-jifen:before { content: "\e70c"; } .icon-operation:before { content: "\e70e"; } .icon-remind1:before { content: "\e713"; } .icon-icondownload:before { content: "\e714"; } .icon-map:before { content: "\e715"; } .icon-bad:before { content: "\e716"; } .icon-good:before { content: "\e717"; } .icon-skip:before { content: "\e718"; } .icon-iconfontplay2:before { content: "\e719"; } .icon-iconfontstop:before { content: "\e71a"; } .icon-compass:before { content: "\e71b"; } .icon-security:before { content: "\e71c"; } .icon-share:before { content: "\e71d"; } .icon-store:before { content: "\e722"; } .icon-manageorder:before { content: "\e723"; } .icon-rejectedorder:before { content: "\e724"; } .icon-phone:before { content: "\e725"; } .icon-bussinessman:before { content: "\e726"; } .icon-shoes:before { content: "\e728"; } .icon-mobilephone:before { content: "\e72a"; } .icon-emailfilling:before { content: "\e72d"; } .icon-favoritesfilling:before { content: "\e730"; } .icon-accountfilling:before { content: "\e732"; } .icon-creditlevel:before { content: "\e735"; } .icon-creditlevelfilling:before { content: "\e736"; } .icon-exl:before { content: "\e73f"; } .icon-pdf:before { content: "\e740"; } .icon-zip:before { content: "\e741"; } .icon-sorting:before { content: "\e743"; } .icon-copy:before { content: "\e744"; } .icon-save:before { content: "\e747"; } .icon-inquirytemplate:before { content: "\e749"; } .icon-templatedefault:before { content: "\e74a"; } .icon-libra:before { content: "\e74c"; } .icon-survey1:before { content: "\e74e"; } .icon-ship:before { content: "\e74f"; } .icon-bussinesscard:before { content: "\e753"; } .icon-hot:before { content: "\e756"; } .icon-data:before { content: "\e757"; } .icon-trade:before { content: "\e758"; } .icon-onepage48:before { content: "\e75a"; } .icon-signboard:before { content: "\e75c"; } .icon-shuffling-banner:before { content: "\e75e"; } .icon-component:before { content: "\e75f"; } .icon-component-filling:before { content: "\e760"; } .icon-color:before { content: "\e761"; } .icon-color-filling:before { content: "\e7cd"; } .icon-favorites:before { content: "\e7ce"; } .icon-pic-filling:before { content: "\e802"; } .icon-RFQ:before { content: "\e803"; } .icon-RFQ-filling:before { content: "\e804"; } .icon-originalimage:before { content: "\e806"; } .icon-logistic:before { content: "\e811"; } .icon-Calculator:before { content: "\e812"; } .icon-video:before { content: "\e820"; } .icon-earth:before { content: "\e828"; } .icon-task-management:before { content: "\e829"; } .icon-trust:before { content: "\e82a"; } .icon-password:before { content: "\e82b"; } .icon-column:before { content: "\e839"; } .icon-apparel:before { content: "\e83a"; } .icon-bags:before { content: "\e83b"; } .icon-folder:before { content: "\e83c"; } .icon-column1:before { content: "\e83d"; } .icon-code:before { content: "\e842"; } .icon-RFQ-filling1:before { content: "\e843"; } .icon-customs-clearance:before { content: "\e863"; } .icon-good-filling:before { content: "\e866"; } .icon-camera:before { content: "\e86e"; } .icon-pin-fill:before { content: "\e87a"; } .icon-help-fill:before { content: "\e87b"; } .icon-add-account:before { content: "\e87c"; } .icon-listing-content:before { content: "\e87d"; } .icon-warehouse-delivery:before { content: "\e87e"; } .icon-customization:before { content: "\e87f"; } .icon-inspection:before { content: "\e880"; } .icon-packing-labeling:before { content: "\e881"; } .icon-online-tracking:before { content: "\e882"; } .icon-play-filling:before { content: "\e883"; } .icon-nosound-filling:before { content: "\e884"; } .icon-sound-filling:before { content: "\e885"; } .icon-electrical-equipment:before { content: "\e886"; } .icon-home-appliances:before { content: "\e887"; } .icon-furniture:before { content: "\e888"; } .icon-fashion-accessories:before { content: "\e889"; } .icon-security-protection:before { content: "\e88a"; } .icon-textile-products:before { content: "\e88b"; } .icon-tools-hardware:before { content: "\e88c"; } .icon-office-supplies:before { content: "\e88d"; } .icon-vehicles:before { content: "\e88e"; } .icon-all:before { content: "\e696"; } .icon-back:before { content: "\e697"; } .icon-cart:before { content: "\e698"; } .icon-category:before { content: "\e699"; } .icon-close:before { content: "\e69a"; } .icon-comments:before { content: "\e69b"; } .icon-cry:before { content: "\e69c"; } .icon-delete:before { content: "\e69d"; } .icon-edit:before { content: "\e69e"; } .icon-email:before { content: "\e69f"; } .icon-favorite:before { content: "\e6a0"; } .icon-form:before { content: "\e6a2"; } .icon-help:before { content: "\e6a3"; } .icon-information:before { content: "\e6a4"; } .icon-less:before { content: "\e6a5"; } .icon-moreunfold:before { content: "\e6a6"; } .icon-more:before { content: "\e6a7"; } .icon-pic:before { content: "\e6a8"; } .icon-qrcode:before { content: "\e6a9"; } .icon-refresh:before { content: "\e6aa"; } .icon-rfq:before { content: "\e6ab"; } .icon-search:before { content: "\e6ac"; } .icon-selected:before { content: "\e6ad"; } .icon-set:before { content: "\e6ae"; } .icon-smile:before { content: "\e6af"; } .icon-success:before { content: "\e6b1"; } .icon-survey:before { content: "\e6b2"; } .icon-training:before { content: "\e6b3"; } .icon-viewgallery:before { content: "\e6b4"; } .icon-viewlist:before { content: "\e6b5"; } .icon-warning:before { content: "\e6b6"; } .icon-wrong:before { content: "\e6b7"; } .icon-account:before { content: "\e6b8"; } .icon-add:before { content: "\e6b9"; } .icon-atm:before { content: "\e6ba"; } .icon-clock:before { content: "\e6bb"; } .icon-remind:before { content: "\e6bc"; } .icon-calendar:before { content: "\e6bf"; } .icon-attachment:before { content: "\e6c0"; } .icon-discount:before { content: "\e6c5"; } .icon-service:before { content: "\e6c7"; } .icon-print:before { content: "\e6c9"; } .icon-box:before { content: "\e6cb"; } .icon-process:before { content: "\e6ce"; } .icon-beauty:before { content: "\e6d2"; } ================================================ FILE: app/admin/t/tpl/style/css/style.css ================================================ ================================================ FILE: app/admin/t/tpl/style/css/xadmin.css ================================================ @charset "utf-8"; @import url(/static/common/layui/css/layui.css); *{ margin: 0px; padding: 0px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } a{ text-decoration: none; } html{ width: 100%; height: 100%; overflow-x:hidden; overflow-y:auto; } body{ width: 100%; min-height: 100%; } .login-bg{ /*background: #eeeeee url() 0 0 no-repeat;*/ background:url(../images/bg.png) no-repeat center; background-size: cover; overflow: hidden; } .login{ margin: 120px auto 0 auto; min-height: 420px; max-width: 420px; padding: 40px; background-color: #ffffff; margin-left: auto; margin-right: auto; border-radius: 4px; /* overflow-x: hidden; */ box-sizing: border-box; } .login a.logo{ display: block; height: 58px; width: 167px; margin: 0 auto 30px auto; background-size: 167px 42px; } .login .message { margin: 10px 0 0 -58px; padding: 18px 10px 18px 60px; background: #189F92; position: relative; color: #fff; font-size: 16px; } .login #darkbannerwrap { background: url(../images/aiwrap.png); width: 18px; height: 10px; margin: 0 0 20px -58px; position: relative; } .login input[type=text], .login input[type=file], .login input[type=password], .login input[type=email], select { border: 1px solid #DCDEE0; vertical-align: middle; border-radius: 3px; height: 50px; padding: 0px 16px; font-size: 14px; color: #555555; outline:none; width:100%; box-sizing: border-box; } .login input[type=text]:focus, .login input[type=file]:focus, .login input[type=password]:focus, .login input[type=email]:focus, select:focus { border: 1px solid #27A9E3; } .login input[type=submit], .login input[type=button]{ display: inline-block; vertical-align: middle; padding: 12px 24px; margin: 0px; font-size: 18px; line-height: 24px; text-align: center; white-space: nowrap; vertical-align: middle; cursor: pointer; color: #ffffff; background-color: #189F92; border-radius: 3px; border: none; -webkit-appearance: none; outline:none; width:100%; } .login hr { background: #fff url() 0 0 no-repeat; } .login hr.hr15 { height: 15px; border: none; margin: 0px; padding: 0px; width: 100%; } .login hr.hr20 { height: 20px; border: none; margin: 0px; padding: 0px; width: 100%; } .x-body{ padding: 20px; } .x-nav{ padding: 0 20px; position: relative; z-index: 99; border-bottom: 1px solid #e5e5e5; line-height: 39px; height: 39px; overflow: hidden; } xblock{ display: block; padding: 5px; line-height: 22px; border-radius: 0 2px 2px 0; background-color: #f2f2f2; } .x-right{ float: right; } .x-so{ /*text-align: center;*/ /*background: #f2f2f2 url() 0 0 no-repeat;*/ margin-bottom: 20px; } .x-so input.layui-input{ width: 150px; } .x-so .layui-form-label{ display: inline-block; } .x-so input.layui-input,.x-so input.layui-btn{ display: inline-block; } .x-red{ color: red; } .x-a{ color: #1AA093; } .x-a:hover{ color: #127F74; } .x-sort{ height: 30px; } .x-show{ cursor: pointer; } .layui-form-switch{ margin-top: 0px; } .layui-input:focus, .layui-textarea:focus { border-color: #189f92!important; } .page{ margin-top: 20px; text-align: center; } .page a{ display: inline-block; background: #fff url() 0 0 no-repeat; color: #888; padding: 5px 10px; height: 20px; line-height: 20px; min-width: 15px; border: 1px solid #E2E2E2; } .page span{ display: inline-block; padding: 10px; min-width: 15px; border: 1px solid #E2E2E2; } .page span.current{ display: inline-block; background: #009688 url() 0 0 no-repeat; color: #fff; padding: 10px; min-width: 15px; border: 1px solid #009688; } .page .pagination li{ display: inline-block; margin-right: 5px; text-align: center; } .page .pagination li.active span{ background: #009688 url() 0 0 no-repeat; color: #fff; border: 1px solid #009688; } /*登录样式*/ /*头部*/ .container{ width: 100%; height: 60px; background-color: #009688; border-bottom: 1px solid rgba(255, 255, 255, 0.2); } .container .logo a{ float: left; color: #fff; font-size: 18px; padding-left: 30px; line-height: 60px; width: 170px; } .container .right{ background-color:rgba(0,0,0,0); float: right; } .container .left_open{ height: 60px; float: left; } .container .left_open i{ display: block; background: rgba(255,255,255,0.1) url() 0 0 no-repeat; color: #fff; width: 32px; height: 32px; line-height: 32px; border-radius: 3px; text-align: center; margin-top: 15px; cursor: pointer; } .container .left_open i:hover{ background: rgba(255,255,255,0.3) url() 0 0 no-repeat; } .container .left{ background-color:rgba(0,0,0,0); float: left; } .container .layui-nav-item{ line-height: 60px; } .container .layui-nav-item a i.iconfont{ padding-right:10px; } .container .layui-nav-child{ top: 60px; } .container .layui-nav-child i{ margin-right: 10px; } .layui-nav .layui-nav-item a{ color: #fff; cursor: pointer; } .layui-nav .layui-nav-child a{ color: #333; cursor: pointer; } .left-nav{ position: absolute; top: 60px; left: 0; z-index: 2; background-color: #393D49; color: #fff; width: 200px; max-width: 200px; overflow-x:hidden; border-right: 1px solid #e5e5e5; overflow:hidden; /*width: 0px;*/ } .left-nav #nav li{ display: block; width: 100%; /* line-height: 45px;*/ } ul.sub-menu li:hover { background-color: #4E5465; } .sub-menu li a{ color: rgba(255,255,255,.7); } .left-nav #nav li:hover > a{ /*color: blue;*/ } .left-nav #nav .current{ background-color: #009688; color: #fff; } .left-nav #nav .current a{ color: #fff; } .sub-menu li{ background-color: rgba(0, 0, 0, 0.3); } li.open a { color: #fff; } .left-nav #nav li a{ font-size: 14px; padding: 12px 5px 12px 30px; display: block; cursor: pointer; color: rgba(255,255,255,.7); } .left-nav #nav li a cite{ font-size: 14px; } .left-nav #nav li .sub-menu{ display: none; background-color: rgba(0,0,0,.3)!important; } .left-nav #nav li .opened{ display: block; } .left-nav #nav li .opened:hover{ /*background: #fff url() 0 0 no-repeat;*/ } .left-nav #nav li .opened .current{ } .left-nav #nav li .sub-menu li:hover{ /*color: blue;*/ /*background: #fff url() 0 0 no-repeat;*/ } .left-nav #nav li .sub-menu li a{ padding: 12px 15px 12px 60px; font-size: 14px; cursor: pointer; } .left-nav #nav li .sub-menu li .sub-menu li a{ padding-left: 60px; } .left-nav #nav li .sub-menu li a:hover{ /* color: #009688;*/ } .left-nav #nav li .sub-menu li a i{ font-size: 12px; } .left-nav #nav li a i{ padding-right: 10px; line-height: 14px; } .left-nav #nav li .nav_right{ float: right; font-size: 16px; padding-right: 10px; } .x-slide_left { width: 17px; height: 61px; background: url(../images/icon.png) 0 0 no-repeat; position: absolute; top: 200px; left: 221px; cursor: pointer; z-index: 3; } .page-content{ position: absolute; top: 60px; right: 0; bottom: 42px; left: 200px; overflow: hidden; z-index: 1; } .page-content-bg{ position: absolute; top: 60px; right: 0; bottom: 42px; left: 221px; background: rgba(0,0,0,0.5); url() 0 0 no-repeat; overflow: hidden; z-index: 100; display: none; } .page-content .tab{ height: 100%; width: 100%; background: #EFEEF0 url() 0 0 no-repeat; margin: 0px; } .page-content .layui-tab-title{ /*padding-top: 5px;*/ height: 35px; background: #EFEEF0 url() 0 0 no-repeat; position: relative; z-index: 100; } .page-content .layui-tab-title li.home i{ padding-right: 5px; } .page-content .layui-tab-title li.home .layui-tab-close{ display: none; } .page-content .layui-tab-title li{ line-height: 35px; } .page-content .layui-tab-title .layui-this:after{ height: 36px; } .page-content .layui-tab-title li .layui-tab-close{ border-radius: 50%; } .page-content .layui-tab-title .layui-this{ background: #fff; } .page-content .layui-tab-bar{ height:34px; line-height: 35px; } .page-content .layui-tab-content{ position: absolute; top: 36px; bottom: 0px; width: 100%; background: #fff; padding: 0px; overflow: hidden; } .page-content .layui-tab-content .layui-tab-item{ width: 100%; height: 100%; } .page-content .layui-tab-content .layui-tab-item iframe{ width: 100%; height: 100%; } .x-admin-carousel,.layui-carousel,.x-admin-carousel>[carousel-item]>* { background-color:#fff } .x-admin-backlog .x-admin-backlog-body { display:block; padding:10px 15px; background-color:#f8f8f8; color:#999; border-radius:2px; transition:all .3s; -webkit-transition:all .3s } .x-admin-backlog-body h3 { padding-bottom:10px; font-size:12px } .x-admin-backlog-body p cite { font-style:normal; font-size:30px; font-weight:300; color:#009688 } .x-admin-backlog-body:hover { background-color:#CFCFCF; color:#888 } .welcome-footer{padding: 30px 0; line-height: 30px; text-align: center; background-color: #eee; color: #666; font-weight: 300;} body .layui-layout-admin .footer-demo{height: auto; padding: 15px 0; line-height: 26px;} .welcome-footer a{padding: 0 5px;} table th, table td { word-break: break-all; } .footer{ position: fixed; bottom: 0px; width: 100%; background-color: #009688; border-top: 1px solid rgba(255, 255, 255, 0.2); line-height: 41px; color: #fff; /*padding-left: 10px;*/ } .footer .copyright{ margin-left: 10px; } @media screen and (max-width: 768px){ .fast-add{ display: none; } .layui-nav .to-index{ display: none; } .container .logo a{ width: 140px; } .container .left_open { /*float: right;*/ } .left-nav{ left: -221px; } .page-content{ left: 0px; } .page-content .layui-tab-content .layui-tab-item{ -webkit-overflow-scrolling: touch; overflow-y: scroll; } .x-so input.layui-input{ width: 100%; margin: 10px; } } @media screen and (min-width:768px){ th { white-space: nowrap; } } /**右键菜单*/ .rightmenu { position: absolute; width: 110px; z-index: 9999; display: none; background-color: #fff; padding: 2px; color: #333; border: 1px solid #eee; border-radius: 2px; cursor: pointer; } .rightmenu li { text-align: center; display: block; height: 30px; line-height: 32px; } .rightmenu li:hover { background-color: #666; color: #fff; } .cmdlist-container img { width: 100%; } .cmdlist-text .txteax { font-size: 14px; } .cmdlist-text .txteax b { margin-right: 20px; } .cmdlist-text .txteax p { display: inline-block; } .cmdlist-text .flow { text-align: right; float: right; } .layui-card-header .layui-a-tips { position: absolute; right: 15px; color: #01AAED; } .layuiadmin-card-status dd { padding: 15px 0; border-bottom: 1px solid #EEE; display: -webkit-flex; display: flex; } .layuiadmin-card-status dd div.layui-status-img, .layuiadmin-card-team .layui-team-img { width: 32px; height: 32px; border-radius: 50%; background-color: #009688; margin-right: 15px; } .layuiadmin-card-status dd div.layui-status-img a { width: 100%; height: 100%; display: inline-block; text-align: center; line-height: 32px; } .layuiadmin-card-status dd div.layui-status-img img, .layuiadmin-card-team .layui-team-img img { width: 50%; height: 50%; } .layuiadmin-card-status dd div a { color: #01AAED; } .layuiadmin-card-status { padding: 0 10px 10px; } .layuiadmin-card-status li { position: relative; padding: 10px 0; border-bottom: 1px solid #EEE; } .layuiadmin-card-status li h3 { padding-bottom: 5px; font-weight: 700; } .layuiadmin-card-status li p { padding-bottom: 10px; } .layuiadmin-card-status li>span { color: #999; } .layuiadmin-home2-usernote .layuiadmin-reply { position: absolute; right: 0; bottom: 12px; } .cmdlist-text .info { height: 40px; font-size: 14px; line-height: 20px; width: 100%; overflow: hidden; color: #666; margin-bottom: 10px; } .layui-nav-bar {height: 3px;} .page-content .layui-tab-content,.x-body {background: #f7fcff!important ;} .page-content .tab {background: #f7fcff!important ;} .layui-bg-black { background: #333951!important ;} .left-nav { top:60px!important ;border: none!important;} .left-nav #nav li .sub-menu {background: #333951!important ;} ul.sub-menu li:hover {background: #02072c!important ;} .container .logo a{ background: #212844 ;} .left-nav #nav li a {color: #fff;} .container{ background-color: #212844;} .container .left_open {margin-left: 20px;} .page-content .layui-tab-title { padding-top: 10px;padding-left: 15px;} .layui-tab-title li {background: #d8e1f4;border-top-left-radius: 6px!important;border-top-right-radius: 6px!important;border: none;margin-right: 8px;} .layui-tab-title .layui-this:after {border-top-left-radius: 6px!important;border-top-right-radius: 6px!important;} .layui-tab-title .layui-this {background: #f6f7f9!important;} .x-nav {background: #f6f7f9!important;} .page-content .layui-tab-title{background: #28304e;} .page-content { top:60px;bottom: 0;} .x-admin-backlog-body p cite {color: #2b9ef7;} .page-content .layui-tab-content {top:50px} .left-nav #nav .current {background: #02072c;} .layui-form-onswitch {background: #10d0b7;border-color: #10d0b7;} xblock {background: none;} xblock .layui-form-item {margin-bottom: 0;} xblock .layui-form-item .layui-form-switch {margin-top: 6px;} .layui-bg-green {background: #10d0bb!important;} .active a {background-color: #2b9ef7!important;} .layui-btn-primary ,.layui-btn-primary:hover{color: #fff!important;} .layui-table-cell .layui-badge {background: #f76f63 !important;} .layui-table-cell .layui-bg-black {background: #b690f3 !important;} .layui-table-cell .layui-bg-green {background: #10d0bb !important;} .layui-laypage .layui-laypage-curr .layui-laypage-em {background-color: #2b9ef7!important;} .layui-form-item .layui-input-inline { float: left; margin-right: 10px; } #jizhitj{ position: fixed; bottom: 10px; z-index: 9999; width: 100%; margin-bottom: 10px; } .layui-form-select dl { z-index: 999999; } #jizhitj .layui-btn{padding:0 40px;border-radius: 6px;} .x-body .layui-tab-content {background: #fff;padding:20px 30px;} .x-body .layui-tab-title .layui-this {background: #fff !important;} .x-body .layui-tab-title {border: none!important;} .x-body .layui-tab-content ,.layui-card {box-shadow: 2px 2px 10px rgba(0,0,0,.1)!important;} .x-body .layui-fluid {padding: 0;} .x-nav .layui-btn { line-height: 38px!important;margin-top: 0!important;} .layui-card .layui-card {box-shadow:none!important;} .x-so {margin-bottom: 0;} .layui-collapse {margin-bottom: 20px;background: #fff;} .layui-btn {background: #2b9ef7;} .layui-btn-warm {background: #fdad4e;} .layui-btn-danger {background: #f46f5e;} .layui-btn-normal {background: #10d0bb;} .layui-colla-title,.layui-table tbody tr:hover, .layui-table thead tr, .layui-table-click, .layui-table-header, .layui-table-hover, .layui-table-mend, .layui-table-patch, .layui-table-tool, .layui-table-total, .layui-table-total tr, .layui-table[lay-even] tr:nth-child(even) {background: #f7f8fa;} .x-admin-backlog-body {border-radius: 6px!important;} .x-admin-backlog-body:hover {background: #2b9ef7;color: #fff;} .x-admin-backlog-body:hover p cite {color: #fff;} .layui-tab-brief>.layui-tab-title .layui-this {color: #000;} .layui-tab-brief>.layui-tab-title .layui-this::after {display: none;} .layui-btn-primary {border: none;} .layui-form-select dl dd.layui-this {background: #2b9ef7;} .layui-input:focus, .layui-textarea:focus { border-color: #2b9ef7!important;} .layui-colla-item input {margin-left: 5px;} .layui-colla-item br {display: none;} .layui-tab-title li .layui-tab-close { color: #848484;} .login-bg { position: relative; /* 美女大图背景 background: url(http://api.btstu.cn/sjbz/?lx=meizi) no-repeat center; background-size: cover; */ background: -webkit-gradient(linear, left bottom, left top, from(#3a485a), to(#607089)); background: linear-gradient(0deg, #3a485a 0%, #607089 100%); /* 灰色渐变大背景 */ } /* 美女大图虚化 */ .login-bg:after{ content: ""; width:100%; height:100%; position: absolute; left:0; top:0; background: inherit; filter: blur(10px); z-index: 2;} .login {z-index: 999;position: relative;-webkit-box-shadow: 0px 20px 80px 0px rgba(0,0,0,0.3); box-shadow: 0px 20px 80px 0px rgba(0,0,0,0.3);} .login #darkbannerwrap {background: none;} .login .message { padding: 0 10px; margin:0;text-align: center;background: none;color: #000;font-weight: bold;font-size: 22px;} .login hr {background: none; } .login input[type=text], .login input[type=file], .login input[type=password], .login input[type=email], select {border-radius: 6px;} .login input[type=submit] {background: #2b9ef7;} .login { min-height: 300px;border-radius: 6px;} ul#nav { margin-top: 16px; } .layui-table-tool .layui-input{ height: 32px; line-height: 32px; border-width: 1px; border-style: solid; background-color: #fff; border-radius: 2px; font-size:12px; } .active a{ background: #f00; color: #fff;} .upload-icon-img { padding-right: 8px; } ================================================ FILE: app/admin/t/tpl/style/fonts/demo.css ================================================ /* Logo 字体 */ @font-face { font-family: "iconfont logo"; src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); } .logo { font-family: "iconfont logo"; font-size: 160px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* tabs */ .nav-tabs { position: relative; } .nav-tabs .nav-more { position: absolute; right: 0; bottom: 0; height: 42px; line-height: 42px; color: #666; } #tabs { border-bottom: 1px solid #eee; } #tabs li { cursor: pointer; width: 100px; height: 40px; line-height: 40px; text-align: center; font-size: 16px; border-bottom: 2px solid transparent; position: relative; z-index: 1; margin-bottom: -1px; color: #666; } #tabs .active { border-bottom-color: #f00; color: #222; } .tab-container .content { display: none; } /* 页面布局 */ .main { padding: 30px 100px; width: 960px; margin: 0 auto; } .main .logo { color: #333; text-align: left; margin-bottom: 30px; line-height: 1; height: 110px; margin-top: -50px; overflow: hidden; *zoom: 1; } .main .logo a { font-size: 160px; color: #333; } .helps { margin-top: 40px; } .helps pre { padding: 20px; margin: 10px 0; border: solid 1px #e7e1cd; background-color: #fffdef; overflow: auto; } .icon_lists { width: 100% !important; overflow: hidden; *zoom: 1; } .icon_lists li { width: 100px; margin-bottom: 10px; margin-right: 20px; text-align: center; list-style: none !important; cursor: default; } .icon_lists li .code-name { line-height: 1.2; } .icon_lists .icon { display: block; height: 100px; line-height: 100px; font-size: 42px; margin: 10px auto; color: #333; -webkit-transition: font-size 0.25s linear, width 0.25s linear; -moz-transition: font-size 0.25s linear, width 0.25s linear; transition: font-size 0.25s linear, width 0.25s linear; } .icon_lists .icon:hover { font-size: 100px; } .icon_lists .svg-icon { /* 通过设置 font-size 来改变图标大小 */ width: 1em; /* 图标和文字相邻时,垂直对齐 */ vertical-align: -0.15em; /* 通过设置 color 来改变 SVG 的颜色/fill */ fill: currentColor; /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 normalize.css 中也包含这行 */ overflow: hidden; } .icon_lists li .name, .icon_lists li .code-name { color: #666; } /* markdown 样式 */ .markdown { color: #666; font-size: 14px; line-height: 1.8; } .highlight { line-height: 1.5; } .markdown img { vertical-align: middle; max-width: 100%; } .markdown h1 { color: #404040; font-weight: 500; line-height: 40px; margin-bottom: 24px; } .markdown h2, .markdown h3, .markdown h4, .markdown h5, .markdown h6 { color: #404040; margin: 1.6em 0 0.6em 0; font-weight: 500; clear: both; } .markdown h1 { font-size: 28px; } .markdown h2 { font-size: 22px; } .markdown h3 { font-size: 16px; } .markdown h4 { font-size: 14px; } .markdown h5 { font-size: 12px; } .markdown h6 { font-size: 12px; } .markdown hr { height: 1px; border: 0; background: #e9e9e9; margin: 16px 0; clear: both; } .markdown p { margin: 1em 0; } .markdown>p, .markdown>blockquote, .markdown>.highlight, .markdown>ol, .markdown>ul { width: 80%; } .markdown ul>li { list-style: circle; } .markdown>ul li, .markdown blockquote ul>li { margin-left: 20px; padding-left: 4px; } .markdown>ul li p, .markdown>ol li p { margin: 0.6em 0; } .markdown ol>li { list-style: decimal; } .markdown>ol li, .markdown blockquote ol>li { margin-left: 20px; padding-left: 4px; } .markdown code { margin: 0 3px; padding: 0 5px; background: #eee; border-radius: 3px; } .markdown strong, .markdown b { font-weight: 600; } .markdown>table { border-collapse: collapse; border-spacing: 0px; empty-cells: show; border: 1px solid #e9e9e9; width: 95%; margin-bottom: 24px; } .markdown>table th { white-space: nowrap; color: #333; font-weight: 600; } .markdown>table th, .markdown>table td { border: 1px solid #e9e9e9; padding: 8px 16px; text-align: left; } .markdown>table th { background: #F7F7F7; } .markdown blockquote { font-size: 90%; color: #999; border-left: 4px solid #e9e9e9; padding-left: 0.8em; margin: 1em 0; } .markdown blockquote p { margin: 0; } .markdown .anchor { opacity: 0; transition: opacity 0.3s ease; margin-left: 8px; } .markdown .waiting { color: #ccc; } .markdown h1:hover .anchor, .markdown h2:hover .anchor, .markdown h3:hover .anchor, .markdown h4:hover .anchor, .markdown h5:hover .anchor, .markdown h6:hover .anchor { opacity: 1; display: inline-block; } .markdown>br, .markdown>p>br { clear: both; } .hljs { display: block; background: white; padding: 0.5em; color: #333333; overflow-x: auto; } .hljs-comment, .hljs-meta { color: #969896; } .hljs-string, .hljs-variable, .hljs-template-variable, .hljs-strong, .hljs-emphasis, .hljs-quote { color: #df5000; } .hljs-keyword, .hljs-selector-tag, .hljs-type { color: #a71d5d; } .hljs-literal, .hljs-symbol, .hljs-bullet, .hljs-attribute { color: #0086b3; } .hljs-section, .hljs-name { color: #63a35c; } .hljs-tag { color: #333333; } .hljs-title, .hljs-attr, .hljs-selector-id, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo { color: #795da3; } .hljs-addition { color: #55a532; background-color: #eaffea; } .hljs-deletion { color: #bd2c00; background-color: #ffecec; } .hljs-link { text-decoration: underline; } /* 代码高亮 */ /* PrismJS 1.15.0 https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ /** * prism.js default theme for JavaScript, CSS and HTML * Based on dabblet (http://dabblet.com) * @author Lea Verou */ code[class*="language-"], pre[class*="language-"] { color: black; background: none; text-shadow: 0 1px white; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { text-shadow: none; background: #b3d4fc; } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { text-shadow: none; background: #b3d4fc; } @media print { code[class*="language-"], pre[class*="language-"] { text-shadow: none; } } /* Code blocks */ pre[class*="language-"] { padding: 1em; margin: .5em 0; overflow: auto; } :not(pre)>code[class*="language-"], pre[class*="language-"] { background: #f5f2f0; } /* Inline code */ :not(pre)>code[class*="language-"] { padding: .1em; border-radius: .3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: slategray; } .token.punctuation { color: #999; } .namespace { opacity: .7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #905; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #690; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #9a6e3a; background: hsla(0, 0%, 100%, .5); } .token.atrule, .token.attr-value, .token.keyword { color: #07a; } .token.function, .token.class-name { color: #DD4A68; } .token.regex, .token.important, .token.variable { color: #e90; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } ================================================ FILE: app/admin/t/tpl/style/fonts/iconfont.css ================================================ @font-face { font-family: "iconfont"; /* Project id 1357552 */ src: url('iconfont.woff2?t=1638967197290') format('woff2'), url('iconfont.woff?t=1638967197290') format('woff'), url('iconfont.ttf?t=1638967197290') format('truetype'); } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .icon-xiangshangshouqi:before { content: "\e964"; } .icon-zhixiangxia:before { content: "\e965"; } .icon-diyiye:before { content: "\e966"; } .icon-zuihouye:before { content: "\e967"; } .icon-biaotou-zhengxu:before { content: "\e968"; } .icon-biaotou-kepaixu:before { content: "\e969"; } .icon-biaotou-daoxu:before { content: "\e96a"; } .icon-huidingbu:before { content: "\e96b"; } .icon-xiangzuojiaohuan:before { content: "\e96c"; } .icon-xianghujiaohuan:before { content: "\e96d"; } .icon-xiangyoujiaohuan:before { content: "\e96e"; } .icon-shuzhixiajiang:before { content: "\e96f"; } .icon-quanping:before { content: "\e970"; } .icon-hengxiangzhankai:before { content: "\e971"; } .icon-shuzhishangsheng:before { content: "\e972"; } .icon-tuichuquanping:before { content: "\e973"; } .icon-hengxiangshouqi:before { content: "\e974"; } .icon-shuaxin:before { content: "\e975"; } .icon-tongbu:before { content: "\e976"; } .icon-jiazailoading-A:before { content: "\e977"; } .icon-jiazailoading-B:before { content: "\e978"; } .icon-weizhi-xianxing:before { content: "\e979"; } .icon-weizhi:before { content: "\e97a"; } .icon-daohang:before { content: "\e97b"; } .icon-dingwei:before { content: "\e97c"; } .icon-jiankongshexiangtou-xianxing:before { content: "\e97d"; } .icon-tuodiantu:before { content: "\e97e"; } .icon-jiankongshexiangtou:before { content: "\e97f"; } .icon-leidatance:before { content: "\e980"; } .icon-baobiao:before { content: "\e981"; } .icon-bingtu-xianxing:before { content: "\e982"; } .icon-baobiao-xianxing:before { content: "\e983"; } .icon-bingtu:before { content: "\e984"; } .icon-tiaoxingtu:before { content: "\e985"; } .icon-tiaoxingtu-xianxing:before { content: "\e986"; } .icon-zhexiantu:before { content: "\e987"; } .icon-zhexiantu-xianxing:before { content: "\e988"; } .icon-zhinanzhidao-xianxing:before { content: "\e989"; } .icon-ditu:before { content: "\e98a"; } .icon-zhinanzhidao:before { content: "\e98b"; } .icon-tousu:before { content: "\e98c"; } .icon-xunjianjianyan:before { content: "\e98d"; } .icon-dianpu:before { content: "\e98e"; } .icon-yunshuzhongwuliu-xianxing:before { content: "\e88f"; } .icon-dianpu-xianxing:before { content: "\e98f"; } .icon-yunshuzhongwuliu:before { content: "\e890"; } .icon-kuaidiyuan:before { content: "\e990"; } .icon-baoguofahuo:before { content: "\e891"; } .icon-kuaidiyuan-xianxing:before { content: "\e991"; } .icon-baoguofahuo-xianxing:before { content: "\e892"; } .icon-daikuan-xianxing:before { content: "\e992"; } .icon-chaibaoguoqujian:before { content: "\e893"; } .icon-huankuan-xianxing:before { content: "\e993"; } .icon-chaibaoguoqujian-xianxing:before { content: "\e894"; } .icon-tuikuan-xi:before { content: "\e994"; } .icon-zitigui:before { content: "\e895"; } .icon-rili-xianxing-xi:before { content: "\e995"; } .icon-zitigui-xianxing:before { content: "\e896"; } .icon-jisuanqilishuai-xianxing-xi:before { content: "\e996"; } .icon-caigou-xianxing:before { content: "\e897"; } .icon-yonghuziliao:before { content: "\e997"; } .icon-caigou:before { content: "\e898"; } .icon-yonghuziliao-xianxing:before { content: "\e998"; } .icon-shangpin:before { content: "\e899"; } .icon-pifuzhuti:before { content: "\e999"; } .icon-shangpin-xianxing:before { content: "\e89a"; } .icon-pifuzhuti-xianxing:before { content: "\e99a"; } .icon-peizaizhuangche:before { content: "\e89b"; } .icon-diamond:before { content: "\e99b"; } .icon-peizaizhuangche-xianxing:before { content: "\e89c"; } .icon-diamond-o:before { content: "\e99c"; } .icon-zhiliang-xianxing:before { content: "\e89d"; } .icon-sheji-xianxing:before { content: "\e99d"; } .icon-zhiliang:before { content: "\e89e"; } .icon-kaifa-xianxing:before { content: "\e99e"; } .icon-anquanbaozhang:before { content: "\e89f"; } .icon-yinhangqia:before { content: "\e99f"; } .icon-anquanbaozhang-xianxing:before { content: "\e8a0"; } .icon-yinhangqia-xianxing:before { content: "\e9a0"; } .icon-cangkucangchu:before { content: "\e8a1"; } .icon-hongbao-xianxing:before { content: "\e9a1"; } .icon-cangkucangchu-xianxing:before { content: "\e8a2"; } .icon-hongbao:before { content: "\e9a2"; } .icon-zhongzhuanzhan-xianxing:before { content: "\e8a3"; } .icon-aixin:before { content: "\e9a3"; } .icon-zhongzhuanzhan:before { content: "\e8a4"; } .icon-bianji:before { content: "\e9a4"; } .icon-kucun-xianxing:before { content: "\e8a5"; } .icon-Dyanjing:before { content: "\e9a5"; } .icon-kucun:before { content: "\e8a6"; } .icon-caidan:before { content: "\e9a6"; } .icon-moduanwangdian-xianxing:before { content: "\e8a7"; } .icon-anquan:before { content: "\e9a7"; } .icon-moduanwangdian:before { content: "\e8a8"; } .icon-bangzhu:before { content: "\e9a8"; } .icon-qianshoushenpitongguo-xianxing:before { content: "\e8a9"; } .icon-buganxingqu:before { content: "\e9a9"; } .icon-qianshoushenpitongguo:before { content: "\e8aa"; } .icon-bofangjilu:before { content: "\e9aa"; } .icon-juqianshou-xianxing:before { content: "\e8ab"; } .icon-chuangzuo:before { content: "\e9ab"; } .icon-juqianshou:before { content: "\e8ac"; } .icon-chenggong:before { content: "\e9ac"; } .icon-jijianfasong-xianxing:before { content: "\e8ad"; } .icon-ceshi:before { content: "\e9ad"; } .icon-jijianfasong:before { content: "\e8ae"; } .icon-dianhua1:before { content: "\e9ae"; } .icon-qiyeyuanquwuye:before { content: "\e8af"; } .icon-dianzan:before { content: "\e9af"; } .icon-qiyeyuanquwuye-xianxing:before { content: "\e8b0"; } .icon-dingwei1:before { content: "\e9b0"; } .icon-jiesuan-xianxing:before { content: "\e8b1"; } .icon-diantong_guan:before { content: "\e9b1"; } .icon-jiesuan:before { content: "\e8b2"; } .icon-dianying:before { content: "\e9b2"; } .icon-jifen1:before { content: "\e8b3"; } .icon-ditu1:before { content: "\e9b3"; } .icon-jifen-xianxing:before { content: "\e8b4"; } .icon-diantong_kai:before { content: "\e9b4"; } .icon-youhuijuan-xianxing:before { content: "\e8b5"; } .icon-dianyingpiao:before { content: "\e9b5"; } .icon-ziliaoshouce:before { content: "\e8b6"; } .icon-dingdan:before { content: "\e9b6"; } .icon-ziliaoshouce-xianxing:before { content: "\e8b7"; } .icon-gengduo:before { content: "\e9b7"; } .icon-youhuijuan:before { content: "\e8b8"; } .icon-fanbei:before { content: "\e9b8"; } .icon-guize:before { content: "\e8b9"; } .icon-faxian:before { content: "\e9b9"; } .icon-danju-xianxing:before { content: "\e8ba"; } .icon-ertongpiao:before { content: "\e9ba"; } .icon-zuzhijiagoujiekou:before { content: "\e8bb"; } .icon-gongyi:before { content: "\e9bb"; } .icon-danju:before { content: "\e8bc"; } .icon-hongbao1:before { content: "\e9bc"; } .icon-chuangjiandanju-xianxing:before { content: "\e8bd"; } .icon-fuzhi:before { content: "\e9bd"; } .icon-chuangjiandanju:before { content: "\e8be"; } .icon-fenxiang:before { content: "\e9be"; } .icon-zhangdan-xianxing:before { content: "\e8bf"; } .icon-huatifuhao:before { content: "\e9bf"; } .icon-zhangdan:before { content: "\e8c0"; } .icon-huiyuan:before { content: "\e9c0"; } .icon-tijikongjian:before { content: "\e8c1"; } .icon-aliyu:before { content: "\e9c1"; } .icon-tijikongjian-xianxing:before { content: "\e8c2"; } .icon-jiju:before { content: "\e9c2"; } .icon-yewu-xianxing:before { content: "\e8c3"; } .icon-jianshao:before { content: "\e9c3"; } .icon-yewu:before { content: "\e8c4"; } .icon-kabao:before { content: "\e9c4"; } .icon-yingyongchengxu-xianxing:before { content: "\e8c5"; } .icon-huati:before { content: "\e9c5"; } .icon-yingyongchengxu:before { content: "\e8c6"; } .icon-guanzhu:before { content: "\e9c6"; } .icon-biaozhun:before { content: "\e8c7"; } .icon-maiyizengyi:before { content: "\e9c7"; } .icon-biaozhun-xianxing:before { content: "\e8c8"; } .icon-mima:before { content: "\e9c8"; } .icon-quanxianyuechi:before { content: "\e8c9"; } .icon-nan:before { content: "\e9c9"; } .icon-quanxianyuechi-xianxing:before { content: "\e8ca"; } .icon-nv:before { content: "\e9ca"; } .icon-ziyuan:before { content: "\e8cb"; } .icon-lihe:before { content: "\e9cb"; } .icon-ziyuan-xianxing:before { content: "\e8cc"; } .icon-paihangbang:before { content: "\e9cc"; } .icon-mobankuangjia-xianxing:before { content: "\e8cd"; } .icon-lipinka:before { content: "\e9cd"; } .icon-mobankuangjia:before { content: "\e8ce"; } .icon-pengyouquan:before { content: "\e9ce"; } .icon-xinwenzixun:before { content: "\e8cf"; } .icon-mingxinghuodong:before { content: "\e9cf"; } .icon-xinwenzixun-xianxing:before { content: "\e8d0"; } .icon-qupiao:before { content: "\e9d0"; } .icon-hezuoguanxi-xianxing:before { content: "\e8d1"; } .icon-saoyisao:before { content: "\e9d1"; } .icon-hezuoguanxi:before { content: "\e8d2"; } .icon-rili1:before { content: "\e9d2"; } .icon-xianlu:before { content: "\e8d3"; } .icon-pinglun:before { content: "\e9d3"; } .icon--fuwu-xianxing:before { content: "\e8d4"; } .icon-qinghuiyuan:before { content: "\e9d4"; } .icon--fuwu:before { content: "\e8d5"; } .icon-riqian:before { content: "\e9d5"; } .icon--kefu-xianxing:before { content: "\e8d6"; } .icon-shandian:before { content: "\e9d6"; } .icon--kefu:before { content: "\e8d7"; } .icon-shaixuan:before { content: "\e9d7"; } .icon--guoji-xianxing:before { content: "\e8d8"; } .icon-shangquan:before { content: "\e9d8"; } .icon--guoji:before { content: "\e8d9"; } .icon-shanchu:before { content: "\e9d9"; } .icon-haiguan-xianxing:before { content: "\e8da"; } .icon-shezhi1:before { content: "\e9da"; } .icon-haiguan:before { content: "\e8db"; } .icon-shangchuan:before { content: "\e9db"; } .icon-touchengkongyun:before { content: "\e8dc"; } .icon-shequ:before { content: "\e9dc"; } .icon-weicheng:before { content: "\e8dd"; } .icon-shengyinguanbi:before { content: "\e9dd"; } .icon-caiwu:before { content: "\e8de"; } .icon-shibai:before { content: "\e9de"; } .icon-caiwu-xianxing:before { content: "\e8df"; } .icon-shijian1:before { content: "\e9df"; } .icon-mianfei:before { content: "\e8e0"; } .icon-shengyin:before { content: "\e9e0"; } .icon-mianfei-xianxing:before { content: "\e8e1"; } .icon-shoucang1:before { content: "\e9e1"; } .icon-tuikuan:before { content: "\e8e2"; } .icon-shouji:before { content: "\e9e2"; } .icon-jisuanqilishuai:before { content: "\e8e3"; } .icon-shouye1:before { content: "\e9e3"; } .icon-jisuanqilishuai-xianxing:before { content: "\e8e4"; } .icon-shuju:before { content: "\e9e4"; } .icon-checkbox-weixuan:before { content: "\e8e5"; } .icon-shuaxin1:before { content: "\e9e5"; } .icon-checkbox-xuanzhong:before { content: "\e8e6"; } .icon-sousuo1:before { content: "\e9e6"; } .icon-Raidobox-weixuan:before { content: "\e8e7"; } .icon-tanhao:before { content: "\e9e7"; } .icon-Raidobox-xuanzhong:before { content: "\e8e8"; } .icon-taolunqu:before { content: "\e9e8"; } .icon-checkbox-xuanzhongbufen:before { content: "\e8e9"; } .icon-tianjiayouhuiquan:before { content: "\e9e9"; } .icon-youxiajiaogouxuan:before { content: "\e8ea"; } .icon-tishi:before { content: "\e9ea"; } .icon-sousuo-xianxing:before { content: "\e8eb"; } .icon-tupian1:before { content: "\e9eb"; } .icon-shezhi-xianxing:before { content: "\e8ec"; } .icon-tuipiao:before { content: "\e9ec"; } .icon-shezhi:before { content: "\e8ed"; } .icon-weixuanzhong:before { content: "\e9ed"; } .icon-shouye:before { content: "\e8ee"; } .icon-weibo:before { content: "\e9ee"; } .icon-shouye-xianxing:before { content: "\e8ef"; } .icon-wenjuan:before { content: "\e9ef"; } .icon-sousuo:before { content: "\e8f0"; } .icon-wode:before { content: "\e9f0"; } .icon-wenti-xianxing:before { content: "\e8f1"; } .icon-weixin3:before { content: "\e9f1"; } .icon-wenti:before { content: "\e8f2"; } .icon-wodeguanzhu:before { content: "\e9f2"; } .icon-dianhua-xianxingyuankuang:before { content: "\e8f3"; } .icon-xiami:before { content: "\e9f3"; } .icon-liaotianduihua:before { content: "\e8f4"; } .icon-xiangkan:before { content: "\e9f4"; } .icon-liaotianduihua-xianxing:before { content: "\e8f5"; } .icon-xiangji:before { content: "\e9f5"; } .icon-dianhua:before { content: "\e8f6"; } .icon-xiaoxi:before { content: "\e9f6"; } .icon-dianhua-yuankuang:before { content: "\e8f7"; } .icon-xiazai:before { content: "\e9f7"; } .icon-xin-xianxing:before { content: "\e8f8"; } .icon-xiaojuchang:before { content: "\e9f8"; } .icon-lingdang:before { content: "\e8f9"; } .icon-xiaoshi:before { content: "\e9f9"; } .icon-lingdang-xianxing:before { content: "\e8fa"; } .icon-xiaoxizhongxin:before { content: "\e9fa"; } .icon-xin:before { content: "\e8fb"; } .icon-yinhangka:before { content: "\e9fb"; } .icon-laba-xianxing:before { content: "\e8fc"; } .icon-yanjing:before { content: "\e9fc"; } .icon-laba:before { content: "\e8fd"; } .icon-yingchengka:before { content: "\e9fd"; } .icon-maikefeng-xianxing:before { content: "\e8fe"; } .icon-yixiangkan:before { content: "\e9fe"; } .icon-shoucang:before { content: "\e8ff"; } .icon-yingpingmoban:before { content: "\e9ff"; } .icon-maikefeng:before { content: "\e900"; } .icon-yanchu:before { content: "\ea00"; } .icon-xihuan-xianxing:before { content: "\e901"; } .icon-xiaomi:before { content: "\ea01"; } .icon-shoucang-xianxing:before { content: "\e902"; } .icon-yingyuan:before { content: "\ea02"; } .icon-xihuan:before { content: "\e903"; } .icon-zengjia:before { content: "\ea03"; } .icon-gengduo-hengxiang:before { content: "\e904"; } .icon-yuyin:before { content: "\ea04"; } .icon-gengduo-shuxiang:before { content: "\e905"; } .icon-youhuiquan:before { content: "\ea05"; } .icon-shijian-xianxing:before { content: "\e906"; } .icon-WIFI:before { content: "\ea06"; } .icon-shengboyuyinxiaoxi:before { content: "\e907"; } .icon-zhibo:before { content: "\ea07"; } .icon-shijian:before { content: "\e908"; } .icon-youkuhuiyuan:before { content: "\ea08"; } .icon-shangchuandaochu:before { content: "\e909"; } .icon-yulebao:before { content: "\ea09"; } .icon-xiazaidaoru:before { content: "\e90a"; } .icon-zhiwen:before { content: "\ea0a"; } .icon-baocun-xianxing:before { content: "\e90b"; } .icon-aixin1:before { content: "\ea0b"; } .icon-shanguangdeng:before { content: "\e90c"; } .icon-chenggong1:before { content: "\ea0c"; } .icon-shanguangdeng-zidong:before { content: "\e90d"; } .icon-dianzan1:before { content: "\ea0d"; } .icon-shanguangdeng-guanbi:before { content: "\e90e"; } .icon-dianhua2:before { content: "\ea0e"; } .icon-baocun:before { content: "\e90f"; } .icon-bangzhu1:before { content: "\ea0f"; } .icon-yonghu-xianxing:before { content: "\e910"; } .icon-dianyingpiao1:before { content: "\ea10"; } .icon-yonghu:before { content: "\e911"; } .icon-faxian1:before { content: "\ea11"; } .icon-jiaosequnti:before { content: "\e912"; } .icon-dingwei2:before { content: "\ea12"; } .icon-morentouxiang:before { content: "\e913"; } .icon-gonggao:before { content: "\ea13"; } .icon-zhucetianjiahaoyou:before { content: "\e914"; } .icon-huati1:before { content: "\ea14"; } .icon-renwu:before { content: "\e915"; } .icon-jianshao1:before { content: "\ea15"; } .icon-zhongwenmoshi:before { content: "\e916"; } .icon-huiyuan1:before { content: "\ea16"; } .icon-fujian:before { content: "\e917"; } .icon-pinglun1:before { content: "\ea17"; } .icon-bianjishuru-xianxing:before { content: "\e918"; } .icon-shequ1:before { content: "\ea18"; } .icon-bianjishuru:before { content: "\e919"; } .icon-shibai1:before { content: "\ea19"; } .icon-yingwenmoshi:before { content: "\e91a"; } .icon-shijian2:before { content: "\ea1a"; } .icon-jianpan-xianxing:before { content: "\e91b"; } .icon-shandian1:before { content: "\ea1b"; } .icon-jianpan:before { content: "\e91c"; } .icon-wode1:before { content: "\ea1c"; } .icon-rili:before { content: "\e91d"; } .icon-shouye2:before { content: "\ea1d"; } .icon-weichuqin:before { content: "\e91e"; } .icon-shouji1:before { content: "\ea1e"; } .icon-kaoqinchuqin:before { content: "\e91f"; } .icon-tanhao1:before { content: "\ea1f"; } .icon-paizhao:before { content: "\e920"; } .icon-shoucang2:before { content: "\ea20"; } .icon-paizhao-xianxing:before { content: "\e921"; } .icon-shuju1:before { content: "\ea21"; } .icon-tupian-xianxing:before { content: "\e922"; } .icon-wenda:before { content: "\ea22"; } .icon-tupian:before { content: "\e923"; } .icon-yanjing1:before { content: "\ea23"; } .icon-saomiao:before { content: "\e924"; } .icon-yingchengka1:before { content: "\ea24"; } .icon-xianshikejian:before { content: "\e925"; } .icon-xiangji1:before { content: "\ea25"; } .icon-suoding:before { content: "\e926"; } .icon-yingyuan1:before { content: "\ea26"; } .icon-yincangbukejian:before { content: "\e927"; } .icon-yinhangyouhui:before { content: "\ea27"; } .icon-jiesuo:before { content: "\e928"; } .icon-xiaoshi1:before { content: "\ea28"; } .icon-anzhuangshigong-xianxing:before { content: "\e929"; } .icon-yanchu1:before { content: "\ea29"; } .icon-shaixuanguolv:before { content: "\e92a"; } .icon-zengjia1:before { content: "\ea2a"; } .icon-anzhuangshigong:before { content: "\e92b"; } .icon-dianying1:before { content: "\ea2b"; } .icon-zhuxiaoguanji:before { content: "\e92c"; } .icon-youhuiquan1:before { content: "\ea2c"; } .icon-haoping-yuankuang:before { content: "\e92d"; } .icon-remen:before { content: "\ea2d"; } .icon-chaping-yuankuang:before { content: "\e92e"; } .icon-chuangzuo1:before { content: "\ea2e"; } .icon-chaping:before { content: "\e92f"; } .icon-haoping:before { content: "\e930"; } .icon-yiban:before { content: "\e931"; } .icon-manyi:before { content: "\e932"; } .icon-bumanyi:before { content: "\e933"; } .icon-liebiaoshitucaidan:before { content: "\e934"; } .icon-gonggeshitu:before { content: "\e935"; } .icon-Phoneshouji:before { content: "\e936"; } .icon-PCtaishiji:before { content: "\e937"; } .icon-PDAshouchigongzuoshebei:before { content: "\e938"; } .icon-jia-fangkuang:before { content: "\e939"; } .icon-jia-xianxingfangkuang:before { content: "\e93a"; } .icon-jia-xianxingyuankuang:before { content: "\e93b"; } .icon-jia-yuankuang:before { content: "\e93c"; } .icon-jian-fangkuang:before { content: "\e93d"; } .icon-jia:before { content: "\e93e"; } .icon-jian-yuankuang:before { content: "\e93f"; } .icon-jian:before { content: "\e940"; } .icon-jian-xianxingfangkuang:before { content: "\e941"; } .icon-zhengquewancheng-xianxingyuankuang:before { content: "\e942"; } .icon-zhengquewancheng-yuankuang:before { content: "\e943"; } .icon-zhengquewancheng:before { content: "\e944"; } .icon-jian-xianxingyuankuang:before { content: "\e945"; } .icon-cuowuguanbiquxiao-xianxingfangkuang:before { content: "\e946"; } .icon-cuowuguanbiquxiao-yuankuang:before { content: "\e947"; } .icon-cuowuguanbiquxiao-xianxingyuankuang:before { content: "\e948"; } .icon-cuowuguanbiquxiao:before { content: "\e949"; } .icon-cuowuguanbiquxiao-fangkuang:before { content: "\e94a"; } .icon-xinxi-xianxingyuankuang:before { content: "\e94b"; } .icon-xinxi:before { content: "\e94c"; } .icon-wenhao-xianxingyuankuang:before { content: "\e94d"; } .icon-wenhao:before { content: "\e94e"; } .icon-wenhao-yuankuang:before { content: "\e94f"; } .icon-xinxi-yuankuang:before { content: "\e950"; } .icon-gantanhao-sanjiaokuang:before { content: "\e951"; } .icon-gantanhao-yuankuang:before { content: "\e952"; } .icon-gantanhao-xianxingyuankuang:before { content: "\e953"; } .icon-gantanhao-xianxingsanjiaokuang:before { content: "\e954"; } .icon-gantanhao:before { content: "\e955"; } .icon-shangyiyehoutuifanhui-xianxingyuankuang:before { content: "\e956"; } .icon-shangyiyehoutuifanhui-yuankuang:before { content: "\e957"; } .icon-xiayiyeqianjinchakangengduo-xianxingyuankuang:before { content: "\e958"; } .icon-xiayiyeqianjinchakangengduo-yuankuang:before { content: "\e959"; } .icon-shangyiyehoutuifanhui:before { content: "\e95a"; } .icon-xiayiyeqianjinchakangengduo:before { content: "\e95b"; } .icon-xiangxiazhankai-xianxingyuankuang:before { content: "\e95c"; } .icon-xiangxiazhankai-yuankuang:before { content: "\e95d"; } .icon-xiangxiazhankai:before { content: "\e95e"; } .icon-xiangshangshouqi-yuankuang:before { content: "\e95f"; } .icon-xiangshangshouqi-xianxingyuankuang:before { content: "\e960"; } .icon-zhixiangzuo:before { content: "\e961"; } .icon-zhixiangyou:before { content: "\e962"; } .icon-zhixiangshang:before { content: "\e963"; } .icon-weixin2:before { content: "\e601"; } .icon-zhifubao:before { content: "\e600"; } .icon-qq:before { content: "\e62e"; } .icon-weixin:before { content: "\e60e"; } .icon-weixin1:before { content: "\e621"; } .icon-qq1:before { content: "\e607"; } .icon-qq2:before { content: "\e66a"; } .icon-umidd17:before { content: "\e603"; } .icon-electrical:before { content: "\e6d4"; } .icon-home:before { content: "\e6d7"; } .icon-electronics:before { content: "\e6da"; } .icon-gifts:before { content: "\e6db"; } .icon-lights:before { content: "\e6de"; } .icon-sports:before { content: "\e6e0"; } .icon-toys:before { content: "\e6e1"; } .icon-auto:before { content: "\e6e3"; } .icon-jewelry:before { content: "\e6e4"; } .icon-trade-assurance:before { content: "\e6e5"; } .icon-browse:before { content: "\e6e6"; } .icon-rfqqm:before { content: "\e6e7"; } .icon-rfqquantity:before { content: "\e6e8"; } .icon-atmaway:before { content: "\e6e9"; } .icon-rfq1:before { content: "\e6eb"; } .icon-scanning:before { content: "\e6ec"; } .icon-compare:before { content: "\e6ee"; } .icon-filter:before { content: "\e6f1"; } .icon-pin:before { content: "\e6f2"; } .icon-history:before { content: "\e6f3"; } .icon-productfeatures:before { content: "\e6f4"; } .icon-supplierfeatures:before { content: "\e6f5"; } .icon-similarproduct:before { content: "\e6f6"; } .icon-link:before { content: "\e6f7"; } .icon-cut:before { content: "\e6f8"; } .icon-navlist:before { content: "\e6fa"; } .icon-imagetext:before { content: "\e6fb"; } .icon-text:before { content: "\e6fc"; } .icon-move:before { content: "\e6fd"; } .icon-subtract:before { content: "\e6fe"; } .icon-dollar:before { content: "\e702"; } .icon-raw:before { content: "\e704"; } .icon-office:before { content: "\e705"; } .icon-agriculture:before { content: "\e707"; } .icon-machinery:before { content: "\e709"; } .icon-assessedbadge:before { content: "\e70a"; } .icon-gerenzhongxin:before { content: "\e70b"; } .icon-jifen:before { content: "\e70c"; } .icon-operation:before { content: "\e70e"; } .icon-remind1:before { content: "\e713"; } .icon-icondownload:before { content: "\e714"; } .icon-map:before { content: "\e715"; } .icon-bad:before { content: "\e716"; } .icon-good:before { content: "\e717"; } .icon-skip:before { content: "\e718"; } .icon-iconfontplay2:before { content: "\e719"; } .icon-iconfontstop:before { content: "\e71a"; } .icon-compass:before { content: "\e71b"; } .icon-security:before { content: "\e71c"; } .icon-share:before { content: "\e71d"; } .icon-store:before { content: "\e722"; } .icon-manageorder:before { content: "\e723"; } .icon-rejectedorder:before { content: "\e724"; } .icon-phone:before { content: "\e725"; } .icon-bussinessman:before { content: "\e726"; } .icon-shoes:before { content: "\e728"; } .icon-mobilephone:before { content: "\e72a"; } .icon-emailfilling:before { content: "\e72d"; } .icon-favoritesfilling:before { content: "\e730"; } .icon-accountfilling:before { content: "\e732"; } .icon-creditlevel:before { content: "\e735"; } .icon-creditlevelfilling:before { content: "\e736"; } .icon-exl:before { content: "\e73f"; } .icon-pdf:before { content: "\e740"; } .icon-zip:before { content: "\e741"; } .icon-sorting:before { content: "\e743"; } .icon-copy:before { content: "\e744"; } .icon-save:before { content: "\e747"; } .icon-inquirytemplate:before { content: "\e749"; } .icon-templatedefault:before { content: "\e74a"; } .icon-libra:before { content: "\e74c"; } .icon-survey1:before { content: "\e74e"; } .icon-ship:before { content: "\e74f"; } .icon-bussinesscard:before { content: "\e753"; } .icon-hot:before { content: "\e756"; } .icon-data:before { content: "\e757"; } .icon-trade:before { content: "\e758"; } .icon-onepage48:before { content: "\e75a"; } .icon-signboard:before { content: "\e75c"; } .icon-shuffling-banner:before { content: "\e75e"; } .icon-component:before { content: "\e75f"; } .icon-component-filling:before { content: "\e760"; } .icon-color:before { content: "\e761"; } .icon-color-filling:before { content: "\e7cd"; } .icon-favorites:before { content: "\e7ce"; } .icon-pic-filling:before { content: "\e802"; } .icon-RFQ:before { content: "\e803"; } .icon-RFQ-filling:before { content: "\e804"; } .icon-originalimage:before { content: "\e806"; } .icon-logistic:before { content: "\e811"; } .icon-Calculator:before { content: "\e812"; } .icon-video:before { content: "\e820"; } .icon-earth:before { content: "\e828"; } .icon-task-management:before { content: "\e829"; } .icon-trust:before { content: "\e82a"; } .icon-password:before { content: "\e82b"; } .icon-column:before { content: "\e839"; } .icon-apparel:before { content: "\e83a"; } .icon-bags:before { content: "\e83b"; } .icon-folder:before { content: "\e83c"; } .icon-column1:before { content: "\e83d"; } .icon-code:before { content: "\e842"; } .icon-RFQ-filling1:before { content: "\e843"; } .icon-customs-clearance:before { content: "\e863"; } .icon-good-filling:before { content: "\e866"; } .icon-camera:before { content: "\e86e"; } .icon-pin-fill:before { content: "\e87a"; } .icon-help-fill:before { content: "\e87b"; } .icon-add-account:before { content: "\e87c"; } .icon-listing-content:before { content: "\e87d"; } .icon-warehouse-delivery:before { content: "\e87e"; } .icon-customization:before { content: "\e87f"; } .icon-inspection:before { content: "\e880"; } .icon-packing-labeling:before { content: "\e881"; } .icon-online-tracking:before { content: "\e882"; } .icon-play-filling:before { content: "\e883"; } .icon-nosound-filling:before { content: "\e884"; } .icon-sound-filling:before { content: "\e885"; } .icon-electrical-equipment:before { content: "\e886"; } .icon-home-appliances:before { content: "\e887"; } .icon-furniture:before { content: "\e888"; } .icon-fashion-accessories:before { content: "\e889"; } .icon-security-protection:before { content: "\e88a"; } .icon-textile-products:before { content: "\e88b"; } .icon-tools-hardware:before { content: "\e88c"; } .icon-office-supplies:before { content: "\e88d"; } .icon-vehicles:before { content: "\e88e"; } .icon-all:before { content: "\e696"; } .icon-back:before { content: "\e697"; } .icon-cart:before { content: "\e698"; } .icon-category:before { content: "\e699"; } .icon-close:before { content: "\e69a"; } .icon-comments:before { content: "\e69b"; } .icon-cry:before { content: "\e69c"; } .icon-delete:before { content: "\e69d"; } .icon-edit:before { content: "\e69e"; } .icon-email:before { content: "\e69f"; } .icon-favorite:before { content: "\e6a0"; } .icon-form:before { content: "\e6a2"; } .icon-help:before { content: "\e6a3"; } .icon-information:before { content: "\e6a4"; } .icon-less:before { content: "\e6a5"; } .icon-moreunfold:before { content: "\e6a6"; } .icon-more:before { content: "\e6a7"; } .icon-pic:before { content: "\e6a8"; } .icon-qrcode:before { content: "\e6a9"; } .icon-refresh:before { content: "\e6aa"; } .icon-rfq:before { content: "\e6ab"; } .icon-search:before { content: "\e6ac"; } .icon-selected:before { content: "\e6ad"; } .icon-set:before { content: "\e6ae"; } .icon-smile:before { content: "\e6af"; } .icon-success:before { content: "\e6b1"; } .icon-survey:before { content: "\e6b2"; } .icon-training:before { content: "\e6b3"; } .icon-viewgallery:before { content: "\e6b4"; } .icon-viewlist:before { content: "\e6b5"; } .icon-warning:before { content: "\e6b6"; } .icon-wrong:before { content: "\e6b7"; } .icon-account:before { content: "\e6b8"; } .icon-add:before { content: "\e6b9"; } .icon-atm:before { content: "\e6ba"; } .icon-clock:before { content: "\e6bb"; } .icon-remind:before { content: "\e6bc"; } .icon-calendar:before { content: "\e6bf"; } .icon-attachment:before { content: "\e6c0"; } .icon-discount:before { content: "\e6c5"; } .icon-service:before { content: "\e6c7"; } .icon-print:before { content: "\e6c9"; } .icon-box:before { content: "\e6cb"; } .icon-process:before { content: "\e6ce"; } .icon-beauty:before { content: "\e6d2"; } ================================================ FILE: app/admin/t/tpl/style/fonts/iconfont.js ================================================ !function(a){var h,c,l,o,i,v='',t=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss"),m=function(a,h){h.parentNode.insertBefore(a,h)};if(t&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}function s(){i||(i=!0,l())}function p(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(p,50)}s()}h=function(){var a,h;(h=document.createElement("div")).innerHTML=v,v=null,(a=h.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",h=a,(a=document.body).firstChild?m(h,a.firstChild):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(c=function(){document.removeEventListener("DOMContentLoaded",c,!1),h()},document.addEventListener("DOMContentLoaded",c,!1)):document.attachEvent&&(l=h,o=a.document,i=!1,p(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,s())})}(window); ================================================ FILE: app/admin/t/tpl/style/fonts/iconfont.json ================================================ { "id": "1357552", "name": "极致CMS图标库", "font_family": "iconfont", "css_prefix_text": "icon-", "description": "", "glyphs": [ { "icon_id": "1727551", "name": "311向上、收起", "font_class": "xiangshangshouqi", "unicode": "e964", "unicode_decimal": 59748 }, { "icon_id": "1727552", "name": "314指向下", "font_class": "zhixiangxia", "unicode": "e965", "unicode_decimal": 59749 }, { "icon_id": "1727553", "name": "316第一页", "font_class": "diyiye", "unicode": "e966", "unicode_decimal": 59750 }, { "icon_id": "1727554", "name": "317最后页", "font_class": "zuihouye", "unicode": "e967", "unicode_decimal": 59751 }, { "icon_id": "1727555", "name": "319表头-正序", "font_class": "biaotou-zhengxu", "unicode": "e968", "unicode_decimal": 59752 }, { "icon_id": "1727556", "name": "318表头-可排序", "font_class": "biaotou-kepaixu", "unicode": "e969", "unicode_decimal": 59753 }, { "icon_id": "1727557", "name": "320表头-倒序", "font_class": "biaotou-daoxu", "unicode": "e96a", "unicode_decimal": 59754 }, { "icon_id": "1727558", "name": "321 回顶部", "font_class": "huidingbu", "unicode": "e96b", "unicode_decimal": 59755 }, { "icon_id": "1727559", "name": "323向左交换", "font_class": "xiangzuojiaohuan", "unicode": "e96c", "unicode_decimal": 59756 }, { "icon_id": "1727560", "name": "322相互交换", "font_class": "xianghujiaohuan", "unicode": "e96d", "unicode_decimal": 59757 }, { "icon_id": "1727561", "name": "324向右交换", "font_class": "xiangyoujiaohuan", "unicode": "e96e", "unicode_decimal": 59758 }, { "icon_id": "1727562", "name": "326数值下降", "font_class": "shuzhixiajiang", "unicode": "e96f", "unicode_decimal": 59759 }, { "icon_id": "1727563", "name": "327全屏", "font_class": "quanping", "unicode": "e970", "unicode_decimal": 59760 }, { "icon_id": "1727564", "name": "329横向展开", "font_class": "hengxiangzhankai", "unicode": "e971", "unicode_decimal": 59761 }, { "icon_id": "1727565", "name": "325数值上升", "font_class": "shuzhishangsheng", "unicode": "e972", "unicode_decimal": 59762 }, { "icon_id": "1727566", "name": "328退出全屏", "font_class": "tuichuquanping", "unicode": "e973", "unicode_decimal": 59763 }, { "icon_id": "1727567", "name": "330横向收起", "font_class": "hengxiangshouqi", "unicode": "e974", "unicode_decimal": 59764 }, { "icon_id": "1727568", "name": "331刷新", "font_class": "shuaxin", "unicode": "e975", "unicode_decimal": 59765 }, { "icon_id": "1727569", "name": "332同步", "font_class": "tongbu", "unicode": "e976", "unicode_decimal": 59766 }, { "icon_id": "1727570", "name": "333加载loading-A", "font_class": "jiazailoading-A", "unicode": "e977", "unicode_decimal": 59767 }, { "icon_id": "1727571", "name": "333加载loading-B", "font_class": "jiazailoading-B", "unicode": "e978", "unicode_decimal": 59768 }, { "icon_id": "1727581", "name": "401位置-线性", "font_class": "weizhi-xianxing", "unicode": "e979", "unicode_decimal": 59769 }, { "icon_id": "1727582", "name": "401位置", "font_class": "weizhi", "unicode": "e97a", "unicode_decimal": 59770 }, { "icon_id": "1727583", "name": "402导航", "font_class": "daohang", "unicode": "e97b", "unicode_decimal": 59771 }, { "icon_id": "1727584", "name": "404定位", "font_class": "dingwei", "unicode": "e97c", "unicode_decimal": 59772 }, { "icon_id": "1727585", "name": "404监控、摄像头-线性", "font_class": "jiankongshexiangtou-xianxing", "unicode": "e97d", "unicode_decimal": 59773 }, { "icon_id": "1727586", "name": "403拓点图", "font_class": "tuodiantu", "unicode": "e97e", "unicode_decimal": 59774 }, { "icon_id": "1727587", "name": "404监控、摄像头", "font_class": "jiankongshexiangtou", "unicode": "e97f", "unicode_decimal": 59775 }, { "icon_id": "1727588", "name": "405雷达、探测", "font_class": "leidatance", "unicode": "e980", "unicode_decimal": 59776 }, { "icon_id": "1727589", "name": "406报表", "font_class": "baobiao", "unicode": "e981", "unicode_decimal": 59777 }, { "icon_id": "1727590", "name": "407饼图-线性", "font_class": "bingtu-xianxing", "unicode": "e982", "unicode_decimal": 59778 }, { "icon_id": "1727591", "name": "406报表-线性", "font_class": "baobiao-xianxing", "unicode": "e983", "unicode_decimal": 59779 }, { "icon_id": "1727592", "name": "407饼图", "font_class": "bingtu", "unicode": "e984", "unicode_decimal": 59780 }, { "icon_id": "1727593", "name": "408条形图", "font_class": "tiaoxingtu", "unicode": "e985", "unicode_decimal": 59781 }, { "icon_id": "1727594", "name": "408条形图-线性", "font_class": "tiaoxingtu-xianxing", "unicode": "e986", "unicode_decimal": 59782 }, { "icon_id": "1727595", "name": "409折线图", "font_class": "zhexiantu", "unicode": "e987", "unicode_decimal": 59783 }, { "icon_id": "1727596", "name": "409折线图-线性", "font_class": "zhexiantu-xianxing", "unicode": "e988", "unicode_decimal": 59784 }, { "icon_id": "1727597", "name": "410指南、指导-线性", "font_class": "zhinanzhidao-xianxing", "unicode": "e989", "unicode_decimal": 59785 }, { "icon_id": "1727598", "name": "411地图", "font_class": "ditu", "unicode": "e98a", "unicode_decimal": 59786 }, { "icon_id": "1727599", "name": "410指南、指导", "font_class": "zhinanzhidao", "unicode": "e98b", "unicode_decimal": 59787 }, { "icon_id": "1727600", "name": "902投诉", "font_class": "tousu", "unicode": "e98c", "unicode_decimal": 59788 }, { "icon_id": "1727601", "name": "901巡检、检验", "font_class": "xunjianjianyan", "unicode": "e98d", "unicode_decimal": 59789 }, { "icon_id": "1795840", "name": "50店铺", "font_class": "dianpu", "unicode": "e98e", "unicode_decimal": 59790 }, { "icon_id": "1727257", "name": "01运输中、物流-线性", "font_class": "yunshuzhongwuliu-xianxing", "unicode": "e88f", "unicode_decimal": 59535 }, { "icon_id": "1795841", "name": "50店铺-线性", "font_class": "dianpu-xianxing", "unicode": "e98f", "unicode_decimal": 59791 }, { "icon_id": "1727258", "name": "01运输中、物流", "font_class": "yunshuzhongwuliu", "unicode": "e890", "unicode_decimal": 59536 }, { "icon_id": "1795843", "name": "51快递员", "font_class": "kuaidiyuan", "unicode": "e990", "unicode_decimal": 59792 }, { "icon_id": "1727259", "name": "02包裹、发货", "font_class": "baoguofahuo", "unicode": "e891", "unicode_decimal": 59537 }, { "icon_id": "1795844", "name": "51快递员-线性", "font_class": "kuaidiyuan-xianxing", "unicode": "e991", "unicode_decimal": 59793 }, { "icon_id": "1727260", "name": "02包裹、发货-线性", "font_class": "baoguofahuo-xianxing", "unicode": "e892", "unicode_decimal": 59538 }, { "icon_id": "1833769", "name": "44贷款-线性", "font_class": "daikuan-xianxing", "unicode": "e992", "unicode_decimal": 59794 }, { "icon_id": "1727261", "name": "03拆包裹、取件", "font_class": "chaibaoguoqujian", "unicode": "e893", "unicode_decimal": 59539 }, { "icon_id": "1833770", "name": "45还款-线性", "font_class": "huankuan-xianxing", "unicode": "e993", "unicode_decimal": 59795 }, { "icon_id": "1727262", "name": "03拆包裹、取件-线性", "font_class": "chaibaoguoqujian-xianxing", "unicode": "e894", "unicode_decimal": 59540 }, { "icon_id": "1866719", "name": "47退款-细", "font_class": "tuikuan-xi", "unicode": "e994", "unicode_decimal": 59796 }, { "icon_id": "1727264", "name": "04自提柜", "font_class": "zitigui", "unicode": "e895", "unicode_decimal": 59541 }, { "icon_id": "1866720", "name": "234日历-线性-细", "font_class": "rili-xianxing-xi", "unicode": "e995", "unicode_decimal": 59797 }, { "icon_id": "1727265", "name": "04自提柜-线性", "font_class": "zitigui-xianxing", "unicode": "e896", "unicode_decimal": 59542 }, { "icon_id": "1866721", "name": "49计算器、利率-线性-细", "font_class": "jisuanqilishuai-xianxing-xi", "unicode": "e996", "unicode_decimal": 59798 }, { "icon_id": "1727266", "name": "05采购-线性", "font_class": "caigou-xianxing", "unicode": "e897", "unicode_decimal": 59543 }, { "icon_id": "2126752", "name": "257用户资料", "font_class": "yonghuziliao", "unicode": "e997", "unicode_decimal": 59799 }, { "icon_id": "1727267", "name": "05采购", "font_class": "caigou", "unicode": "e898", "unicode_decimal": 59544 }, { "icon_id": "2126754", "name": "257用户资料-线性", "font_class": "yonghuziliao-xianxing", "unicode": "e998", "unicode_decimal": 59800 }, { "icon_id": "1727269", "name": "06商品", "font_class": "shangpin", "unicode": "e899", "unicode_decimal": 59545 }, { "icon_id": "2126755", "name": "258皮肤&主题", "font_class": "pifuzhuti", "unicode": "e999", "unicode_decimal": 59801 }, { "icon_id": "1727271", "name": "06商品-线性", "font_class": "shangpin-xianxing", "unicode": "e89a", "unicode_decimal": 59546 }, { "icon_id": "2126756", "name": "258皮肤&主题-线性", "font_class": "pifuzhuti-xianxing", "unicode": "e99a", "unicode_decimal": 59802 }, { "icon_id": "1727273", "name": "07配载、装车", "font_class": "peizaizhuangche", "unicode": "e89b", "unicode_decimal": 59547 }, { "icon_id": "2127051", "name": "259钻石", "font_class": "diamond", "unicode": "e99b", "unicode_decimal": 59803 }, { "icon_id": "1727274", "name": "07配载、装车-线性", "font_class": "peizaizhuangche-xianxing", "unicode": "e89c", "unicode_decimal": 59548 }, { "icon_id": "2127052", "name": "259钻石-线性", "font_class": "diamond-o", "unicode": "e99c", "unicode_decimal": 59804 }, { "icon_id": "1727275", "name": "08质量-线性", "font_class": "zhiliang-xianxing", "unicode": "e89d", "unicode_decimal": 59549 }, { "icon_id": "2127193", "name": "54设计-线性", "font_class": "sheji-xianxing", "unicode": "e99d", "unicode_decimal": 59805 }, { "icon_id": "1727276", "name": "08质量", "font_class": "zhiliang", "unicode": "e89e", "unicode_decimal": 59550 }, { "icon_id": "2127194", "name": "55开发-线性", "font_class": "kaifa-xianxing", "unicode": "e99e", "unicode_decimal": 59806 }, { "icon_id": "1727278", "name": "09安全、保障", "font_class": "anquanbaozhang", "unicode": "e89f", "unicode_decimal": 59551 }, { "icon_id": "2488825", "name": "48银行卡", "font_class": "yinhangqia", "unicode": "e99f", "unicode_decimal": 59807 }, { "icon_id": "1727279", "name": "09安全、保障-线性", "font_class": "anquanbaozhang-xianxing", "unicode": "e8a0", "unicode_decimal": 59552 }, { "icon_id": "2488826", "name": "48银行卡-线性", "font_class": "yinhangqia-xianxing", "unicode": "e9a0", "unicode_decimal": 59808 }, { "icon_id": "1727280", "name": "10仓库、仓储", "font_class": "cangkucangchu", "unicode": "e8a1", "unicode_decimal": 59553 }, { "icon_id": "2488827", "name": "52红包-线性", "font_class": "hongbao-xianxing", "unicode": "e9a1", "unicode_decimal": 59809 }, { "icon_id": "1727281", "name": "10仓库、仓储-线性", "font_class": "cangkucangchu-xianxing", "unicode": "e8a2", "unicode_decimal": 59554 }, { "icon_id": "2488828", "name": "52红包", "font_class": "hongbao", "unicode": "e9a2", "unicode_decimal": 59810 }, { "icon_id": "1727329", "name": "11中转站-线性", "font_class": "zhongzhuanzhan-xianxing", "unicode": "e8a3", "unicode_decimal": 59555 }, { "icon_id": "11372639", "name": "爱心", "font_class": "aixin", "unicode": "e9a3", "unicode_decimal": 59811 }, { "icon_id": "1727330", "name": "11中转站", "font_class": "zhongzhuanzhan", "unicode": "e8a4", "unicode_decimal": 59556 }, { "icon_id": "11372640", "name": "编辑", "font_class": "bianji", "unicode": "e9a4", "unicode_decimal": 59812 }, { "icon_id": "1727331", "name": "12库存-线性", "font_class": "kucun-xianxing", "unicode": "e8a5", "unicode_decimal": 59557 }, { "icon_id": "11372641", "name": "3D眼镜", "font_class": "Dyanjing", "unicode": "e9a5", "unicode_decimal": 59813 }, { "icon_id": "1727332", "name": "12库存", "font_class": "kucun", "unicode": "e8a6", "unicode_decimal": 59558 }, { "icon_id": "11372642", "name": "彩蛋", "font_class": "caidan", "unicode": "e9a6", "unicode_decimal": 59814 }, { "icon_id": "1727333", "name": "13末端网点-线性", "font_class": "moduanwangdian-xianxing", "unicode": "e8a7", "unicode_decimal": 59559 }, { "icon_id": "11372643", "name": "安全", "font_class": "anquan", "unicode": "e9a7", "unicode_decimal": 59815 }, { "icon_id": "1727334", "name": "13末端网点", "font_class": "moduanwangdian", "unicode": "e8a8", "unicode_decimal": 59560 }, { "icon_id": "11372644", "name": "帮助", "font_class": "bangzhu", "unicode": "e9a8", "unicode_decimal": 59816 }, { "icon_id": "1727339", "name": "14签收、审批通过-线性", "font_class": "qianshoushenpitongguo-xianxing", "unicode": "e8a9", "unicode_decimal": 59561 }, { "icon_id": "11372645", "name": "不感兴趣", "font_class": "buganxingqu", "unicode": "e9a9", "unicode_decimal": 59817 }, { "icon_id": "1727340", "name": "14签收、审批通过", "font_class": "qianshoushenpitongguo", "unicode": "e8aa", "unicode_decimal": 59562 }, { "icon_id": "11372646", "name": "播放记录", "font_class": "bofangjilu", "unicode": "e9aa", "unicode_decimal": 59818 }, { "icon_id": "1727341", "name": "15拒签收-线性", "font_class": "juqianshou-xianxing", "unicode": "e8ab", "unicode_decimal": 59563 }, { "icon_id": "11372647", "name": "创作", "font_class": "chuangzuo", "unicode": "e9ab", "unicode_decimal": 59819 }, { "icon_id": "1727342", "name": "15拒签收", "font_class": "juqianshou", "unicode": "e8ac", "unicode_decimal": 59564 }, { "icon_id": "11372648", "name": "成功", "font_class": "chenggong", "unicode": "e9ac", "unicode_decimal": 59820 }, { "icon_id": "1727344", "name": "16寄件、发送-线性", "font_class": "jijianfasong-xianxing", "unicode": "e8ad", "unicode_decimal": 59565 }, { "icon_id": "11372649", "name": "测试", "font_class": "ceshi", "unicode": "e9ad", "unicode_decimal": 59821 }, { "icon_id": "1727345", "name": "16寄件、发送", "font_class": "jijianfasong", "unicode": "e8ae", "unicode_decimal": 59566 }, { "icon_id": "11372650", "name": "电话", "font_class": "dianhua1", "unicode": "e9ae", "unicode_decimal": 59822 }, { "icon_id": "1727347", "name": "17企业、园区、物业", "font_class": "qiyeyuanquwuye", "unicode": "e8af", "unicode_decimal": 59567 }, { "icon_id": "11372651", "name": "点赞", "font_class": "dianzan", "unicode": "e9af", "unicode_decimal": 59823 }, { "icon_id": "1727348", "name": "17企业、园区、物业-线性", "font_class": "qiyeyuanquwuye-xianxing", "unicode": "e8b0", "unicode_decimal": 59568 }, { "icon_id": "11372652", "name": "定位", "font_class": "dingwei1", "unicode": "e9b0", "unicode_decimal": 59824 }, { "icon_id": "1727350", "name": "19结算-线性", "font_class": "jiesuan-xianxing", "unicode": "e8b1", "unicode_decimal": 59569 }, { "icon_id": "11372653", "name": "电筒_关", "font_class": "diantong_guan", "unicode": "e9b1", "unicode_decimal": 59825 }, { "icon_id": "1727351", "name": "19结算", "font_class": "jiesuan", "unicode": "e8b2", "unicode_decimal": 59570 }, { "icon_id": "11372654", "name": "电影", "font_class": "dianying", "unicode": "e9b2", "unicode_decimal": 59826 }, { "icon_id": "1727352", "name": "20积分", "font_class": "jifen1", "unicode": "e8b3", "unicode_decimal": 59571 }, { "icon_id": "11372655", "name": "地图", "font_class": "ditu1", "unicode": "e9b3", "unicode_decimal": 59827 }, { "icon_id": "1727353", "name": "20积分-线性", "font_class": "jifen-xianxing", "unicode": "e8b4", "unicode_decimal": 59572 }, { "icon_id": "11372656", "name": "电筒_开", "font_class": "diantong_kai", "unicode": "e9b4", "unicode_decimal": 59828 }, { "icon_id": "1727354", "name": "21优惠劵-线性", "font_class": "youhuijuan-xianxing", "unicode": "e8b5", "unicode_decimal": 59573 }, { "icon_id": "11372657", "name": "电影票", "font_class": "dianyingpiao", "unicode": "e9b5", "unicode_decimal": 59829 }, { "icon_id": "1727355", "name": "22资料、手册", "font_class": "ziliaoshouce", "unicode": "e8b6", "unicode_decimal": 59574 }, { "icon_id": "11372658", "name": "订单", "font_class": "dingdan", "unicode": "e9b6", "unicode_decimal": 59830 }, { "icon_id": "1727356", "name": "22资料、手册-线性", "font_class": "ziliaoshouce-xianxing", "unicode": "e8b7", "unicode_decimal": 59575 }, { "icon_id": "11372659", "name": "更多", "font_class": "gengduo", "unicode": "e9b7", "unicode_decimal": 59831 }, { "icon_id": "1727357", "name": "21优惠劵", "font_class": "youhuijuan", "unicode": "e8b8", "unicode_decimal": 59576 }, { "icon_id": "11372660", "name": "翻倍", "font_class": "fanbei", "unicode": "e9b8", "unicode_decimal": 59832 }, { "icon_id": "1727359", "name": "23规则", "font_class": "guize", "unicode": "e8b9", "unicode_decimal": 59577 }, { "icon_id": "11372661", "name": "发现", "font_class": "faxian", "unicode": "e9b9", "unicode_decimal": 59833 }, { "icon_id": "1727360", "name": "25单据-线性", "font_class": "danju-xianxing", "unicode": "e8ba", "unicode_decimal": 59578 }, { "icon_id": "11372662", "name": "儿童票", "font_class": "ertongpiao", "unicode": "e9ba", "unicode_decimal": 59834 }, { "icon_id": "1727361", "name": "24组织架构、接口", "font_class": "zuzhijiagoujiekou", "unicode": "e8bb", "unicode_decimal": 59579 }, { "icon_id": "11372663", "name": "公益", "font_class": "gongyi", "unicode": "e9bb", "unicode_decimal": 59835 }, { "icon_id": "1727362", "name": "25单据", "font_class": "danju", "unicode": "e8bc", "unicode_decimal": 59580 }, { "icon_id": "11372664", "name": "红包", "font_class": "hongbao1", "unicode": "e9bc", "unicode_decimal": 59836 }, { "icon_id": "1727363", "name": "26创建单据-线性", "font_class": "chuangjiandanju-xianxing", "unicode": "e8bd", "unicode_decimal": 59581 }, { "icon_id": "11372665", "name": "复制", "font_class": "fuzhi", "unicode": "e9bd", "unicode_decimal": 59837 }, { "icon_id": "1727364", "name": "26创建单据", "font_class": "chuangjiandanju", "unicode": "e8be", "unicode_decimal": 59582 }, { "icon_id": "11372666", "name": "分享", "font_class": "fenxiang", "unicode": "e9be", "unicode_decimal": 59838 }, { "icon_id": "1727365", "name": "27账单-线性", "font_class": "zhangdan-xianxing", "unicode": "e8bf", "unicode_decimal": 59583 }, { "icon_id": "11372667", "name": "话题符号", "font_class": "huatifuhao", "unicode": "e9bf", "unicode_decimal": 59839 }, { "icon_id": "1727366", "name": "27账单", "font_class": "zhangdan", "unicode": "e8c0", "unicode_decimal": 59584 }, { "icon_id": "11372668", "name": "会员", "font_class": "huiyuan", "unicode": "e9c0", "unicode_decimal": 59840 }, { "icon_id": "1727367", "name": "28体积、空间", "font_class": "tijikongjian", "unicode": "e8c1", "unicode_decimal": 59585 }, { "icon_id": "11372669", "name": "阿里鱼", "font_class": "aliyu", "unicode": "e9c1", "unicode_decimal": 59841 }, { "icon_id": "1727368", "name": "28体积、空间-线性", "font_class": "tijikongjian-xianxing", "unicode": "e8c2", "unicode_decimal": 59586 }, { "icon_id": "11372670", "name": "机具", "font_class": "jiju", "unicode": "e9c2", "unicode_decimal": 59842 }, { "icon_id": "1727369", "name": "29业务-线性", "font_class": "yewu-xianxing", "unicode": "e8c3", "unicode_decimal": 59587 }, { "icon_id": "11372671", "name": "减少", "font_class": "jianshao", "unicode": "e9c3", "unicode_decimal": 59843 }, { "icon_id": "1727370", "name": "29业务", "font_class": "yewu", "unicode": "e8c4", "unicode_decimal": 59588 }, { "icon_id": "11372672", "name": "卡包", "font_class": "kabao", "unicode": "e9c4", "unicode_decimal": 59844 }, { "icon_id": "1727371", "name": "30应用程序-线性", "font_class": "yingyongchengxu-xianxing", "unicode": "e8c5", "unicode_decimal": 59589 }, { "icon_id": "11372673", "name": "话题", "font_class": "huati", "unicode": "e9c5", "unicode_decimal": 59845 }, { "icon_id": "1727372", "name": "30应用程序", "font_class": "yingyongchengxu", "unicode": "e8c6", "unicode_decimal": 59590 }, { "icon_id": "11372674", "name": "关注", "font_class": "guanzhu", "unicode": "e9c6", "unicode_decimal": 59846 }, { "icon_id": "1727373", "name": "31标准", "font_class": "biaozhun", "unicode": "e8c7", "unicode_decimal": 59591 }, { "icon_id": "11372675", "name": "买一赠一", "font_class": "maiyizengyi", "unicode": "e9c7", "unicode_decimal": 59847 }, { "icon_id": "1727374", "name": "31标准-线性", "font_class": "biaozhun-xianxing", "unicode": "e8c8", "unicode_decimal": 59592 }, { "icon_id": "11372676", "name": "密码", "font_class": "mima", "unicode": "e9c8", "unicode_decimal": 59848 }, { "icon_id": "1727376", "name": "32权限、钥匙", "font_class": "quanxianyuechi", "unicode": "e8c9", "unicode_decimal": 59593 }, { "icon_id": "11372677", "name": "男", "font_class": "nan", "unicode": "e9c9", "unicode_decimal": 59849 }, { "icon_id": "1727377", "name": "32权限、钥匙-线性", "font_class": "quanxianyuechi-xianxing", "unicode": "e8ca", "unicode_decimal": 59594 }, { "icon_id": "11372678", "name": "女", "font_class": "nv", "unicode": "e9ca", "unicode_decimal": 59850 }, { "icon_id": "1727378", "name": "33资源", "font_class": "ziyuan", "unicode": "e8cb", "unicode_decimal": 59595 }, { "icon_id": "11372679", "name": "礼盒", "font_class": "lihe", "unicode": "e9cb", "unicode_decimal": 59851 }, { "icon_id": "1727379", "name": "33资源-线性", "font_class": "ziyuan-xianxing", "unicode": "e8cc", "unicode_decimal": 59596 }, { "icon_id": "11372680", "name": "排行榜", "font_class": "paihangbang", "unicode": "e9cc", "unicode_decimal": 59852 }, { "icon_id": "1727380", "name": "34模板、框架-线性", "font_class": "mobankuangjia-xianxing", "unicode": "e8cd", "unicode_decimal": 59597 }, { "icon_id": "11372681", "name": "礼品卡", "font_class": "lipinka", "unicode": "e9cd", "unicode_decimal": 59853 }, { "icon_id": "1727381", "name": "34模板、框架", "font_class": "mobankuangjia", "unicode": "e8ce", "unicode_decimal": 59598 }, { "icon_id": "11372682", "name": "朋友圈", "font_class": "pengyouquan", "unicode": "e9ce", "unicode_decimal": 59854 }, { "icon_id": "1727382", "name": "35新闻、资讯", "font_class": "xinwenzixun", "unicode": "e8cf", "unicode_decimal": 59599 }, { "icon_id": "11372683", "name": "明星活动", "font_class": "mingxinghuodong", "unicode": "e9cf", "unicode_decimal": 59855 }, { "icon_id": "1727383", "name": "35新闻、资讯-线性", "font_class": "xinwenzixun-xianxing", "unicode": "e8d0", "unicode_decimal": 59600 }, { "icon_id": "11372684", "name": "取票", "font_class": "qupiao", "unicode": "e9d0", "unicode_decimal": 59856 }, { "icon_id": "1727385", "name": "36合作、关系-线性", "font_class": "hezuoguanxi-xianxing", "unicode": "e8d1", "unicode_decimal": 59601 }, { "icon_id": "11372685", "name": "扫一扫", "font_class": "saoyisao", "unicode": "e9d1", "unicode_decimal": 59857 }, { "icon_id": "1727386", "name": "36合作、关系", "font_class": "hezuoguanxi", "unicode": "e8d2", "unicode_decimal": 59602 }, { "icon_id": "11372686", "name": "日历", "font_class": "rili1", "unicode": "e9d2", "unicode_decimal": 59858 }, { "icon_id": "1727387", "name": "36线路", "font_class": "xianlu", "unicode": "e8d3", "unicode_decimal": 59603 }, { "icon_id": "11372687", "name": "评论", "font_class": "pinglun", "unicode": "e9d3", "unicode_decimal": 59859 }, { "icon_id": "1727388", "name": "37-服务-线性", "font_class": "-fuwu-xianxing", "unicode": "e8d4", "unicode_decimal": 59604 }, { "icon_id": "11372688", "name": "轻会员", "font_class": "qinghuiyuan", "unicode": "e9d4", "unicode_decimal": 59860 }, { "icon_id": "1727389", "name": "37-服务", "font_class": "-fuwu", "unicode": "e8d5", "unicode_decimal": 59605 }, { "icon_id": "11372689", "name": "日签", "font_class": "riqian", "unicode": "e9d5", "unicode_decimal": 59861 }, { "icon_id": "1727391", "name": "38-客服-线性", "font_class": "-kefu-xianxing", "unicode": "e8d6", "unicode_decimal": 59606 }, { "icon_id": "11372690", "name": "闪电", "font_class": "shandian", "unicode": "e9d6", "unicode_decimal": 59862 }, { "icon_id": "1727392", "name": "38-客服", "font_class": "-kefu", "unicode": "e8d7", "unicode_decimal": 59607 }, { "icon_id": "11372691", "name": "筛选", "font_class": "shaixuan", "unicode": "e9d7", "unicode_decimal": 59863 }, { "icon_id": "1727393", "name": "39-国际-线性", "font_class": "-guoji-xianxing", "unicode": "e8d8", "unicode_decimal": 59608 }, { "icon_id": "11372692", "name": "商圈", "font_class": "shangquan", "unicode": "e9d8", "unicode_decimal": 59864 }, { "icon_id": "1727394", "name": "39-国际", "font_class": "-guoji", "unicode": "e8d9", "unicode_decimal": 59609 }, { "icon_id": "11372693", "name": "删除", "font_class": "shanchu", "unicode": "e9d9", "unicode_decimal": 59865 }, { "icon_id": "1727395", "name": "40海关-线性", "font_class": "haiguan-xianxing", "unicode": "e8da", "unicode_decimal": 59610 }, { "icon_id": "11372694", "name": "设置", "font_class": "shezhi1", "unicode": "e9da", "unicode_decimal": 59866 }, { "icon_id": "1727396", "name": "40海关", "font_class": "haiguan", "unicode": "e8db", "unicode_decimal": 59611 }, { "icon_id": "11372695", "name": "上传", "font_class": "shangchuan", "unicode": "e9db", "unicode_decimal": 59867 }, { "icon_id": "1727397", "name": "41头程、空运", "font_class": "touchengkongyun", "unicode": "e8dc", "unicode_decimal": 59612 }, { "icon_id": "11372696", "name": "社区", "font_class": "shequ", "unicode": "e9dc", "unicode_decimal": 59868 }, { "icon_id": "1727398", "name": "42尾程", "font_class": "weicheng", "unicode": "e8dd", "unicode_decimal": 59613 }, { "icon_id": "11372697", "name": "声音关闭", "font_class": "shengyinguanbi", "unicode": "e9dd", "unicode_decimal": 59869 }, { "icon_id": "1727399", "name": "43财务", "font_class": "caiwu", "unicode": "e8de", "unicode_decimal": 59614 }, { "icon_id": "11372698", "name": "失败", "font_class": "shibai", "unicode": "e9de", "unicode_decimal": 59870 }, { "icon_id": "1727401", "name": "43财务-线性", "font_class": "caiwu-xianxing", "unicode": "e8df", "unicode_decimal": 59615 }, { "icon_id": "11372699", "name": "时间", "font_class": "shijian1", "unicode": "e9df", "unicode_decimal": 59871 }, { "icon_id": "1727405", "name": "46免费", "font_class": "mianfei", "unicode": "e8e0", "unicode_decimal": 59616 }, { "icon_id": "11372700", "name": "声音", "font_class": "shengyin", "unicode": "e9e0", "unicode_decimal": 59872 }, { "icon_id": "1727406", "name": "46免费-线性", "font_class": "mianfei-xianxing", "unicode": "e8e1", "unicode_decimal": 59617 }, { "icon_id": "11372701", "name": "收藏", "font_class": "shoucang1", "unicode": "e9e1", "unicode_decimal": 59873 }, { "icon_id": "1727407", "name": "47退款", "font_class": "tuikuan", "unicode": "e8e2", "unicode_decimal": 59618 }, { "icon_id": "11372702", "name": "手机", "font_class": "shouji", "unicode": "e9e2", "unicode_decimal": 59874 }, { "icon_id": "1727410", "name": "49计算器、利率", "font_class": "jisuanqilishuai", "unicode": "e8e3", "unicode_decimal": 59619 }, { "icon_id": "11372703", "name": "首页", "font_class": "shouye1", "unicode": "e9e3", "unicode_decimal": 59875 }, { "icon_id": "1727411", "name": "49计算器、利率-线性", "font_class": "jisuanqilishuai-xianxing", "unicode": "e8e4", "unicode_decimal": 59620 }, { "icon_id": "11372704", "name": "数据", "font_class": "shuju", "unicode": "e9e4", "unicode_decimal": 59876 }, { "icon_id": "1727414", "name": "201checkbox-未选", "font_class": "checkbox-weixuan", "unicode": "e8e5", "unicode_decimal": 59621 }, { "icon_id": "11372705", "name": "刷新", "font_class": "shuaxin1", "unicode": "e9e5", "unicode_decimal": 59877 }, { "icon_id": "1727415", "name": "201checkbox-选中", "font_class": "checkbox-xuanzhong", "unicode": "e8e6", "unicode_decimal": 59622 }, { "icon_id": "11372706", "name": "搜索", "font_class": "sousuo1", "unicode": "e9e6", "unicode_decimal": 59878 }, { "icon_id": "1727416", "name": "202Raidobox-未选", "font_class": "Raidobox-weixuan", "unicode": "e8e7", "unicode_decimal": 59623 }, { "icon_id": "11372707", "name": "叹号", "font_class": "tanhao", "unicode": "e9e7", "unicode_decimal": 59879 }, { "icon_id": "1727417", "name": "202Raidobox-选中", "font_class": "Raidobox-xuanzhong", "unicode": "e8e8", "unicode_decimal": 59624 }, { "icon_id": "11372708", "name": "讨论区", "font_class": "taolunqu", "unicode": "e9e8", "unicode_decimal": 59880 }, { "icon_id": "1727418", "name": "201checkbox-选中部分", "font_class": "checkbox-xuanzhongbufen", "unicode": "e8e9", "unicode_decimal": 59625 }, { "icon_id": "11372709", "name": "添加优惠券", "font_class": "tianjiayouhuiquan", "unicode": "e9e9", "unicode_decimal": 59881 }, { "icon_id": "1727419", "name": "203右下角勾选", "font_class": "youxiajiaogouxuan", "unicode": "e8ea", "unicode_decimal": 59626 }, { "icon_id": "11372710", "name": "提示", "font_class": "tishi", "unicode": "e9ea", "unicode_decimal": 59882 }, { "icon_id": "1727420", "name": "206搜索-线性", "font_class": "sousuo-xianxing", "unicode": "e8eb", "unicode_decimal": 59627 }, { "icon_id": "11372711", "name": "图片", "font_class": "tupian1", "unicode": "e9eb", "unicode_decimal": 59883 }, { "icon_id": "1727421", "name": "205设置-线性", "font_class": "shezhi-xianxing", "unicode": "e8ec", "unicode_decimal": 59628 }, { "icon_id": "11372712", "name": "退票", "font_class": "tuipiao", "unicode": "e9ec", "unicode_decimal": 59884 }, { "icon_id": "1727422", "name": "205设置", "font_class": "shezhi", "unicode": "e8ed", "unicode_decimal": 59629 }, { "icon_id": "11372713", "name": "未选中", "font_class": "weixuanzhong", "unicode": "e9ed", "unicode_decimal": 59885 }, { "icon_id": "1727423", "name": "204首页", "font_class": "shouye", "unicode": "e8ee", "unicode_decimal": 59630 }, { "icon_id": "11372714", "name": "微博", "font_class": "weibo", "unicode": "e9ee", "unicode_decimal": 59886 }, { "icon_id": "1727424", "name": "204首页-线性", "font_class": "shouye-xianxing", "unicode": "e8ef", "unicode_decimal": 59631 }, { "icon_id": "11372715", "name": "问卷", "font_class": "wenjuan", "unicode": "e9ef", "unicode_decimal": 59887 }, { "icon_id": "1727425", "name": "206搜索", "font_class": "sousuo", "unicode": "e8f0", "unicode_decimal": 59632 }, { "icon_id": "11372716", "name": "我的", "font_class": "wode", "unicode": "e9f0", "unicode_decimal": 59888 }, { "icon_id": "1727427", "name": "207问题-线性", "font_class": "wenti-xianxing", "unicode": "e8f1", "unicode_decimal": 59633 }, { "icon_id": "11372717", "name": "微信", "font_class": "weixin3", "unicode": "e9f1", "unicode_decimal": 59889 }, { "icon_id": "1727428", "name": "207问题", "font_class": "wenti", "unicode": "e8f2", "unicode_decimal": 59634 }, { "icon_id": "11372718", "name": "我的关注", "font_class": "wodeguanzhu", "unicode": "e9f2", "unicode_decimal": 59890 }, { "icon_id": "1727429", "name": "209电话-线性圆框", "font_class": "dianhua-xianxingyuankuang", "unicode": "e8f3", "unicode_decimal": 59635 }, { "icon_id": "11372719", "name": "虾米", "font_class": "xiami", "unicode": "e9f3", "unicode_decimal": 59891 }, { "icon_id": "1727430", "name": "208聊天、对话", "font_class": "liaotianduihua", "unicode": "e8f4", "unicode_decimal": 59636 }, { "icon_id": "11372720", "name": "想看", "font_class": "xiangkan", "unicode": "e9f4", "unicode_decimal": 59892 }, { "icon_id": "1727431", "name": "208聊天、对话-线性", "font_class": "liaotianduihua-xianxing", "unicode": "e8f5", "unicode_decimal": 59637 }, { "icon_id": "11372721", "name": "相机", "font_class": "xiangji", "unicode": "e9f5", "unicode_decimal": 59893 }, { "icon_id": "1727432", "name": "209电话", "font_class": "dianhua", "unicode": "e8f6", "unicode_decimal": 59638 }, { "icon_id": "11372722", "name": "消息", "font_class": "xiaoxi", "unicode": "e9f6", "unicode_decimal": 59894 }, { "icon_id": "1727433", "name": "209电话-圆框", "font_class": "dianhua-yuankuang", "unicode": "e8f7", "unicode_decimal": 59639 }, { "icon_id": "11372723", "name": "下载", "font_class": "xiazai", "unicode": "e9f7", "unicode_decimal": 59895 }, { "icon_id": "1727434", "name": "210信-线性", "font_class": "xin-xianxing", "unicode": "e8f8", "unicode_decimal": 59640 }, { "icon_id": "11372724", "name": "小聚场", "font_class": "xiaojuchang", "unicode": "e9f8", "unicode_decimal": 59896 }, { "icon_id": "1727435", "name": "211铃铛", "font_class": "lingdang", "unicode": "e8f9", "unicode_decimal": 59641 }, { "icon_id": "11372725", "name": "小食", "font_class": "xiaoshi", "unicode": "e9f9", "unicode_decimal": 59897 }, { "icon_id": "1727436", "name": "211铃铛-线性", "font_class": "lingdang-xianxing", "unicode": "e8fa", "unicode_decimal": 59642 }, { "icon_id": "11372726", "name": "消息中心", "font_class": "xiaoxizhongxin", "unicode": "e9fa", "unicode_decimal": 59898 }, { "icon_id": "1727437", "name": "210信", "font_class": "xin", "unicode": "e8fb", "unicode_decimal": 59643 }, { "icon_id": "11372727", "name": "银行卡", "font_class": "yinhangka", "unicode": "e9fb", "unicode_decimal": 59899 }, { "icon_id": "1727438", "name": "212喇叭-线性", "font_class": "laba-xianxing", "unicode": "e8fc", "unicode_decimal": 59644 }, { "icon_id": "11372728", "name": "眼睛", "font_class": "yanjing", "unicode": "e9fc", "unicode_decimal": 59900 }, { "icon_id": "1727439", "name": "212喇叭", "font_class": "laba", "unicode": "e8fd", "unicode_decimal": 59645 }, { "icon_id": "11372729", "name": "影城卡", "font_class": "yingchengka", "unicode": "e9fd", "unicode_decimal": 59901 }, { "icon_id": "1727440", "name": "213麦克风-线性", "font_class": "maikefeng-xianxing", "unicode": "e8fe", "unicode_decimal": 59646 }, { "icon_id": "11372730", "name": "已想看", "font_class": "yixiangkan", "unicode": "e9fe", "unicode_decimal": 59902 }, { "icon_id": "1727441", "name": "213收藏", "font_class": "shoucang", "unicode": "e8ff", "unicode_decimal": 59647 }, { "icon_id": "11372731", "name": "影评模板", "font_class": "yingpingmoban", "unicode": "e9ff", "unicode_decimal": 59903 }, { "icon_id": "1727442", "name": "213麦克风", "font_class": "maikefeng", "unicode": "e900", "unicode_decimal": 59648 }, { "icon_id": "11372732", "name": "演出", "font_class": "yanchu", "unicode": "ea00", "unicode_decimal": 59904 }, { "icon_id": "1727443", "name": "213喜欢-线性", "font_class": "xihuan-xianxing", "unicode": "e901", "unicode_decimal": 59649 }, { "icon_id": "11372733", "name": "小蜜", "font_class": "xiaomi", "unicode": "ea01", "unicode_decimal": 59905 }, { "icon_id": "1727444", "name": "213收藏-线性", "font_class": "shoucang-xianxing", "unicode": "e902", "unicode_decimal": 59650 }, { "icon_id": "11372734", "name": "影院", "font_class": "yingyuan", "unicode": "ea02", "unicode_decimal": 59906 }, { "icon_id": "1727445", "name": "213喜欢", "font_class": "xihuan", "unicode": "e903", "unicode_decimal": 59651 }, { "icon_id": "11372735", "name": "增加", "font_class": "zengjia", "unicode": "ea03", "unicode_decimal": 59907 }, { "icon_id": "1727446", "name": "215更多-横向", "font_class": "gengduo-hengxiang", "unicode": "e904", "unicode_decimal": 59652 }, { "icon_id": "11372736", "name": "语音", "font_class": "yuyin", "unicode": "ea04", "unicode_decimal": 59908 }, { "icon_id": "1727447", "name": "216更多-竖向", "font_class": "gengduo-shuxiang", "unicode": "e905", "unicode_decimal": 59653 }, { "icon_id": "11372737", "name": "优惠券", "font_class": "youhuiquan", "unicode": "ea05", "unicode_decimal": 59909 }, { "icon_id": "1727448", "name": "217时间-线性", "font_class": "shijian-xianxing", "unicode": "e906", "unicode_decimal": 59654 }, { "icon_id": "11372738", "name": "WIFI", "font_class": "WIFI", "unicode": "ea06", "unicode_decimal": 59910 }, { "icon_id": "1727449", "name": "214声波、语音消息", "font_class": "shengboyuyinxiaoxi", "unicode": "e907", "unicode_decimal": 59655 }, { "icon_id": "11372739", "name": "直播", "font_class": "zhibo", "unicode": "ea07", "unicode_decimal": 59911 }, { "icon_id": "1727450", "name": "217时间", "font_class": "shijian", "unicode": "e908", "unicode_decimal": 59656 }, { "icon_id": "11372740", "name": "优酷会员", "font_class": "youkuhuiyuan", "unicode": "ea08", "unicode_decimal": 59912 }, { "icon_id": "1727451", "name": "219上传、导出", "font_class": "shangchuandaochu", "unicode": "e909", "unicode_decimal": 59657 }, { "icon_id": "11372741", "name": "娱乐宝", "font_class": "yulebao", "unicode": "ea09", "unicode_decimal": 59913 }, { "icon_id": "1727452", "name": "218下载、导入", "font_class": "xiazaidaoru", "unicode": "e90a", "unicode_decimal": 59658 }, { "icon_id": "11372742", "name": "指纹", "font_class": "zhiwen", "unicode": "ea0a", "unicode_decimal": 59914 }, { "icon_id": "1727453", "name": "223保存-线性", "font_class": "baocun-xianxing", "unicode": "e90b", "unicode_decimal": 59659 }, { "icon_id": "11372756", "name": "爱心", "font_class": "aixin1", "unicode": "ea0b", "unicode_decimal": 59915 }, { "icon_id": "1727454", "name": "220闪光灯", "font_class": "shanguangdeng", "unicode": "e90c", "unicode_decimal": 59660 }, { "icon_id": "11372757", "name": "成功", "font_class": "chenggong1", "unicode": "ea0c", "unicode_decimal": 59916 }, { "icon_id": "1727455", "name": "222闪光灯-自动", "font_class": "shanguangdeng-zidong", "unicode": "e90d", "unicode_decimal": 59661 }, { "icon_id": "11372758", "name": "点赞", "font_class": "dianzan1", "unicode": "ea0d", "unicode_decimal": 59917 }, { "icon_id": "1727456", "name": "221闪光灯-关闭", "font_class": "shanguangdeng-guanbi", "unicode": "e90e", "unicode_decimal": 59662 }, { "icon_id": "11372759", "name": "电话", "font_class": "dianhua2", "unicode": "ea0e", "unicode_decimal": 59918 }, { "icon_id": "1727457", "name": "223保存", "font_class": "baocun", "unicode": "e90f", "unicode_decimal": 59663 }, { "icon_id": "11372760", "name": "帮助", "font_class": "bangzhu1", "unicode": "ea0f", "unicode_decimal": 59919 }, { "icon_id": "1727458", "name": "224用户-线性", "font_class": "yonghu-xianxing", "unicode": "e910", "unicode_decimal": 59664 }, { "icon_id": "11372761", "name": "电影票", "font_class": "dianyingpiao1", "unicode": "ea10", "unicode_decimal": 59920 }, { "icon_id": "1727459", "name": "224用户", "font_class": "yonghu", "unicode": "e911", "unicode_decimal": 59665 }, { "icon_id": "11372762", "name": "发现", "font_class": "faxian1", "unicode": "ea11", "unicode_decimal": 59921 }, { "icon_id": "1727460", "name": "226角色、群体", "font_class": "jiaosequnti", "unicode": "e912", "unicode_decimal": 59666 }, { "icon_id": "11372763", "name": "定位", "font_class": "dingwei2", "unicode": "ea12", "unicode_decimal": 59922 }, { "icon_id": "1727461", "name": "225默认头像", "font_class": "morentouxiang", "unicode": "e913", "unicode_decimal": 59667 }, { "icon_id": "11372764", "name": "公告", "font_class": "gonggao", "unicode": "ea13", "unicode_decimal": 59923 }, { "icon_id": "1727462", "name": "227注册、添加好友", "font_class": "zhucetianjiahaoyou", "unicode": "e914", "unicode_decimal": 59668 }, { "icon_id": "11372765", "name": "话题", "font_class": "huati1", "unicode": "ea14", "unicode_decimal": 59924 }, { "icon_id": "1727466", "name": "228任务", "font_class": "renwu", "unicode": "e915", "unicode_decimal": 59669 }, { "icon_id": "11372766", "name": "减少", "font_class": "jianshao1", "unicode": "ea15", "unicode_decimal": 59925 }, { "icon_id": "1727467", "name": "229中文模式", "font_class": "zhongwenmoshi", "unicode": "e916", "unicode_decimal": 59670 }, { "icon_id": "11372767", "name": "会员", "font_class": "huiyuan1", "unicode": "ea16", "unicode_decimal": 59926 }, { "icon_id": "1727468", "name": "231附件", "font_class": "fujian", "unicode": "e917", "unicode_decimal": 59671 }, { "icon_id": "11372768", "name": "评论", "font_class": "pinglun1", "unicode": "ea17", "unicode_decimal": 59927 }, { "icon_id": "1727469", "name": "232编辑、输入-线性", "font_class": "bianjishuru-xianxing", "unicode": "e918", "unicode_decimal": 59672 }, { "icon_id": "11372769", "name": "社区", "font_class": "shequ1", "unicode": "ea18", "unicode_decimal": 59928 }, { "icon_id": "1727470", "name": "232编辑、输入", "font_class": "bianjishuru", "unicode": "e919", "unicode_decimal": 59673 }, { "icon_id": "11372770", "name": "失败", "font_class": "shibai1", "unicode": "ea19", "unicode_decimal": 59929 }, { "icon_id": "1727471", "name": "230英文模式", "font_class": "yingwenmoshi", "unicode": "e91a", "unicode_decimal": 59674 }, { "icon_id": "11372771", "name": "时间", "font_class": "shijian2", "unicode": "ea1a", "unicode_decimal": 59930 }, { "icon_id": "1727472", "name": "233键盘-线性", "font_class": "jianpan-xianxing", "unicode": "e91b", "unicode_decimal": 59675 }, { "icon_id": "11372772", "name": "闪电", "font_class": "shandian1", "unicode": "ea1b", "unicode_decimal": 59931 }, { "icon_id": "1727473", "name": "233键盘", "font_class": "jianpan", "unicode": "e91c", "unicode_decimal": 59676 }, { "icon_id": "11372773", "name": "我的", "font_class": "wode1", "unicode": "ea1c", "unicode_decimal": 59932 }, { "icon_id": "1727474", "name": "234日历", "font_class": "rili", "unicode": "e91d", "unicode_decimal": 59677 }, { "icon_id": "11372774", "name": "首页", "font_class": "shouye2", "unicode": "ea1d", "unicode_decimal": 59933 }, { "icon_id": "1727475", "name": "236未出勤", "font_class": "weichuqin", "unicode": "e91e", "unicode_decimal": 59678 }, { "icon_id": "11372775", "name": "手机", "font_class": "shouji1", "unicode": "ea1e", "unicode_decimal": 59934 }, { "icon_id": "1727476", "name": "235考勤、出勤", "font_class": "kaoqinchuqin", "unicode": "e91f", "unicode_decimal": 59679 }, { "icon_id": "11372776", "name": "叹号", "font_class": "tanhao1", "unicode": "ea1f", "unicode_decimal": 59935 }, { "icon_id": "1727477", "name": "237拍照", "font_class": "paizhao", "unicode": "e920", "unicode_decimal": 59680 }, { "icon_id": "11372777", "name": "收藏", "font_class": "shoucang2", "unicode": "ea20", "unicode_decimal": 59936 }, { "icon_id": "1727478", "name": "237拍照-线性", "font_class": "paizhao-xianxing", "unicode": "e921", "unicode_decimal": 59681 }, { "icon_id": "11372778", "name": "数据", "font_class": "shuju1", "unicode": "ea21", "unicode_decimal": 59937 }, { "icon_id": "1727479", "name": "238图片-线性", "font_class": "tupian-xianxing", "unicode": "e922", "unicode_decimal": 59682 }, { "icon_id": "11372779", "name": "问答", "font_class": "wenda", "unicode": "ea22", "unicode_decimal": 59938 }, { "icon_id": "1727480", "name": "238图片", "font_class": "tupian", "unicode": "e923", "unicode_decimal": 59683 }, { "icon_id": "11372780", "name": "眼睛", "font_class": "yanjing1", "unicode": "ea23", "unicode_decimal": 59939 }, { "icon_id": "1727483", "name": "239扫描", "font_class": "saomiao", "unicode": "e924", "unicode_decimal": 59684 }, { "icon_id": "11372781", "name": "影城卡", "font_class": "yingchengka1", "unicode": "ea24", "unicode_decimal": 59940 }, { "icon_id": "1727484", "name": "240显示、可见", "font_class": "xianshikejian", "unicode": "e925", "unicode_decimal": 59685 }, { "icon_id": "11372782", "name": "相机", "font_class": "xiangji1", "unicode": "ea25", "unicode_decimal": 59941 }, { "icon_id": "1727485", "name": "242锁定", "font_class": "suoding", "unicode": "e926", "unicode_decimal": 59686 }, { "icon_id": "11372783", "name": "影院", "font_class": "yingyuan1", "unicode": "ea26", "unicode_decimal": 59942 }, { "icon_id": "1727486", "name": "241隐藏、不可见", "font_class": "yincangbukejian", "unicode": "e927", "unicode_decimal": 59687 }, { "icon_id": "11372784", "name": "银行优惠", "font_class": "yinhangyouhui", "unicode": "ea27", "unicode_decimal": 59943 }, { "icon_id": "1727487", "name": "243解锁", "font_class": "jiesuo", "unicode": "e928", "unicode_decimal": 59688 }, { "icon_id": "11372785", "name": "小食", "font_class": "xiaoshi1", "unicode": "ea28", "unicode_decimal": 59944 }, { "icon_id": "1727488", "name": "244安装、施工-线性", "font_class": "anzhuangshigong-xianxing", "unicode": "e929", "unicode_decimal": 59689 }, { "icon_id": "11372786", "name": "演出", "font_class": "yanchu1", "unicode": "ea29", "unicode_decimal": 59945 }, { "icon_id": "1727489", "name": "245筛选过滤", "font_class": "shaixuanguolv", "unicode": "e92a", "unicode_decimal": 59690 }, { "icon_id": "11372787", "name": "增加", "font_class": "zengjia1", "unicode": "ea2a", "unicode_decimal": 59946 }, { "icon_id": "1727490", "name": "244安装、施工", "font_class": "anzhuangshigong", "unicode": "e92b", "unicode_decimal": 59691 }, { "icon_id": "11372788", "name": "电影", "font_class": "dianying1", "unicode": "ea2b", "unicode_decimal": 59947 }, { "icon_id": "1727491", "name": "246注销、关机", "font_class": "zhuxiaoguanji", "unicode": "e92c", "unicode_decimal": 59692 }, { "icon_id": "11372789", "name": "优惠券", "font_class": "youhuiquan1", "unicode": "ea2c", "unicode_decimal": 59948 }, { "icon_id": "1727492", "name": "247好评-圆框", "font_class": "haoping-yuankuang", "unicode": "e92d", "unicode_decimal": 59693 }, { "icon_id": "11372790", "name": "热门", "font_class": "remen", "unicode": "ea2d", "unicode_decimal": 59949 }, { "icon_id": "1727493", "name": "248差评-圆框", "font_class": "chaping-yuankuang", "unicode": "e92e", "unicode_decimal": 59694 }, { "icon_id": "11372791", "name": "创作", "font_class": "chuangzuo1", "unicode": "ea2e", "unicode_decimal": 59950 }, { "icon_id": "1727494", "name": "248差评", "font_class": "chaping", "unicode": "e92f", "unicode_decimal": 59695 }, { "icon_id": "1727495", "name": "247好评", "font_class": "haoping", "unicode": "e930", "unicode_decimal": 59696 }, { "icon_id": "1727496", "name": "250一般", "font_class": "yiban", "unicode": "e931", "unicode_decimal": 59697 }, { "icon_id": "1727497", "name": "249满意", "font_class": "manyi", "unicode": "e932", "unicode_decimal": 59698 }, { "icon_id": "1727498", "name": "251不满意", "font_class": "bumanyi", "unicode": "e933", "unicode_decimal": 59699 }, { "icon_id": "1727500", "name": "253列表视图、菜单", "font_class": "liebiaoshitucaidan", "unicode": "e934", "unicode_decimal": 59700 }, { "icon_id": "1727501", "name": "252宫格视图", "font_class": "gonggeshitu", "unicode": "e935", "unicode_decimal": 59701 }, { "icon_id": "1727502", "name": "255Phone手机", "font_class": "Phoneshouji", "unicode": "e936", "unicode_decimal": 59702 }, { "icon_id": "1727503", "name": "254PC台式机", "font_class": "PCtaishiji", "unicode": "e937", "unicode_decimal": 59703 }, { "icon_id": "1727504", "name": "256PDA手持工作设备", "font_class": "PDAshouchigongzuoshebei", "unicode": "e938", "unicode_decimal": 59704 }, { "icon_id": "1727506", "name": "301加-方框", "font_class": "jia-fangkuang", "unicode": "e939", "unicode_decimal": 59705 }, { "icon_id": "1727507", "name": "301加-线性方框", "font_class": "jia-xianxingfangkuang", "unicode": "e93a", "unicode_decimal": 59706 }, { "icon_id": "1727508", "name": "301加-线性圆框", "font_class": "jia-xianxingyuankuang", "unicode": "e93b", "unicode_decimal": 59707 }, { "icon_id": "1727509", "name": "301加-圆框", "font_class": "jia-yuankuang", "unicode": "e93c", "unicode_decimal": 59708 }, { "icon_id": "1727510", "name": "302减-方框", "font_class": "jian-fangkuang", "unicode": "e93d", "unicode_decimal": 59709 }, { "icon_id": "1727511", "name": "301加", "font_class": "jia", "unicode": "e93e", "unicode_decimal": 59710 }, { "icon_id": "1727512", "name": "302减-圆框", "font_class": "jian-yuankuang", "unicode": "e93f", "unicode_decimal": 59711 }, { "icon_id": "1727513", "name": "302减", "font_class": "jian", "unicode": "e940", "unicode_decimal": 59712 }, { "icon_id": "1727514", "name": "302减-线性方框", "font_class": "jian-xianxingfangkuang", "unicode": "e941", "unicode_decimal": 59713 }, { "icon_id": "1727515", "name": "303正确、完成-线性圆框", "font_class": "zhengquewancheng-xianxingyuankuang", "unicode": "e942", "unicode_decimal": 59714 }, { "icon_id": "1727516", "name": "303正确、完成-圆框", "font_class": "zhengquewancheng-yuankuang", "unicode": "e943", "unicode_decimal": 59715 }, { "icon_id": "1727517", "name": "303正确、完成", "font_class": "zhengquewancheng", "unicode": "e944", "unicode_decimal": 59716 }, { "icon_id": "1727518", "name": "302减-线性圆框", "font_class": "jian-xianxingyuankuang", "unicode": "e945", "unicode_decimal": 59717 }, { "icon_id": "1727520", "name": "304错误、关闭、取消-线性方框", "font_class": "cuowuguanbiquxiao-xianxingfangkuang", "unicode": "e946", "unicode_decimal": 59718 }, { "icon_id": "1727521", "name": "304错误、关闭、取消-圆框", "font_class": "cuowuguanbiquxiao-yuankuang", "unicode": "e947", "unicode_decimal": 59719 }, { "icon_id": "1727522", "name": "304错误、关闭、取消-线性圆框", "font_class": "cuowuguanbiquxiao-xianxingyuankuang", "unicode": "e948", "unicode_decimal": 59720 }, { "icon_id": "1727523", "name": "304错误、关闭、取消", "font_class": "cuowuguanbiquxiao", "unicode": "e949", "unicode_decimal": 59721 }, { "icon_id": "1727524", "name": "304错误、关闭、取消-方框", "font_class": "cuowuguanbiquxiao-fangkuang", "unicode": "e94a", "unicode_decimal": 59722 }, { "icon_id": "1727525", "name": "305信息-线性圆框", "font_class": "xinxi-xianxingyuankuang", "unicode": "e94b", "unicode_decimal": 59723 }, { "icon_id": "1727526", "name": "305信息", "font_class": "xinxi", "unicode": "e94c", "unicode_decimal": 59724 }, { "icon_id": "1727527", "name": "306问号-线性圆框", "font_class": "wenhao-xianxingyuankuang", "unicode": "e94d", "unicode_decimal": 59725 }, { "icon_id": "1727528", "name": "306问号", "font_class": "wenhao", "unicode": "e94e", "unicode_decimal": 59726 }, { "icon_id": "1727529", "name": "306问号-圆框", "font_class": "wenhao-yuankuang", "unicode": "e94f", "unicode_decimal": 59727 }, { "icon_id": "1727530", "name": "305信息-圆框", "font_class": "xinxi-yuankuang", "unicode": "e950", "unicode_decimal": 59728 }, { "icon_id": "1727531", "name": "307感叹号-三角框", "font_class": "gantanhao-sanjiaokuang", "unicode": "e951", "unicode_decimal": 59729 }, { "icon_id": "1727532", "name": "307感叹号-圆框", "font_class": "gantanhao-yuankuang", "unicode": "e952", "unicode_decimal": 59730 }, { "icon_id": "1727533", "name": "307感叹号-线性圆框", "font_class": "gantanhao-xianxingyuankuang", "unicode": "e953", "unicode_decimal": 59731 }, { "icon_id": "1727534", "name": "307感叹号-线性三角框", "font_class": "gantanhao-xianxingsanjiaokuang", "unicode": "e954", "unicode_decimal": 59732 }, { "icon_id": "1727535", "name": "307感叹号", "font_class": "gantanhao", "unicode": "e955", "unicode_decimal": 59733 }, { "icon_id": "1727537", "name": "308上一页、后退、返回-线性圆框", "font_class": "shangyiyehoutuifanhui-xianxingyuankuang", "unicode": "e956", "unicode_decimal": 59734 }, { "icon_id": "1727538", "name": "308上一页、后退、返回-圆框", "font_class": "shangyiyehoutuifanhui-yuankuang", "unicode": "e957", "unicode_decimal": 59735 }, { "icon_id": "1727539", "name": "309下一页、前进、查看更多-线性圆框", "font_class": "xiayiyeqianjinchakangengduo-xianxingyuankuang", "unicode": "e958", "unicode_decimal": 59736 }, { "icon_id": "1727540", "name": "309下一页、前进、查看更多-圆框", "font_class": "xiayiyeqianjinchakangengduo-yuankuang", "unicode": "e959", "unicode_decimal": 59737 }, { "icon_id": "1727541", "name": "308上一页、后退、返回", "font_class": "shangyiyehoutuifanhui", "unicode": "e95a", "unicode_decimal": 59738 }, { "icon_id": "1727542", "name": "309下一页、前进、查看更多", "font_class": "xiayiyeqianjinchakangengduo", "unicode": "e95b", "unicode_decimal": 59739 }, { "icon_id": "1727543", "name": "310向下、展开-线性圆框", "font_class": "xiangxiazhankai-xianxingyuankuang", "unicode": "e95c", "unicode_decimal": 59740 }, { "icon_id": "1727544", "name": "310向下、展开-圆框", "font_class": "xiangxiazhankai-yuankuang", "unicode": "e95d", "unicode_decimal": 59741 }, { "icon_id": "1727545", "name": "310向下、展开", "font_class": "xiangxiazhankai", "unicode": "e95e", "unicode_decimal": 59742 }, { "icon_id": "1727546", "name": "311向上、收起-圆框", "font_class": "xiangshangshouqi-yuankuang", "unicode": "e95f", "unicode_decimal": 59743 }, { "icon_id": "1727547", "name": "311向上、收起-线性圆框", "font_class": "xiangshangshouqi-xianxingyuankuang", "unicode": "e960", "unicode_decimal": 59744 }, { "icon_id": "1727548", "name": "312指向左", "font_class": "zhixiangzuo", "unicode": "e961", "unicode_decimal": 59745 }, { "icon_id": "1727549", "name": "313指向右", "font_class": "zhixiangyou", "unicode": "e962", "unicode_decimal": 59746 }, { "icon_id": "1727550", "name": "315指向上", "font_class": "zhixiangshang", "unicode": "e963", "unicode_decimal": 59747 }, { "icon_id": "1890248", "name": "微信", "font_class": "weixin2", "unicode": "e601", "unicode_decimal": 58881 }, { "icon_id": "3354374", "name": "支付宝", "font_class": "zhifubao", "unicode": "e600", "unicode_decimal": 58880 }, { "icon_id": "598413", "name": "QQ", "font_class": "qq", "unicode": "e62e", "unicode_decimal": 58926 }, { "icon_id": "881531", "name": "微信", "font_class": "weixin", "unicode": "e60e", "unicode_decimal": 58894 }, { "icon_id": "2269677", "name": "微信", "font_class": "weixin1", "unicode": "e621", "unicode_decimal": 58913 }, { "icon_id": "3176462", "name": "qq", "font_class": "qq1", "unicode": "e607", "unicode_decimal": 58887 }, { "icon_id": "3293098", "name": "qq", "font_class": "qq2", "unicode": "e66a", "unicode_decimal": 58986 }, { "icon_id": "5234182", "name": "支付宝", "font_class": "umidd17", "unicode": "e603", "unicode_decimal": 58883 }, { "icon_id": "212373", "name": "electrical", "font_class": "electrical", "unicode": "e6d4", "unicode_decimal": 59092 }, { "icon_id": "212376", "name": "home", "font_class": "home", "unicode": "e6d7", "unicode_decimal": 59095 }, { "icon_id": "212397", "name": "electronics", "font_class": "electronics", "unicode": "e6da", "unicode_decimal": 59098 }, { "icon_id": "212398", "name": "gifts", "font_class": "gifts", "unicode": "e6db", "unicode_decimal": 59099 }, { "icon_id": "212502", "name": "lights", "font_class": "lights", "unicode": "e6de", "unicode_decimal": 59102 }, { "icon_id": "212973", "name": "sports", "font_class": "sports", "unicode": "e6e0", "unicode_decimal": 59104 }, { "icon_id": "212999", "name": "toys", "font_class": "toys", "unicode": "e6e1", "unicode_decimal": 59105 }, { "icon_id": "213017", "name": "auto", "font_class": "auto", "unicode": "e6e3", "unicode_decimal": 59107 }, { "icon_id": "213018", "name": "jewelry", "font_class": "jewelry", "unicode": "e6e4", "unicode_decimal": 59108 }, { "icon_id": "221459", "name": "trade-assurance", "font_class": "trade-assurance", "unicode": "e6e5", "unicode_decimal": 59109 }, { "icon_id": "221461", "name": "browse", "font_class": "browse", "unicode": "e6e6", "unicode_decimal": 59110 }, { "icon_id": "221462", "name": "rfq-qm", "font_class": "rfqqm", "unicode": "e6e7", "unicode_decimal": 59111 }, { "icon_id": "221463", "name": "rfq-quantity", "font_class": "rfqquantity", "unicode": "e6e8", "unicode_decimal": 59112 }, { "icon_id": "221782", "name": "atm-away", "font_class": "atmaway", "unicode": "e6e9", "unicode_decimal": 59113 }, { "icon_id": "224984", "name": "rfq", "font_class": "rfq1", "unicode": "e6eb", "unicode_decimal": 59115 }, { "icon_id": "224985", "name": "scanning", "font_class": "scanning", "unicode": "e6ec", "unicode_decimal": 59116 }, { "icon_id": "238494", "name": "compare", "font_class": "compare", "unicode": "e6ee", "unicode_decimal": 59118 }, { "icon_id": "238497", "name": "filter", "font_class": "filter", "unicode": "e6f1", "unicode_decimal": 59121 }, { "icon_id": "238498", "name": "pin", "font_class": "pin", "unicode": "e6f2", "unicode_decimal": 59122 }, { "icon_id": "238499", "name": "history", "font_class": "history", "unicode": "e6f3", "unicode_decimal": 59123 }, { "icon_id": "238500", "name": "product-features", "font_class": "productfeatures", "unicode": "e6f4", "unicode_decimal": 59124 }, { "icon_id": "238501", "name": "supplier-features", "font_class": "supplierfeatures", "unicode": "e6f5", "unicode_decimal": 59125 }, { "icon_id": "238893", "name": "similar-product", "font_class": "similarproduct", "unicode": "e6f6", "unicode_decimal": 59126 }, { "icon_id": "240305", "name": "link", "font_class": "link", "unicode": "e6f7", "unicode_decimal": 59127 }, { "icon_id": "240311", "name": "cut", "font_class": "cut", "unicode": "e6f8", "unicode_decimal": 59128 }, { "icon_id": "240314", "name": "nav-list", "font_class": "navlist", "unicode": "e6fa", "unicode_decimal": 59130 }, { "icon_id": "240315", "name": "image-text", "font_class": "imagetext", "unicode": "e6fb", "unicode_decimal": 59131 }, { "icon_id": "240316", "name": "text", "font_class": "text", "unicode": "e6fc", "unicode_decimal": 59132 }, { "icon_id": "240317", "name": "move", "font_class": "move", "unicode": "e6fd", "unicode_decimal": 59133 }, { "icon_id": "243147", "name": "subtract", "font_class": "subtract", "unicode": "e6fe", "unicode_decimal": 59134 }, { "icon_id": "244729", "name": "dollar", "font_class": "dollar", "unicode": "e702", "unicode_decimal": 59138 }, { "icon_id": "303179", "name": "raw", "font_class": "raw", "unicode": "e704", "unicode_decimal": 59140 }, { "icon_id": "303209", "name": "office", "font_class": "office", "unicode": "e705", "unicode_decimal": 59141 }, { "icon_id": "303224", "name": "agriculture", "font_class": "agriculture", "unicode": "e707", "unicode_decimal": 59143 }, { "icon_id": "303284", "name": "machinery", "font_class": "machinery", "unicode": "e709", "unicode_decimal": 59145 }, { "icon_id": "321482", "name": "assessed-Badge", "font_class": "assessedbadge", "unicode": "e70a", "unicode_decimal": 59146 }, { "icon_id": "321992", "name": "personal-center", "font_class": "gerenzhongxin", "unicode": "e70b", "unicode_decimal": 59147 }, { "icon_id": "321993", "name": "integral", "font_class": "jifen", "unicode": "e70c", "unicode_decimal": 59148 }, { "icon_id": "323372", "name": "operation", "font_class": "operation", "unicode": "e70e", "unicode_decimal": 59150 }, { "icon_id": "332903", "name": "remind", "font_class": "remind1", "unicode": "e713", "unicode_decimal": 59155 }, { "icon_id": "344978", "name": "download", "font_class": "icondownload", "unicode": "e714", "unicode_decimal": 59156 }, { "icon_id": "364801", "name": "map", "font_class": "map", "unicode": "e715", "unicode_decimal": 59157 }, { "icon_id": "401293", "name": "bad", "font_class": "bad", "unicode": "e716", "unicode_decimal": 59158 }, { "icon_id": "401294", "name": "good", "font_class": "good", "unicode": "e717", "unicode_decimal": 59159 }, { "icon_id": "401307", "name": "skip", "font_class": "skip", "unicode": "e718", "unicode_decimal": 59160 }, { "icon_id": "415771", "name": "play", "font_class": "iconfontplay2", "unicode": "e719", "unicode_decimal": 59161 }, { "icon_id": "424338", "name": "stop", "font_class": "iconfontstop", "unicode": "e71a", "unicode_decimal": 59162 }, { "icon_id": "428474", "name": "compass", "font_class": "compass", "unicode": "e71b", "unicode_decimal": 59163 }, { "icon_id": "428475", "name": "security", "font_class": "security", "unicode": "e71c", "unicode_decimal": 59164 }, { "icon_id": "428864", "name": "share", "font_class": "share", "unicode": "e71d", "unicode_decimal": 59165 }, { "icon_id": "437515", "name": "store", "font_class": "store", "unicode": "e722", "unicode_decimal": 59170 }, { "icon_id": "437516", "name": "manage-order", "font_class": "manageorder", "unicode": "e723", "unicode_decimal": 59171 }, { "icon_id": "437517", "name": "rejected-order", "font_class": "rejectedorder", "unicode": "e724", "unicode_decimal": 59172 }, { "icon_id": "437518", "name": "phone", "font_class": "phone", "unicode": "e725", "unicode_decimal": 59173 }, { "icon_id": "437519", "name": "bussiness-man", "font_class": "bussinessman", "unicode": "e726", "unicode_decimal": 59174 }, { "icon_id": "460122", "name": "shoes", "font_class": "shoes", "unicode": "e728", "unicode_decimal": 59176 }, { "icon_id": "462212", "name": "Mobile-phone", "font_class": "mobilephone", "unicode": "e72a", "unicode_decimal": 59178 }, { "icon_id": "520450", "name": "email-filling", "font_class": "emailfilling", "unicode": "e72d", "unicode_decimal": 59181 }, { "icon_id": "520551", "name": "favorites-filling", "font_class": "favoritesfilling", "unicode": "e730", "unicode_decimal": 59184 }, { "icon_id": "520737", "name": "account-filling", "font_class": "accountfilling", "unicode": "e732", "unicode_decimal": 59186 }, { "icon_id": "543965", "name": "credit-level", "font_class": "creditlevel", "unicode": "e735", "unicode_decimal": 59189 }, { "icon_id": "543966", "name": "credit-level-filling", "font_class": "creditlevelfilling", "unicode": "e736", "unicode_decimal": 59190 }, { "icon_id": "622430", "name": "exl", "font_class": "exl", "unicode": "e73f", "unicode_decimal": 59199 }, { "icon_id": "622431", "name": "pdf", "font_class": "pdf", "unicode": "e740", "unicode_decimal": 59200 }, { "icon_id": "622432", "name": "zip", "font_class": "zip", "unicode": "e741", "unicode_decimal": 59201 }, { "icon_id": "627893", "name": "sorting", "font_class": "sorting", "unicode": "e743", "unicode_decimal": 59203 }, { "icon_id": "657583", "name": "copy", "font_class": "copy", "unicode": "e744", "unicode_decimal": 59204 }, { "icon_id": "710085", "name": "save", "font_class": "save", "unicode": "e747", "unicode_decimal": 59207 }, { "icon_id": "710249", "name": " inquiry-template", "font_class": "inquirytemplate", "unicode": "e749", "unicode_decimal": 59209 }, { "icon_id": "710408", "name": "template-default", "font_class": "templatedefault", "unicode": "e74a", "unicode_decimal": 59210 }, { "icon_id": "856292", "name": "libra", "font_class": "libra", "unicode": "e74c", "unicode_decimal": 59212 }, { "icon_id": "874681", "name": "survey", "font_class": "survey1", "unicode": "e74e", "unicode_decimal": 59214 }, { "icon_id": "933540", "name": "ship", "font_class": "ship", "unicode": "e74f", "unicode_decimal": 59215 }, { "icon_id": "1033916", "name": "bussiness-card", "font_class": "bussinesscard", "unicode": "e753", "unicode_decimal": 59219 }, { "icon_id": "1036414", "name": "hot", "font_class": "hot", "unicode": "e756", "unicode_decimal": 59222 }, { "icon_id": "1099498", "name": "data", "font_class": "data", "unicode": "e757", "unicode_decimal": 59223 }, { "icon_id": "1099499", "name": "trade", "font_class": "trade", "unicode": "e758", "unicode_decimal": 59224 }, { "icon_id": "1103888", "name": "onepage", "font_class": "onepage48", "unicode": "e75a", "unicode_decimal": 59226 }, { "icon_id": "1389511", "name": "signboard", "font_class": "signboard", "unicode": "e75c", "unicode_decimal": 59228 }, { "icon_id": "1389513", "name": "shuffling-banner", "font_class": "shuffling-banner", "unicode": "e75e", "unicode_decimal": 59230 }, { "icon_id": "1389514", "name": "component", "font_class": "component", "unicode": "e75f", "unicode_decimal": 59231 }, { "icon_id": "1389516", "name": "component-filling", "font_class": "component-filling", "unicode": "e760", "unicode_decimal": 59232 }, { "icon_id": "1389605", "name": "color", "font_class": "color", "unicode": "e761", "unicode_decimal": 59233 }, { "icon_id": "1416446", "name": "color-filling", "font_class": "color-filling", "unicode": "e7cd", "unicode_decimal": 59341 }, { "icon_id": "1450549", "name": "favorites", "font_class": "favorites", "unicode": "e7ce", "unicode_decimal": 59342 }, { "icon_id": "1489999", "name": "pic-filling", "font_class": "pic-filling", "unicode": "e802", "unicode_decimal": 59394 }, { "icon_id": "1491901", "name": "RFQ", "font_class": "RFQ", "unicode": "e803", "unicode_decimal": 59395 }, { "icon_id": "1491902", "name": "RFQ-filling", "font_class": "RFQ-filling", "unicode": "e804", "unicode_decimal": 59396 }, { "icon_id": "1519161", "name": "original-image", "font_class": "originalimage", "unicode": "e806", "unicode_decimal": 59398 }, { "icon_id": "1573888", "name": "logistic", "font_class": "logistic", "unicode": "e811", "unicode_decimal": 59409 }, { "icon_id": "1586166", "name": "Calculator", "font_class": "Calculator", "unicode": "e812", "unicode_decimal": 59410 }, { "icon_id": "1937963", "name": "video", "font_class": "video", "unicode": "e820", "unicode_decimal": 59424 }, { "icon_id": "1979955", "name": "earth", "font_class": "earth", "unicode": "e828", "unicode_decimal": 59432 }, { "icon_id": "1988626", "name": "task-management", "font_class": "task-management", "unicode": "e829", "unicode_decimal": 59433 }, { "icon_id": "1991485", "name": "trust", "font_class": "trust", "unicode": "e82a", "unicode_decimal": 59434 }, { "icon_id": "2093026", "name": "password", "font_class": "password", "unicode": "e82b", "unicode_decimal": 59435 }, { "icon_id": "2273341", "name": "3column", "font_class": "column", "unicode": "e839", "unicode_decimal": 59449 }, { "icon_id": "2273342", "name": "apparel", "font_class": "apparel", "unicode": "e83a", "unicode_decimal": 59450 }, { "icon_id": "2273344", "name": "bags", "font_class": "bags", "unicode": "e83b", "unicode_decimal": 59451 }, { "icon_id": "2273372", "name": "folder", "font_class": "folder", "unicode": "e83c", "unicode_decimal": 59452 }, { "icon_id": "2273412", "name": "4column", "font_class": "column1", "unicode": "e83d", "unicode_decimal": 59453 }, { "icon_id": "2357626", "name": "code", "font_class": "code", "unicode": "e842", "unicode_decimal": 59458 }, { "icon_id": "2364342", "name": "RFQ-filling", "font_class": "RFQ-filling1", "unicode": "e843", "unicode_decimal": 59459 }, { "icon_id": "2670451", "name": "customs-clearance", "font_class": "customs-clearance", "unicode": "e863", "unicode_decimal": 59491 }, { "icon_id": "2954833", "name": "good-filling", "font_class": "good-filling", "unicode": "e866", "unicode_decimal": 59494 }, { "icon_id": "3583597", "name": "camera", "font_class": "camera", "unicode": "e86e", "unicode_decimal": 59502 }, { "icon_id": "5203487", "name": "pin-fill", "font_class": "pin-fill", "unicode": "e87a", "unicode_decimal": 59514 }, { "icon_id": "5203488", "name": "help-fill", "font_class": "help-fill", "unicode": "e87b", "unicode_decimal": 59515 }, { "icon_id": "5203489", "name": "add-account", "font_class": "add-account", "unicode": "e87c", "unicode_decimal": 59516 }, { "icon_id": "5799945", "name": "listing-content", "font_class": "listing-content", "unicode": "e87d", "unicode_decimal": 59517 }, { "icon_id": "5799946", "name": "warehouse-delivery ", "font_class": "warehouse-delivery", "unicode": "e87e", "unicode_decimal": 59518 }, { "icon_id": "5799947", "name": "customization", "font_class": "customization", "unicode": "e87f", "unicode_decimal": 59519 }, { "icon_id": "5799948", "name": "inspection", "font_class": "inspection", "unicode": "e880", "unicode_decimal": 59520 }, { "icon_id": "5799949", "name": "packing-labeling ", "font_class": "packing-labeling", "unicode": "e881", "unicode_decimal": 59521 }, { "icon_id": "5799950", "name": "online-tracking", "font_class": "online-tracking", "unicode": "e882", "unicode_decimal": 59522 }, { "icon_id": "5973112", "name": "play-filling", "font_class": "play-filling", "unicode": "e883", "unicode_decimal": 59523 }, { "icon_id": "5973113", "name": "nosound-filling", "font_class": "nosound-filling", "unicode": "e884", "unicode_decimal": 59524 }, { "icon_id": "5973114", "name": "sound-filling", "font_class": "sound-filling", "unicode": "e885", "unicode_decimal": 59525 }, { "icon_id": "7711442", "name": "electrical-equipment", "font_class": "electrical-equipment", "unicode": "e886", "unicode_decimal": 59526 }, { "icon_id": "7711443", "name": "home-appliances", "font_class": "home-appliances", "unicode": "e887", "unicode_decimal": 59527 }, { "icon_id": "7711444", "name": "furniture", "font_class": "furniture", "unicode": "e888", "unicode_decimal": 59528 }, { "icon_id": "7711445", "name": "fashion-accessories", "font_class": "fashion-accessories", "unicode": "e889", "unicode_decimal": 59529 }, { "icon_id": "7711446", "name": "security-protection", "font_class": "security-protection", "unicode": "e88a", "unicode_decimal": 59530 }, { "icon_id": "7711447", "name": "textile-products", "font_class": "textile-products", "unicode": "e88b", "unicode_decimal": 59531 }, { "icon_id": "7711448", "name": "tools-hardware", "font_class": "tools-hardware", "unicode": "e88c", "unicode_decimal": 59532 }, { "icon_id": "7711449", "name": "office-supplies", "font_class": "office-supplies", "unicode": "e88d", "unicode_decimal": 59533 }, { "icon_id": "7711450", "name": "vehicles", "font_class": "vehicles", "unicode": "e88e", "unicode_decimal": 59534 }, { "icon_id": "122687", "name": "all", "font_class": "all", "unicode": "e696", "unicode_decimal": 59030 }, { "icon_id": "122688", "name": "back", "font_class": "back", "unicode": "e697", "unicode_decimal": 59031 }, { "icon_id": "122689", "name": "cart", "font_class": "cart", "unicode": "e698", "unicode_decimal": 59032 }, { "icon_id": "122690", "name": "Category", "font_class": "category", "unicode": "e699", "unicode_decimal": 59033 }, { "icon_id": "122691", "name": "close", "font_class": "close", "unicode": "e69a", "unicode_decimal": 59034 }, { "icon_id": "122692", "name": "comments", "font_class": "comments", "unicode": "e69b", "unicode_decimal": 59035 }, { "icon_id": "122693", "name": "cry", "font_class": "cry", "unicode": "e69c", "unicode_decimal": 59036 }, { "icon_id": "122694", "name": "delete", "font_class": "delete", "unicode": "e69d", "unicode_decimal": 59037 }, { "icon_id": "122695", "name": "edit", "font_class": "edit", "unicode": "e69e", "unicode_decimal": 59038 }, { "icon_id": "122696", "name": "email", "font_class": "email", "unicode": "e69f", "unicode_decimal": 59039 }, { "icon_id": "122697", "name": "favorite", "font_class": "favorite", "unicode": "e6a0", "unicode_decimal": 59040 }, { "icon_id": "122699", "name": "form", "font_class": "form", "unicode": "e6a2", "unicode_decimal": 59042 }, { "icon_id": "122700", "name": "help", "font_class": "help", "unicode": "e6a3", "unicode_decimal": 59043 }, { "icon_id": "122701", "name": "information", "font_class": "information", "unicode": "e6a4", "unicode_decimal": 59044 }, { "icon_id": "122702", "name": "less", "font_class": "less", "unicode": "e6a5", "unicode_decimal": 59045 }, { "icon_id": "122703", "name": "more_unfold", "font_class": "moreunfold", "unicode": "e6a6", "unicode_decimal": 59046 }, { "icon_id": "122704", "name": "more", "font_class": "more", "unicode": "e6a7", "unicode_decimal": 59047 }, { "icon_id": "122705", "name": "pic", "font_class": "pic", "unicode": "e6a8", "unicode_decimal": 59048 }, { "icon_id": "122706", "name": "QRCode", "font_class": "qrcode", "unicode": "e6a9", "unicode_decimal": 59049 }, { "icon_id": "122707", "name": "refresh", "font_class": "refresh", "unicode": "e6aa", "unicode_decimal": 59050 }, { "icon_id": "122708", "name": "RFQ", "font_class": "rfq", "unicode": "e6ab", "unicode_decimal": 59051 }, { "icon_id": "122709", "name": "search", "font_class": "search", "unicode": "e6ac", "unicode_decimal": 59052 }, { "icon_id": "122710", "name": "selected", "font_class": "selected", "unicode": "e6ad", "unicode_decimal": 59053 }, { "icon_id": "122711", "name": "set", "font_class": "set", "unicode": "e6ae", "unicode_decimal": 59054 }, { "icon_id": "122712", "name": "Smile", "font_class": "smile", "unicode": "e6af", "unicode_decimal": 59055 }, { "icon_id": "122714", "name": "success", "font_class": "success", "unicode": "e6b1", "unicode_decimal": 59057 }, { "icon_id": "122715", "name": "survey", "font_class": "survey", "unicode": "e6b2", "unicode_decimal": 59058 }, { "icon_id": "122716", "name": "training", "font_class": "training", "unicode": "e6b3", "unicode_decimal": 59059 }, { "icon_id": "122717", "name": "ViewGallery", "font_class": "viewgallery", "unicode": "e6b4", "unicode_decimal": 59060 }, { "icon_id": "122718", "name": "Viewlist", "font_class": "viewlist", "unicode": "e6b5", "unicode_decimal": 59061 }, { "icon_id": "122719", "name": "warning", "font_class": "warning", "unicode": "e6b6", "unicode_decimal": 59062 }, { "icon_id": "122720", "name": "wrong", "font_class": "wrong", "unicode": "e6b7", "unicode_decimal": 59063 }, { "icon_id": "122721", "name": "account", "font_class": "account", "unicode": "e6b8", "unicode_decimal": 59064 }, { "icon_id": "122722", "name": "add", "font_class": "add", "unicode": "e6b9", "unicode_decimal": 59065 }, { "icon_id": "122723", "name": "atm", "font_class": "atm", "unicode": "e6ba", "unicode_decimal": 59066 }, { "icon_id": "135538", "name": "clock", "font_class": "clock", "unicode": "e6bb", "unicode_decimal": 59067 }, { "icon_id": "135539", "name": "remind", "font_class": "remind", "unicode": "e6bc", "unicode_decimal": 59068 }, { "icon_id": "146465", "name": "calendar", "font_class": "calendar", "unicode": "e6bf", "unicode_decimal": 59071 }, { "icon_id": "186635", "name": "attachment", "font_class": "attachment", "unicode": "e6c0", "unicode_decimal": 59072 }, { "icon_id": "204017", "name": "discount", "font_class": "discount", "unicode": "e6c5", "unicode_decimal": 59077 }, { "icon_id": "208895", "name": "service", "font_class": "service", "unicode": "e6c7", "unicode_decimal": 59079 }, { "icon_id": "208936", "name": "print", "font_class": "print", "unicode": "e6c9", "unicode_decimal": 59081 }, { "icon_id": "211390", "name": "box", "font_class": "box", "unicode": "e6cb", "unicode_decimal": 59083 }, { "icon_id": "211433", "name": "process", "font_class": "process", "unicode": "e6ce", "unicode_decimal": 59086 }, { "icon_id": "212371", "name": "beauty", "font_class": "beauty", "unicode": "e6d2", "unicode_decimal": 59090 } ] } ================================================ FILE: app/admin/t/tpl/style/js/target_page.js ================================================ /*弹出层*/ /* 参数解释: title 标题 url 请求的url id 需要操作的数据id w 弹出层宽度(缺省调默认值) h 弹出层高度(缺省调默认值) */ function x_admin_show(title,url,w,h){ window.location.href=url; } function x_top_show(title,url,w,h){ window.location.href=url; } ================================================ FILE: app/admin/t/tpl/style/js/target_window.js ================================================ /*弹出层*/ /* 参数解释: title 标题 url 请求的url id 需要操作的数据id w 弹出层宽度(缺省调默认值) h 弹出层高度(缺省调默认值) */ function x_admin_show(title,url,w,h){ if (title == null || title == '') { title=false; }; if (url == null || url == '') { url="404.html"; }; if (w == null || w == '') { w=($(window).width()*0.9); }; if (h == null || h == '') { h=($(window).height() - 50); }; //window.location.href=url;return false; layer.open({ type: 2, area: [w+'px', h +'px'], fix: false, //不固定 maxmin: true, shadeClose: false, shade:0.4, title: title, content: url }); } function x_top_show(title,url,w,h){ if (title == null || title == '') { title=false; }; if (url == null || url == '') { url="404.html"; }; if (w == null || w == '') { w=($(window).width()*0.9); }; if (h == null || h == '') { h=($(window).height() - 50); }; //window.location.href=url;return false; layer.open({ type: 2, area: [w+'px', h +'px'], fix: false, //不固定 maxmin: true, shadeClose: false, shade:0.4, title: title, content: url }); } ================================================ FILE: app/admin/t/tpl/style/js/xadmin.js ================================================ $(function () { //加载弹出层 layui.use(['form','element'], function() { layer = layui.layer; element = layui.element; }); //触发事件 var tab = { tabAdd: function(title,url,id){ //新增一个Tab项 element.tabAdd('xbs_tab', { title: title ,content: '' ,id: id }) } ,tabDelete: function(othis){ element.tabDelete('xbs_tab',othis); } ,tabChange: function(id){ //切换到指定Tab项 element.tabChange('xbs_tab', id); //切换到:用户管理 } ,closeother: function() { $('.layui-tab-title li').each(function(i,el){ var id = $(el).attr('lay-id'); if(!$(this).hasClass('layui-this') && id!=''){ element.tabDelete('xbs_tab', id); } }); } ,closeall: function(t) { $('.layui-tab-title li').each(function(){ var id = parseInt($(this).attr('lay-id')); if(id>0){ element.tabDelete('xbs_tab', id); } }) $('.layui-tab-title li').eq(0).addClass('layui-this'); }, }; tableCheck = { init:function () { $(document).on("click",".header.layui-form-checkbox,.x-cate .layui-form-checkbox",function(){ if($(this).hasClass('layui-form-checked')){ $(this).removeClass('layui-form-checked'); if($(this).hasClass('header')){ $(".layui-form-checkbox").removeClass('layui-form-checked'); } }else{ $(this).addClass('layui-form-checked'); if($(this).hasClass('header')){ $(".layui-form-checkbox").addClass('layui-form-checked'); } } }) }, getData:function () { var obj = $(".layui-form-checked").not('.header'); var arr=[]; obj.each(function(index, el) { arr.push(obj.eq(index).attr('data-id')); }); return arr; } } //开启表格多选 tableCheck.init(); $('.container .left_open i').click(function(event) { if($('.left-nav').css('left')=='0px'){ $('.left-nav').animate({left: '-200px'}, 100); $('.page-content').animate({left: '0px'}, 100); $('.page-content-bg').hide(); }else{ $('.left-nav').animate({left: '0px'}, 100); $('.page-content').animate({left: '200px'}, 100); if($(window).width()<768){ $('.page-content-bg').show(); } } }); $('.page-content-bg').click(function(event) { $('.left-nav').animate({left: '-221px'}, 100); $('.page-content').animate({left: '0px'}, 100); $(this).hide(); }); $('.layui-tab-close').click(function(event) { $('.layui-tab-title li').eq(0).find('i').remove(); }); //$("tbody.x-cate tr[fid!='0']").hide(); // 栏目多级显示效果 $(document).on("click",".x-show",function(){ if($(this).attr('status')=='true'){ $(this).html(''); $(this).attr('status','false'); cateId = $(this).parents('tr').attr('cate-id'); $("tbody tr[fid="+cateId+"]").show(); }else{ cateIds = []; $(this).html(''); $(this).attr('status','true'); cateId = $(this).parents('tr').attr('cate-id'); getCateId(cateId); for (var i in cateIds) { $("tbody tr[cate-id="+cateIds[i]+"]").hide().find('.x-show').html('').attr('status','true'); } } }) //左侧菜单效果 // $('#content').bind("click",function(event){ $('.left-nav #nav li').click(function (event) { if($(this).children('.sub-menu').length){ if($(this).hasClass('open')){ $(this).removeClass('open'); $(this).find('.nav_right').html(''); $(this).children('.sub-menu').stop().slideUp(); $(this).siblings().children('.sub-menu').slideUp(); }else{ $(this).addClass('open'); $(this).children('a').find('.nav_right').html(''); $(this).children('.sub-menu').stop().slideDown(); $(this).siblings().children('.sub-menu').stop().slideUp(); $(this).siblings().find('.nav_right').html(''); $(this).siblings().removeClass('open'); } }else{ var url = $(this).children('a').attr('_href'); var title = $(this).find('a').html(); var index = $('.left-nav #nav li').index($(this)); if($(this).parents().hasClass('sub-menu')){ $("ul.sub-menu li").removeClass('current'); $(this).addClass('current'); } for (var i = 0; i <$('.x-iframe').length; i++) { if($('.x-iframe').eq(i).attr('tab-id')==index+1){ tab.tabChange(index+1); event.stopPropagation(); $('.x-iframe').eq(i).attr("src",$('.x-iframe').eq(i).attr('src')); return; } }; tab.tabAdd(title,url,index+1); tab.tabChange(index+1); } event.stopPropagation(); CustomRightClick(); }) $('a.top_nav').click(function (event) { var url = $(this).attr('x_href'); var title =$(this).html(); var left_index = $('.left-nav #nav li').length; var top_index = $('a.top_nav').length; var right_index = $('a.top_nav_right').length; var own_index = $("dd.top-nav").index($(this).parent())+$(this).parent().parent().parent().index(); var all_index = left_index+own_index+top_index+right_index; for (var i = 0; i <$('.x-iframe').length; i++) { if($('.x-iframe').eq(i).attr('tab-id')==(all_index+1)){ tab.tabChange(all_index+1); event.stopPropagation(); $('.x-iframe').eq(i).attr("src",url); return; } }; tab.tabAdd(title,url,all_index+1); tab.tabChange(all_index+1); event.stopPropagation(); CustomRightClick(); }) $('a.top_nav_right').click(function (event) { var url = $(this).attr('x_href'); var title =$(this).text(); var left_index = $('.left-nav #nav li').length; var top_index = $('a.top_nav').length; var right_index = $('a.top_nav_right').length; var own_index = $(this).index(); var all_index = left_index+own_index+top_index+right_index; for (var i = 0; i <$('.x-iframe').length; i++) { if($('.x-iframe').eq(i).attr('tab-id')==(all_index+2)){ tab.tabChange(all_index+2); event.stopPropagation(); $('.x-iframe').eq(i).attr("src",url); return; } }; tab.tabAdd(title,url,all_index+2); tab.tabChange(all_index+2); event.stopPropagation(); CustomRightClick(); }) $(".rightmenu li").click(function () { if ($(this).attr("data-type") == "closethis") { var tabid = $(".layui-tab-title li.layui-this").attr('lay-id');// 获取当前激活的选项卡ID tab.tabDelete(tabid); } else if ($(this).attr("data-type") == "closeall") { tab.closeall(); }else{ tab.closeother(); } $('.rightmenu').hide(); }) }) var cateIds = []; function getCateId(cateId) { $("tbody tr[fid="+cateId+"]").each(function(index, el) { id = $(el).attr('cate-id'); cateIds.push(id); getCateId(id); }); } /*弹出层*/ /* 参数解释: title 标题 url 请求的url id 需要操作的数据id w 弹出层宽度(缺省调默认值) h 弹出层高度(缺省调默认值) */ function x_all_show(title,url,w,h){ if (title == null || title == '') { title=false; }; if (url == null || url == '') { url="404.html"; }; if (w == null || w == '') { w=($(window).width()*0.9); }; if (h == null || h == '') { h=($(window).height() - 50); }; //window.location.href=url;return false; layer.open({ type: 2, area: [w+'px', h +'px'], fix: false, //不固定 maxmin: true, shadeClose: false, shade:0.4, title: title, content: url }); } /*关闭弹出框口*/ function x_admin_close(){ var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); } /** * 注册tab右键菜单点击事件 */ // 点击空白处关闭右键弹窗 $(document).click(function () { $('.rightmenu').hide(); }) /** * 绑定右键菜单 * @constructor */ function CustomRightClick () { //屏蔽右键 $('.layui-tab-title li').on('contextmenu', function () { return false; }) $('.layui-tab-title,.layui-tab-title li').click(function () { $('.rightmenu').hide(); }); $('.layui-tab-title li').on('contextmenu', function (e) { var popupmenu = $(".rightmenu"); l = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX; t = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY; popupmenu.css({left: l, top: t}).show(); return false; }); } ================================================ FILE: app/admin/t/tpl/style/js/xm-select.js ================================================ /*! * @Title: xm-select * @Version: 1.2.4 * @Description:基于layui的多选解决方案 * @Site: https://gitee.com/maplemei/xm-select * @Author: maplemei * @License:Apache License 2.0 */!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="./",n(n.s=214)}({1:function(e,t,n){"use strict";function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:100,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=this,r=!1;return function(){for(var i=arguments.length,a=new Array(i),l=0;l>>0;for(t&&(n=t),o=new Array(a),r=0;r>>0;if("function"!=typeof e)throw new TypeError(e+" is not a function");for(arguments.length>1&&(n=t),o=0;o>>0;if("function"!=typeof e)throw new TypeError;for(var o=[],r=arguments[1],i=0;i>>0,r=arguments[1],i=0;i .xm-tips {\n color: #999999;\n padding: 0 10px;\n position: absolute;\n display: flex;\n height: 100%;\n align-items: center;\n}\nxm-select > .xm-icon {\n display: inline-block;\n overflow: hidden;\n position: absolute;\n width: 0;\n height: 0;\n right: 10px;\n top: 50%;\n margin-top: -3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-top-color: #C2C2C2;\n border-top-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n}\nxm-select > .xm-icon-expand {\n margin-top: -9px;\n transform: rotate(180deg);\n}\nxm-select > .xm-label.single-row {\n position: absolute;\n top: 0;\n bottom: 0px;\n left: 0px;\n right: 30px;\n overflow: auto hidden;\n}\nxm-select > .xm-label.single-row .scroll {\n overflow-y: hidden;\n}\nxm-select > .xm-label.single-row .label-content {\n flex-wrap: nowrap;\n white-space: nowrap;\n}\nxm-select > .xm-label.auto-row .label-content {\n flex-wrap: wrap;\n padding-right: 30px !important;\n}\nxm-select > .xm-label.auto-row .xm-label-block > span {\n white-space: unset;\n height: 100%;\n}\nxm-select > .xm-label .scroll .label-content {\n display: flex;\n padding: 3px 10px;\n}\nxm-select > .xm-label .xm-label-block {\n display: flex;\n position: relative;\n padding: 0px 5px;\n margin: 2px 5px 2px 0;\n border-radius: 3px;\n align-items: baseline;\n color: #FFF;\n}\nxm-select > .xm-label .xm-label-block > span {\n display: flex;\n color: #FFF;\n white-space: nowrap;\n}\nxm-select > .xm-label .xm-label-block > i {\n color: #FFF;\n margin-left: 8px;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n}\nxm-select > .xm-label .xm-label-block.disabled {\n background-color: #C2C2C2 !important;\n cursor: no-drop !important;\n}\nxm-select > .xm-label .xm-label-block.disabled > i {\n cursor: no-drop !important;\n}\nxm-select > .xm-body {\n position: absolute;\n left: 0;\n top: 42px;\n padding: 5px 0;\n z-index: 999;\n width: 100%;\n min-width: fit-content;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n animation-name: xm-upbit;\n animation-duration: 0.3s;\n animation-fill-mode: both;\n}\nxm-select > .xm-body .scroll-body {\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar {\n width: 8px;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-track {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #FFF;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-thumb {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #C2C2C2;\n}\nxm-select > .xm-body.up {\n top: auto;\n bottom: 42px;\n}\nxm-select > .xm-body.relative {\n position: relative;\n display: block !important;\n top: 0;\n box-shadow: none;\n border: none;\n animation-name: none;\n animation-duration: 0;\n min-width: 100%;\n}\nxm-select > .xm-body .xm-group {\n cursor: default;\n}\nxm-select > .xm-body .xm-group-item {\n display: inline-block;\n cursor: pointer;\n padding: 0 10px;\n color: #999;\n font-size: 12px;\n}\nxm-select > .xm-body .xm-option {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 10px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-option-icon {\n color: transparent;\n display: flex;\n border: 1px solid #E6E6E6;\n border-radius: 3px;\n justify-content: center;\n align-items: center;\n}\nxm-select > .xm-body .xm-option-icon.xm-custom-icon {\n color: unset;\n border: unset;\n}\nxm-select > .xm-body .xm-option-icon-hidden {\n margin-right: -10px;\n}\nxm-select > .xm-body .xm-option-icon.xm-icon-danx {\n border-radius: 100%;\n}\nxm-select > .xm-body .xm-option-content {\n display: flex;\n position: relative;\n padding-left: 15px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #666;\n width: calc(100% - 20px);\n}\nxm-select > .xm-body .xm-option.hide-icon .xm-option-content {\n padding-left: 0;\n}\nxm-select > .xm-body .xm-option.selected.hide-icon .xm-option-content {\n color: #FFF !important;\n}\nxm-select > .xm-body .xm-option .loader {\n width: 0.8em;\n height: 0.8em;\n margin-right: 6px;\n color: #C2C2C2;\n}\nxm-select > .xm-body .xm-select-empty {\n text-align: center;\n color: #999;\n}\nxm-select > .xm-body .disabled {\n cursor: no-drop;\n}\nxm-select > .xm-body .disabled:hover {\n background-color: #FFF;\n}\nxm-select > .xm-body .disabled .xm-option-icon {\n border-color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled .xm-option-content {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled.selected > .xm-option-icon {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .xm-search {\n background-color: #FFF !important;\n position: relative;\n padding: 0 10px;\n margin-bottom: 5px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-search > i {\n position: absolute;\n color: #666;\n}\nxm-select > .xm-body .xm-search-input {\n border: none;\n border-bottom: 1px solid #E6E6E6;\n padding-left: 27px;\n cursor: text;\n}\nxm-select > .xm-body .xm-paging {\n padding: 0 10px;\n display: flex;\n margin-top: 5px;\n}\nxm-select > .xm-body .xm-paging > span:first-child {\n border-radius: 2px 0 0 2px;\n}\nxm-select > .xm-body .xm-paging > span:last-child {\n border-radius: 0 2px 2px 0;\n}\nxm-select > .xm-body .xm-paging > span {\n display: flex;\n flex: auto;\n justify-content: center;\n vertical-align: middle;\n margin: 0 -1px 0 0;\n background-color: #fff;\n color: #333;\n font-size: 12px;\n border: 1px solid #e2e2e2;\n flex-wrap: nowrap;\n width: 100%;\n overflow: hidden;\n min-width: 50px;\n}\nxm-select > .xm-body .xm-toolbar {\n padding: 0 10px;\n display: flex;\n margin: -3px 0;\n cursor: default;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag {\n cursor: pointer;\n display: flex;\n margin-right: 20px;\n color: #666;\n align-items: baseline;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:hover {\n opacity: 0.8;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:active {\n opacity: 1;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag > i {\n margin-right: 2px;\n font-size: 14px;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:last-child {\n margin-right: 0;\n}\nxm-select > .xm-body .xm-body-custom {\n line-height: initial;\n cursor: default;\n}\nxm-select > .xm-body .xm-body-custom * {\n box-sizing: initial;\n}\nxm-select > .xm-body .xm-tree {\n position: relative;\n}\nxm-select > .xm-body .xm-tree-icon {\n display: inline-block;\n margin-right: 3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-left-color: #C2C2C2;\n border-left-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n z-index: 2;\n visibility: hidden;\n}\nxm-select > .xm-body .xm-tree-icon.expand {\n margin-top: 3px;\n margin-right: 5px;\n margin-left: -2px;\n transform: rotate(90deg);\n}\nxm-select > .xm-body .xm-tree-icon.xm-visible {\n visibility: visible;\n}\nxm-select > .xm-body .xm-tree .left-line {\n position: absolute;\n left: 13px;\n width: 0;\n z-index: 1;\n border-left: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .top-line {\n position: absolute;\n left: 13px;\n height: 0;\n z-index: 1;\n border-top: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .xm-tree-icon + .top-line {\n margin-left: 1px;\n}\nxm-select > .xm-body .scroll-body > .xm-tree > .xm-option > .top-line,\nxm-select > .xm-body .scroll-body > .xm-option > .top-line {\n width: 0 !important;\n}\nxm-select > .xm-body .xm-cascader-box {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n padding: 5px 0;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n margin: -1px;\n}\nxm-select > .xm-body .xm-cascader-box::before {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #E6E6E6;\n top: 10px;\n left: -12px;\n}\nxm-select > .xm-body .xm-cascader-box::after {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #fff;\n top: 10px;\n left: -11px;\n}\nxm-select > .xm-body .xm-cascader-scroll {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body.cascader {\n width: unset;\n min-width: unset;\n}\nxm-select > .xm-body.cascader .xm-option-content {\n padding-left: 8px;\n}\nxm-select > .xm-body.cascader .disabled .xm-right-arrow {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body.cascader .hide-icon.disabled .xm-right-arrow {\n color: #999 !important;\n}\nxm-select .xm-input {\n cursor: pointer;\n border-radius: 2px;\n border-width: 1px;\n border-style: solid;\n border-color: #E6E6E6;\n display: block;\n width: 100%;\n box-sizing: border-box;\n background-color: #FFF;\n line-height: 1.3;\n padding-left: 10px;\n outline: 0;\n user-select: text;\n -ms-user-select: text;\n -moz-user-select: text;\n -webkit-user-select: text;\n}\nxm-select .dis {\n display: none;\n}\nxm-select .loading {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n}\nxm-select .loader {\n border: 0.2em dotted currentcolor;\n border-radius: 50%;\n -webkit-animation: 1s loader linear infinite;\n animation: 1s loader linear infinite;\n display: inline-block;\n width: 1em;\n height: 1em;\n color: inherit;\n vertical-align: middle;\n pointer-events: none;\n}\nxm-select .xm-select-default {\n position: absolute;\n width: 100%;\n height: 100%;\n border: none;\n visibility: hidden;\n}\nxm-select .xm-select-disabled {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n cursor: no-drop;\n z-index: 2;\n opacity: 0.3;\n background-color: #FFF;\n}\nxm-select .item--divided {\n border-top: 1px solid #ebeef5;\n width: calc(100% - 20px);\n cursor: initial;\n}\nxm-select .xm-right-arrow {\n position: absolute;\n color: #666;\n right: 5px;\n top: -1px;\n font-weight: 700;\n transform: scale(0.6, 1);\n}\nxm-select .xm-right-arrow::after {\n content: '>';\n}\nxm-select[size='large'] {\n min-height: 40px;\n line-height: 40px;\n}\nxm-select[size='large'] .xm-input {\n height: 40px;\n}\nxm-select[size='large'] .xm-label .scroll .label-content {\n line-height: 34px;\n}\nxm-select[size='large'] .xm-label .xm-label-block {\n height: 30px;\n line-height: 30px;\n}\nxm-select[size='large'] .xm-body .xm-option .xm-option-icon {\n height: 20px;\n width: 20px;\n font-size: 20px;\n}\nxm-select[size='large'] .xm-paging > span {\n height: 34px;\n line-height: 34px;\n}\nxm-select[size='large'] .xm-tree .left-line {\n height: 100%;\n bottom: 20px;\n}\nxm-select[size='large'] .xm-tree .left-line-group {\n height: calc(100% - 40px);\n}\nxm-select[size='large'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 19px;\n}\nxm-select[size='large'] .item--divided {\n margin: 10px;\n}\nxm-select {\n min-height: 36px;\n line-height: 36px;\n}\nxm-select .xm-input {\n height: 36px;\n}\nxm-select .xm-label .scroll .label-content {\n line-height: 30px;\n}\nxm-select .xm-label .xm-label-block {\n height: 26px;\n line-height: 26px;\n}\nxm-select .xm-body .xm-option .xm-option-icon {\n height: 18px;\n width: 18px;\n font-size: 18px;\n}\nxm-select .xm-paging > span {\n height: 30px;\n line-height: 30px;\n}\nxm-select .xm-tree .left-line {\n height: 100%;\n bottom: 18px;\n}\nxm-select .xm-tree .left-line-group {\n height: calc(100% - 36px);\n}\nxm-select .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 17px;\n}\nxm-select .item--divided {\n margin: 9px;\n}\nxm-select[size='small'] {\n min-height: 32px;\n line-height: 32px;\n}\nxm-select[size='small'] .xm-input {\n height: 32px;\n}\nxm-select[size='small'] .xm-label .scroll .label-content {\n line-height: 26px;\n}\nxm-select[size='small'] .xm-label .xm-label-block {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='small'] .xm-body .xm-option .xm-option-icon {\n height: 16px;\n width: 16px;\n font-size: 16px;\n}\nxm-select[size='small'] .xm-paging > span {\n height: 26px;\n line-height: 26px;\n}\nxm-select[size='small'] .xm-tree .left-line {\n height: 100%;\n bottom: 16px;\n}\nxm-select[size='small'] .xm-tree .left-line-group {\n height: calc(100% - 32px);\n}\nxm-select[size='small'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 15px;\n}\nxm-select[size='small'] .item--divided {\n margin: 8px;\n}\nxm-select[size='mini'] {\n min-height: 28px;\n line-height: 28px;\n}\nxm-select[size='mini'] .xm-input {\n height: 28px;\n}\nxm-select[size='mini'] .xm-label .scroll .label-content {\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-label .xm-label-block {\n height: 18px;\n line-height: 18px;\n}\nxm-select[size='mini'] .xm-body .xm-option .xm-option-icon {\n height: 14px;\n width: 14px;\n font-size: 14px;\n}\nxm-select[size='mini'] .xm-paging > span {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-tree .left-line {\n height: 100%;\n bottom: 14px;\n}\nxm-select[size='mini'] .xm-tree .left-line-group {\n height: calc(100% - 28px);\n}\nxm-select[size='mini'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 13px;\n}\nxm-select[size='mini'] .item--divided {\n margin: 7px;\n}\n.layui-form-pane xm-select {\n margin: -1px -1px -1px 0;\n}\n",""]),e.exports=t},221:function(e,t){(function(t){e.exports=t}).call(this,{})},27:function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",o=e[3];if(!o)return n;if(t&&"function"==typeof btoa){var r=function(e){var t=btoa(unescape(encodeURIComponent(JSON.stringify(e)))),n="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(t);return"/*# ".concat(n," */")}(o),i=o.sources.map((function(e){return"/*# sourceURL=".concat(o.sourceRoot||"").concat(e," */")}));return[n].concat(i).concat([r]).join("\n")}return[n].join("\n")}(t,e);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,o){"string"==typeof e&&(e=[[null,e,""]]);var r={};if(o)for(var i=0;i=0&&p.splice(t,1)}function y(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var o=function(){0;return n.nc}();o&&(e.attrs.nonce=o)}return x(t,e.attrs),m(e,t),t}function x(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function v(e,t){var n,o,r,i;if(t.transform&&e.css){if(!(i="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var a=u++;n=c||(c=y(t)),o=w.bind(null,n,a,!1),r=w.bind(null,n,a,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",x(t,e.attrs),m(e,t),t}(t),o=O.bind(null,n,t),r=function(){b(n),n.href&&URL.revokeObjectURL(n.href)}):(n=y(t),o=k.bind(null,n),r=function(){b(n)});return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=a()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=h(e,t);return d(n,t),function(e){for(var o=[],r=0;r3)for(n=[n],o=3;o1&&E(r,t,n),t=O(n,r,r,e.__k,null,r.__e,t),"function"==typeof e.type&&(e.__d=t)))}function A(e,t,n,r,i,a,l,s,c){var u,p,f,h,m,b,v,g,_,w,O,C=t.type;if(void 0!==t.constructor)return null;(u=o.__b)&&u(t);try{e:if("function"==typeof C){if(g=t.props,_=(u=C.contextType)&&r[u.__c],w=u?_?_.props.value:u.__:r,n.__c?v=(p=t.__c=n.__c).__=p.__E:("prototype"in C&&C.prototype.render?t.__c=p=new C(g,w):(t.__c=p=new x(g,w),p.constructor=C,p.render=M),_&&_.sub(p),p.props=g,p.state||(p.state={}),p.context=w,p.__n=r,f=p.__d=!0,p.__h=[]),null==p.__s&&(p.__s=p.state),null!=C.getDerivedStateFromProps&&(p.__s==p.state&&(p.__s=d({},p.__s)),d(p.__s,C.getDerivedStateFromProps(g,p.__s))),h=p.props,m=p.state,f)null==C.getDerivedStateFromProps&&null!=p.componentWillMount&&p.componentWillMount(),null!=p.componentDidMount&&p.__h.push(p.componentDidMount);else{if(null==C.getDerivedStateFromProps&&g!==h&&null!=p.componentWillReceiveProps&&p.componentWillReceiveProps(g,w),!p.__e&&null!=p.shouldComponentUpdate&&!1===p.shouldComponentUpdate(g,p.__s,w)||t.__v===n.__v){p.props=g,p.state=p.__s,t.__v!==n.__v&&(p.__d=!1),p.__v=t,t.__e=n.__e,t.__k=n.__k,p.__h.length&&l.push(p),E(t,s,e);break e}null!=p.componentWillUpdate&&p.componentWillUpdate(g,p.__s,w),null!=p.componentDidUpdate&&p.__h.push((function(){p.componentDidUpdate(h,m,b)}))}p.context=w,p.props=g,p.state=p.__s,(u=o.__r)&&u(t),p.__d=!1,p.__v=t,p.__P=e,u=p.render(p.props,p.state,p.context),p.state=p.__s,null!=p.getChildContext&&(r=d(d({},r),p.getChildContext())),f||null==p.getSnapshotBeforeUpdate||(b=p.getSnapshotBeforeUpdate(h,m)),O=null!=u&&u.type==y&&null==u.key?u.props.children:u,k(e,Array.isArray(O)?O:[O],t,n,r,i,a,l,s,c),p.base=t.__e,p.__h.length&&l.push(p),v&&(p.__E=p.__=null),p.__e=!1}else null==a&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=P(n.__e,t,n,r,i,a,l,c);(u=o.diffed)&&u(t)}catch(e){t.__v=null,o.__e(e,t,n)}return t.__e}function R(e,t){o.__c&&o.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){o.__e(e,t.__v)}}))}function P(e,t,n,o,r,i,a,l){var s,c,f,d,h,m=n.props,b=t.props;if(r="svg"===t.type||r,null!=i)for(s=0;se.length)&&(t=e.length);for(var n=0,o=new Array(t);nr?n-r:r,a=this.labelRef.scrollLeft+e.deltaY;a<0&&(a=0),a>i&&(a=i),this.labelRef.scrollLeft=a}}},{key:"blur",value:function(){var e=this.base.querySelector(".label-search-input");e&&e.blur()}},{key:"labelDrag",value:function(e,t){for(var n=t.type,o=t.target;;){if(!o||"I"===o.tagName)return;if("DIV"===o.tagName&&"fixed"!==o.style.position)break;o=o.parentNode}if(console.log(t),"mousedown"===n){var r=o.cloneNode(!0),i=t.pageX,a=t.pageY,l=t.offsetX,s=t.offsetY;console.log(i,a,l,s),r.style.position="fixed",r.style.left=i-l+"px",r.style.top=a-s+"px",o.appendChild(r),console.log(r),r.onmousemove=function(e){r.style.left=e.pageX-l+"px",r.style.top=e.pageY-s+"px"},r.mouseup=function(){r.parentNode.removeChild(r),r.onmousemove=null,r.mouseup=null,r.mouseleave=null},r.mouseleave=function(){console.log("mouseleave")}}else if("mouseup"===n)for(var c=o.childNodes,u=0;ue.length)&&(t=e.length);for(var n=0,o=new Array(t);n0&&void 0!==arguments[0]||this.size;var e=this.state.pageIndex;e<=1||(this.changePageIndex(e-1),this.props.pageRemote&&this.postData(e-1,!0))}},{key:"pageNextClick",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.size,t=this.state.pageIndex;t>=e||(this.changePageIndex(t+1),this.props.pageRemote&&this.postData(t+1,!0))}},{key:"changePageIndex",value:function(e){this.setState({pageIndex:e})}},{key:"labelSearch",value:function(e){"input"==e.type?this.searchInput(e):this.handleComposition(e)}},{key:"searchInput",value:function(e){var t=this,n=e.target.value;n!==this.__value&&(this.searchCid&&clearTimeout(this.searchCid),this.inputOver&&(this.__value=n,this.searchCid=setTimeout((function(){t.callback=!0,t.setState({filterValue:t.__value,remote:!0,pageIndex:1})}),this.props.delay)))}},{key:"focus",value:function(){this.searchInputRef&&this.searchInputRef.focus()}},{key:"blur",value:function(){this.searchInputRef&&this.searchInputRef.blur()}},{key:"handleComposition",value:function(e){var t=e.type;"compositionstart"===t?(this.inputOver=!1,this.searchCid&&clearTimeout(this.searchCid)):"compositionend"===t&&(this.inputOver=!0,this.searchInput(e))}},{key:"postData",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.pageIndex,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(this.state.remote||n)&&(this.callback=!1,this.setState({loading:!0,remote:!1}),this.blur(),this.props.remoteMethod(this.state.filterValue,(function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;setTimeout((function(){e.focus(),e.callback=!0,e.setState({loading:!1,totalSize:n}),e.props.onReset(t,"data")}),10)}),this.props.show,t))}},{key:"keydown",value:function(e,t){var n=this,o=t.keyCode;if("div"===e&&(27===o||9===o?this.props.onReset(!1,"close"):37===o?this.pagePrevClick():39===o&&this.pageNextClick()),this.props.enableKeyboard){var r=this.props.prop,i=r.value,a=r.optgroup,l=r.disabled,s=this.tempData.filter((function(e){return!e[a]&&!e[l]})),c=s.length-1;if(-1===c)return;var u=s.findIndex((function(e){return e[i]===n.state.val}));if(38===o){u<=0?u=c:u>0&&(u-=1);var p=s[u][i];this.setState({val:p}),this.viewTo(p)}else if(40===o){-1===u||u===c?u=0:uM&&(T=M),M>0&&T<=0&&(T=1),!x){var z=(T-1)*e.pageSize,L=z+e.pageSize;S=S.slice(z,L)}var V={cursor:"no-drop",color:"#d2d2d2"},F={},U={};T<=1&&(F=V),T==M&&(U=V),this.state.pageIndex!==T&&this.changePageIndex(T),this.size=M,D=m("div",{class:"xm-paging"},m("span",{style:F,onClick:this.pagePrevClick.bind(this,M)},e.languageProp.paging.prev),m("span",null,this.state.pageIndex," / ",M),m("span",{style:U,onClick:this.pageNextClick.bind(this,M)},e.languageProp.paging.next))}else e.showCount>0&&(S=S.slice(0,e.showCount));var N,B,K=[],H={__tmp:!0};H[j]=!0,S.forEach((function(e){var t=I[e.__group__index];delete e.__group__index,N&&!t&&(t=H),t!=N&&(N=t,t&&K.push(N)),K.push(e)})),S=K,t&&null!=(t=y(this.state.filterValue,Object(c.b)([],S)))&&(B=S).splice.apply(B,[0,0].concat(J((Object(c.d)(t)?t:[t]).map((function(e){return Z(Z({},e),{},{__node:{}})})))));var q=Object(c.b)([],S);this.tempData=q;var Y=m("div",{class:"xm-toolbar"},e.toolbar.list.map((function(t){var o,r=e.languageProp.toolbar[t];o="ALL"===t?{icon:"xm-iconfont xm-icon-quanxuan",name:r,method:function(e){var t=i.optgroup,o=i.disabled,r=e.filter((function(e){return!e[t]})).filter((function(e){return!e[o]})),a=u.filter((function(e){return e[i.disabled]})),l=[];l=s?a.length?a:r.slice(0,1):v>0?a.length>=v?a:Object(c.f)(r.slice(0,v-a.length),a,i):Object(c.f)(r,u,i),n.props.onReset(l,"sels")}}:"CLEAR"===t?{icon:"xm-iconfont xm-icon-qingkong",name:r,method:function(e){n.props.onReset(u.filter((function(e){return e[i.disabled]})),"sels")}}:"REVERSE"===t?{icon:"xm-iconfont xm-icon-fanxuan",name:r,method:function(e){var t=i.optgroup,o=i.disabled,r=e.filter((function(e){return!e[t]})).filter((function(e){return!e[o]})),a=[];u.forEach((function(e){var t=r.findIndex((function(t){return t[k]===e[k]}));-1==t?a.push(e):r.splice(t,1)}));var l=a.filter((function(e){return e[i.disabled]})),p=[];p=s?l.length?l:r.slice(0,1):v>0?l.length>=v?l:Object(c.f)(r.slice(0,v-l.length),l,i):Object(c.f)(r,a,i),n.props.onReset(p,"sels")}}:t;var a=function(e){"mouseenter"===e.type&&(e.target.style.color=l.color),"mouseleave"===e.type&&(e.target.style.color="")};return m("div",{class:"toolbar-tag",style:{},onClick:function(){Object(c.e)(o.method)&&o.method(q),n.focus()},onMouseEnter:a,onMouseLeave:a},e.toolbar.showIcon&&m("i",{class:o.icon}),m("span",null,o.name))})).filter((function(e){return e}))),Q="hidden"!=e.model.icon;return(S=S.map((function(t){return t[j]?t.__tmp?m("div",{class:"item--divided"}):m("div",{class:"xm-group"},m("div",{class:"xm-group-item",onClick:n.groupClick.bind(n,t)},t[w])):function(t){var r=!!u.find((function(e){return e[k]==t[k]})),i=r?{color:l.color,border:"none"}:{borderColor:l.color},c={};g&&t[k]===n.state.val&&(c.backgroundColor=l.hover),!Q&&r&&(c.backgroundColor=l.color,t[O]&&(c.backgroundColor="#C2C2C2"));var p,f,d=["xm-option",t[O]?" disabled":"",r?" selected":"",Q?"show-icon":"hide-icon"].join(" "),h=["xm-option-icon",(p=e.iconfont.select,f=e.iconfont.unselect,(p?!r&&f?f+" xm-custom-icon":p:0)||"xm-iconfont "+(s?"xm-icon-danx":"xm-icon-duox"))].join(" "),b=function(e){"mouseenter"===e.type?t[O]||(g?n.setState({val:t[k]}):e.target.style.backgroundColor=l.hover):"mouseleave"===e.type&&(t[O]||g||(e.target.style.backgroundColor=""))};return m("div",{class:d,style:c,value:t[k],onClick:n.optionClick.bind(n,t,r,t[O]),onMouseEnter:b,onMouseLeave:b},Q&&m("i",{class:h,style:i}),m("div",{class:"xm-option-content",dangerouslySetInnerHTML:{__html:a({data:o,item:t,arr:u,name:t[w],value:t[k]})}}))}(t)}))).length?_&&this.state.val==ne&&this.keydown("div",{keyCode:40}):(!e.pageEmptyShow&&(D=""),S.push(m("div",{class:"xm-select-empty"},p))),m("div",{onClick:this.blockClick,tabindex:"1",style:"outline: none;"},m("div",null,e.toolbar.show&&Y,P,m("div",{class:"scroll-body",style:{maxHeight:e.height}},S),e.paging&&D),this.state.loading&&m("div",{class:"loading"},m("span",{class:"loader"})))}},{key:"componentDidMount",value:function(){var e=this.base.querySelector(".xm-search-input");e&&(e.addEventListener("compositionstart",this.handleComposition.bind(this)),e.addEventListener("compositionupdate",this.handleComposition.bind(this)),e.addEventListener("compositionend",this.handleComposition.bind(this)),e.addEventListener("input",this.searchInput.bind(this)),this.searchInputRef=e),this.base.addEventListener("keydown",this.keydown.bind(this,"div"))}},{key:"componentDidUpdate",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;Object(c.e)(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&G(t.prototype,n),o&&G(t,o),i}(x);function re(e){return(re="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ie(e,t){for(var n=0;n0||p.lazy&&!1!==e.__node.loading)?"xm-visible":"xm-hidden"].join(" "),j=[];p.showFolderIcon&&(j.push(m("i",{class:C,type:"expand"})),p.showLine&&(o&&j.push(m("i",{class:"left-line",style:{left:t-p.indent+3+"px"}})),j.push(m("i",{class:"top-line",style:{left:t-p.indent+3+"px",width:p.indent+(0===o?10:-2)+"px"}}))));var S=function(t){"mouseenter"===t.type?e[g]||(y?n.setState({val:e[v]}):t.target.style.backgroundColor=a.hover):"mouseleave"===t.type&&(e[g]||y||(t.target.style.backgroundColor=""))};return m("div",{class:w,style:h,value:e[v],onClick:n.optionClick.bind(n,e,r,e[g],"line"),onMouseEnter:S,onMouseLeave:S},j,e.__node.loading&&m("span",{class:"loader"}),k&&m("i",{class:O,style:d,onClick:n.optionClick.bind(n,e,r,e[g],"checkbox")}),m("div",{class:"xm-option-content",dangerouslySetInnerHTML:{__html:s({data:u,item:e,arr:i,name:e[x],value:e[v]})}}))};f&&(d?this.postData():this.filterData(u,this.state.filterValue));var C=Object(c.b)([],u),j=Object(c.b)([],i);this.tempData=C;var S=u.map((function(e){return function e(t,o){if(!t.__node.hidn){var r=t[_];if(o+=p.indent,r){var i=-1!==n.state.expandedKeys.findIndex((function(e){return t[v]===e}));return 0===r.length&&(i=!1),m("div",{class:"xm-tree"},p.showFolderIcon&&p.showLine&&i&&r.length>0&&m("i",{class:"left-line left-line-group",style:{left:o+3+"px"}}),O(t,o,0===r.length&&(!p.lazy||p.lazy&&!1===t.__node.loading)?0:i),i&&m("div",{class:"xm-tree-box"},r.map((function(t){return e(t,o)}))))}return O(t,o,0)}}(e,10-p.indent)})).filter((function(e){return e}));function E(e,t){t.forEach((function(t){t[w]?(p.strict||"hidden"===b.parent||e.push(t),E(e,t[_])):e.push(t)}))}var A=m("div",{class:"xm-toolbar"},e.toolbar.list.map((function(t){var r,s=e.languageProp.toolbar[t];r="ALL"===t?{icon:"xm-iconfont xm-icon-quanxuan",name:s,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[g]&&!e.__node.hidn})),n.props.onReset(l?t.slice(0,1):Object(c.f)(t,i,o),"treeData")}}:"CLEAR"===t?{icon:"xm-iconfont xm-icon-qingkong",name:s,method:function(e){n.props.onReset(i.filter((function(e){return e[o.disabled]})),"treeData")}}:"REVERSE"===t?{icon:"xm-iconfont xm-icon-fanxuan",name:s,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[g]&&!e.__node.hidn}));var r=[];i.forEach((function(e){var n=t.findIndex((function(t){return t[v]===e[v]}));-1==n?r.push(e):t.splice(n,1)})),n.props.onReset(l?r.slice(0,1):Object(c.f)(t,r,o),"treeData")}}:t;var u=function(e){"mouseenter"===e.type&&(e.target.style.color=a.color),"mouseleave"===e.type&&(e.target.style.color="")};return m("div",{class:"toolbar-tag",onClick:function(){Object(c.e)(r.method)&&r.method(C,j)},onMouseEnter:u,onMouseLeave:u},e.toolbar.showIcon&&m("i",{class:r.icon}),m("span",null,r.name))})).filter((function(e){return e}))),R=m("div",{class:f?"xm-search":"xm-search dis"},m("i",{class:"xm-iconfont xm-icon-sousuo"}),m("input",{class:"xm-input xm-search-input",placeholder:h}));return S.length||S.push(m("div",{class:"xm-select-empty"},r)),m("div",{onClick:this.blockClick,class:"xm-body-tree"},e.toolbar.show&&A,R,m("div",{class:"scroll-body",style:{maxHeight:e.height}},S),this.state.loading&&m("div",{class:"loading"},m("span",{class:"loader"})))}},{key:"componentDidMount",value:function(){var e=this.base.querySelector(".xm-search-input");e&&(e.addEventListener("compositionstart",this.handleComposition.bind(this)),e.addEventListener("compositionupdate",this.handleComposition.bind(this)),e.addEventListener("compositionend",this.handleComposition.bind(this)),e.addEventListener("input",this.searchInput.bind(this)),this.searchInputRef=e)}},{key:"componentDidUpdate",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;Object(c.e)(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&fe(t.prototype,n),o&&fe(t,o),i}(x);function ve(e){return(ve="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ge(e,t){for(var n=0;n0,O={backgroundColor:"transparent"},C=["xm-option",g?" disabled":"",v?" selected":"",y?"show-icon":"hide-icon"].join(" "),j=k&&"hidden"===e.iconfont.parent?"xm-option-icon-hidden":["xm-option-icon",(_?e.iconfont.half?e.iconfont.half+" xm-custom-icon":0:k&&e.iconfont.parent?e.iconfont.parent+" xm-custom-icon":v?e.iconfont.select?e.iconfont.select:0:e.iconfont.unselect?e.iconfont.unselect+" xm-custom-icon":0)||"xm-iconfont "+(l?"xm-icon-danx":u.strict&&_?"xm-icon-banxuan":"xm-icon-duox")].join(" ");t[f]===n.state.val&&(O.backgroundColor=a.hover),!y&&v&&(O.backgroundColor=a.color,g&&(O.backgroundColor="#C2C2C2"));var S={},E={};x&&(S.color=a.color,S.fontWeight=700,E.color=a.color);var A=function(e){"mouseenter"===e.type?t[d]||n.setState({val:t[f]}):"mouseleave"===e.type&&n.setState({val:""})};return m("div",{class:C,style:O,value:t[f],onClick:n.optionClick.bind(n,t,v,g,"line",r),onMouseEnter:A,onMouseLeave:A},y&&m("i",{class:j,style:w,onClick:n.optionClick.bind(n,t,v,g,"checkbox",r)}),m("div",{class:"xm-option-content",style:S,dangerouslySetInnerHTML:{__html:s({data:c,item:t,arr:i,name:t[p],value:t[f]})}}),t[b]&&m("div",{class:"xm-right-arrow",style:E}))}(o,0,v,_)},g=c.map((function(e){return v(e,2,0)})).concat(x).filter((function(e){return e}));return g.length||g.push(m("div",{class:"xm-select-empty"},r)),m("div",{onClick:this.blockClick,class:"xm-body-cascader scroll-body",style:{width:u.indent+"px",maxHeight:e.height}},g)}},{key:"componentDidMount",value:function(){this.props.onReset("cascader","class")}}])&&ge(t.prototype,n),o&&ge(t,o),i}(x);function je(){return(je=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,o=new Array(t);n1&&(n=n.slice(0,1),(l.show&&l.strict||s.show&&s.strict)&&this.clearAndReset(o,n,!1)),this.setState({sels:n,dataObj:c,flatData:u})}return this.setState({data:o}),n}},{key:"upDate",value:function(e,t){var n=this.state.dataObj,o=this.props,r=o.prop,i=o.tree,a=o.cascader,l=r.value,s=r.disabled,u=r.children;e.map((function(e){return n["object"===Ie(e)?e[l]:e]})).filter((function(e){return e})).forEach((function(e){if(e[s]=!t,i.show&&i.strict||a.show&&a.strict){if(t)for(var n=e;n;)n[s]=!1,n=n.__node.parent;!function e(n){n[s]=!t;var o=n[u];o&&Object(c.d)(o)&&o.forEach((function(t){return e(t)}))}(e)}})),this.setState({dataObj:n})}},{key:"exchangeValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.state.dataObj,o=this.props,r=o.prop,i=o.tree,a=o.cascader,l=(o.data,r.children),s=r.value,u=e.map((function(e){return"object"===Ie(e)?Re(Re({},e),{},{__node:{}}):n[e]})).filter((function(e){return e})),p=Se(u);if(i.show&&i.strict||a.show&&a.strict){var f=function e(t,n){var o=n[l];o&&Object(c.d)(o)&&o.forEach((function(n){-1===u.findIndex((function(e){return e[s]===n[s]}))&&t.push(n),e(t,n)}))},d={};d[l]=u,f(p,d),p=p.filter((function(e){return!0!==e[t.props.prop.optgroup]}))}return p}},{key:"value",value:function(e,t,n,o){var r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];!1!==t&&!0!==t&&(t=this.state.show);var i=this.props,a=i.prop,l=i.tree,s=i.cascader,c=this.exchangeValue(e);if(!this.checkMax(c,c,!0)){if(l.show&&l.strict||s.show&&s.strict){var u=this.state.data;this.clearAndReset(u,c,!1),c=this.init({data:u,prop:a},!0)}this.resetSelectValue(c,o||c,r,n),this.setState({show:t})}}},{key:"clearAndReset",value:function(e,t,n){var o=this,r=this.props.prop,i=r.selected,a=r.disabled,l=r.children,s=r.value;e.forEach((function(e){e[i]=-1!=t.findIndex((function(t){return t[s]===e[s]}))||n;var r=e[l];if(r&&Object(c.d)(r)&&r.length>0){o.clearAndReset(r,t,e[i]);var u=r.length,p=r.filter((function(e){return!0===e[i]||!0===e.__node.selected})).length;e.__node.selected=p===u,e.__node.half=p>0&&p0,e.__node.disabled=r.filter((function(e){return!0===e[a]||!0===e.__node.disabled})).length===u}}))}},{key:"load",value:function(e,t,n,o){var r=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,a=arguments.length>5?arguments[5]:void 0,l=this.props,s=l.prop,u=l.tree,p=l.cascader,f=s.children,d=s.optgroup,h=s.value,m=s.selected,b=s.disabled;e.forEach((function(e){e.__node={parent:o,level:i,loading:e.__node&&e.__node.loading},a&&(delete e[m],a.find((function(t){return t===e[h]}))&&(e[m]=!0)),t[e[h]]=e,n.push(e);var l=e[f];if(l&&Object(c.d)(l)){var s=l.length;if(s>0){r.load(l,t,n,e,i+1,a),e[d]=!0,(u.show&&u.strict||p.show&&p.strict)&&(!0===e[m]&&(delete e[m],l.forEach((function(e){return e[m]=!0}))),!0===e[b]&&(delete e[b],l.forEach((function(e){return e[b]=!0}))));var y=l.filter((function(e){return!0===e[m]||!0===e.__node.selected})).length;e.__node.selected=y===s,e.__node.half=y>0&&y0,e.__node.disabled=l.filter((function(e){return!0===e[b]||!0===e.__node.disabled})).length===s}}}))}},{key:"resetSelectValue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=this.props.on;if(Object(c.e)(r)&&this.prepare&&o){var i=r({arr:e,change:t,isAdd:n});if(Object(c.d)(i))return this.value(i,null,!1)}this.setState({sels:e})}},{key:"updateBorderColor",value:function(e){this.setState({tmpColor:e})}},{key:"treeHandler",value:function(e,t,n,o,r){var i=this,a=this.props.prop,l=a.value,s=(a.selected,a.disabled),c=a.children,u=a.optgroup,p=t[c];if(p.filter((function(e){return!(e[s]||e.__node.disabled)})).forEach((function(t){if(t[u])i.treeHandler(e,t,n,o,r);else{var a=e.findIndex((function(e){return e[l]==t[l]}));"del"===o?-1!=a&&(e.splice(a,1),n.push(t)):"half"!==o&&"add"!==o||-1==a&&(e.push(t),n.push(t))}})),r){var f=p.length,d=p.filter((function(t){return-1!==e.findIndex((function(e){return e[l]===t[l]}))||!0===t.__node.selected})).length;t.__node.selected=d===f,t.__node.half=d>0&&dl;if(l>0&&s)return this.updateBorderColor(a.maxColor),i&&Object(c.e)(i)&&i(t,e),!0}},{key:"itemClick",value:function(e,t,n,o){var r=this.props,i=(r.theme,r.prop),a=r.radio,l=r.repeat,s=r.clickClose,c=(r.max,r.maxMethod,r.tree),u=r.cascader,p=r.data,f=Se(this.state.sels),d=i.value,h=(i.selected,i.disabled,i.children),m=i.optgroup;if(!n){if(e[m]&&(c.show&&c.strict||u.show&&u.strict)){e[h];var b,y=[],x=!0;if(e.__node.selected?(b="del",x=!1):e.__node.half?(b="half",this.treeHandler(f,e,y,b),0===y.length&&(b="del",x=!1)):b="add","half"!=b&&this.treeHandler(f,e,y,b),this.checkMax(y,f))return;f=Se(this.state.sels),y=[],this.treeHandler(f,e,y,b,!0),this.resetSelectValue(f,y,x),this.setState({data:this.state.data})}else if(!t||l&&!o){if(this.checkMax(e,f))return;f=a?[e]:[].concat(Se(f),[e]),this.clearAndReset(p,f,t),this.resetSelectValue(f,[e],!t)}else{var v=f.findIndex((function(t){return t[d]==e[d]}));-1!=v&&(f.splice(v,1),this.resetSelectValue(f,[e],!t))}var g=e.__node.parent;if(g){for(;g;){var _=g[h],w=_.length,k=_.filter((function(e){return-1!==f.findIndex((function(t){return t[d]===e[d]}))||!0===e.__node.selected})).length;g.__node.selected=k===w,g.__node.half=k>0&&k0,g=g.__node.parent}this.setState({data:this.state.data})}s&&!o&&this.onClick()}}},{key:"onClick",value:function(e){var t=this;if("relative"!==this.props.model.type)if(this.props.disabled)!1!==this.state.show&&this.setState({show:!1});else{var n=!this.state.show;if(n){if(this.props.show&&0==this.props.show())return;Object.keys(Xe).filter((function(e){return e!=t.props.el})).forEach((function(e){return Xe[e].closed()}))}else{if(this.props.hide&&0==this.props.hide())return;this.bodyView.scroll&&this.bodyView.scroll(0,0)}this.setState({show:n}),e&&e.stopPropagation()}}},{key:"onReset",value:function(e,t){var n=this;if("data"===t){var o=e.filter((function(e){return!0===e[n.props.prop.selected]}));this.resetSelectValue(Object(c.f)(o,this.state.sels,this.props.prop),o,!0);var r=[];this.load(e,{},r),this.setState({data:e,flatData:r})}else"sels"===t?this.resetSelectValue(e,e,!0):"append"===t?this.append(e):"delete"===t?this.del(e):"auto"===t?this.auto(e):"treeData"===t?this.value(e,null,!0,!1,!1):"close"===t?this.onClick():"class"===t?this.setState({bodyClass:e}):"labelSearchBlur"===t?this.labelRef.blur(e):"labelSearch"===t&&this.generalRef.labelSearch(e)}},{key:"append",value:function(e){var t=this.exchangeValue(e);this.value(Object(c.f)(t,this.state.sels,this.props.prop),this.props.show,!0,t)}},{key:"del",value:function(e){var t=this.props.prop.value,n=this.state.sels,o=this.exchangeValue(e);o.forEach((function(e){var o=n.findIndex((function(n){return n[t]===e[t]}));-1!=o&&n.splice(o,1)})),this.value(n,this.props.show,!0,o,!1)}},{key:"auto",value:function(e){var t=this,n=this.props.prop.value;e.filter((function(e){return-1!=t.state.sels.findIndex((function(t){return t[n]===e[n]}))})).length==e.length?this.del(e):this.append(e)}},{key:"changeExpandedKeys",value:function(e){var t=this.props,n=t.tree,o=t.prop,r=this.state,i=r.dataObj,a=r.flatData;n.show&&this.treeRef.init({dataObj:i,flatData:a,prop:o,tree:{expandedKeys:e}})}},{key:"calcPosition",value:function(){if(this.state.show&&"fixed"===this.props.model.type){var e=this.base.getBoundingClientRect();return Date.now()-this.state.time>10&&this.setState({time:Date.now()}),{position:"fixed",left:e.x,top:e.y+e.height+4,width:e.width}}return{}}},{key:"componentWillReceiveProps",value:function(e){this.init(e,e.updateData)}},{key:"componentWillMount",value:function(){this.init(this.props,!0)}},{key:"render",value:function(e,t){var n=this,o=e.theme,r=e.prop,i=(e.radio,e.repeat,e.clickClose,e.on,e.max,e.maxMethod,e.content),a=e.disabled,l=e.tree,s=e.submitConversion,u={borderColor:o.color},p=t.data,f=t.dataObj,d=t.flatData,h=t.sels,b=t.show,y=t.tmpColor,x=t.bodyClass;a&&(b=!1);var v={style:Re(Re({},e.style),b?u:{}),onClick:this.onClick.bind(this),ua:Object(c.a)(),size:e.size,tabindex:1};y&&(v.style.borderColor=y,setTimeout((function(){v.style.borderColor="",n.updateBorderColor("")}),300)),r.value;var g=Re(Re({},e),{},{data:p,sels:h,ck:this.itemClick.bind(this),title:h.map((function(e){return e[r.name]})).join(","),onReset:this.onReset.bind(this)}),_=Re(Re({},e),{},{data:p,dataObj:f,flatData:d,sels:h,ck:this.itemClick.bind(this),show:b,onReset:this.onReset.bind(this)}),w=i?m(ue,_):l.show?m(xe,je({},_,{ref:function(e){return n.treeRef=e}})):e.cascader.show?m(Ce,_):m(oe,je({},_,{ref:function(e){return n.generalRef=e}})),k=this.calcPosition();return m("xm-select",v,m("input",{class:"xm-select-default","lay-verify":e.layVerify,"lay-verType":e.layVerType,"lay-reqText":e.layReqText,name:e.name,value:s(h,r)}),m("i",{class:b?"xm-icon xm-icon-expand":"xm-icon"}),0===h.length&&m("div",{class:"xm-tips"},e.tips),m(H,je({},g,{ref:function(e){return n.labelRef=e}})),m("div",{class:["xm-body",x,e.model.type,b?"":"dis"].join(" "),style:k,ref:function(e){return n.bodyView=e}},w),a&&m("div",{class:"xm-select-disabled"}))}},{key:"componentDidMount",value:function(){var e=this;this.prepare=!0,this.base.addEventListener("keydown",(function(t){13===t.keyCode&&e.onClick(t)})),this.input=this.base.querySelector(".xm-select-default");var t=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;t&&new t((function(t){t.forEach((function(t){"attributes"==t.type&&"class"===t.attributeName&&-1!==e.input.className.indexOf("layui-form-danger")&&(e.input.className="xm-select-default",e.base.style.borderColor=e.props.theme.maxColor,e.base.scrollIntoView&&e.base.scrollIntoView({behavior:"smooth"}))}))})).observe(this.input,{attributes:!0});for(var n=this.base;n;){if("FORM"===n.tagName){var o=n.querySelector('button[type="reset"]');o&&o.addEventListener("click",(function(t){e.init(e.props,!0)}));break}n=n.parentElement}var r=this.props.done;r&&r()}},{key:"componentDidUpdate",value:function(){var e=this.props,t=e.direction,n=e.model;if("relative"!==n.type&&"fixed"!==n.type){var o=this.base.getBoundingClientRect();if("auto"===t){this.bodyView.style.display="block",this.bodyView.style.visibility="hidden";var r=this.bodyView.getBoundingClientRect().height;this.bodyView.style.display="",this.bodyView.style.visibility="";var i=o.y||o.top||0,a=document.documentElement.clientHeight-i-o.height-20;t=a>r||i0&&void 0!==arguments[0]?arguments[0]:"zn",t=Ne[e]||Ue;return{language:e,languageProp:t,data:[],content:"",name:"select",layVerify:"",layVerType:"",layReqText:"",size:"medium",disabled:!1,initValue:null,create:null,tips:t.tips,empty:t.empty,delay:500,searchTips:t.searchTips,filterable:!1,filterMethod:function(e,t,n,o){return!e||-1!=t[o.name].indexOf(e)},remoteSearch:!1,remoteMethod:function(e,t){t([])},direction:"auto",style:{},height:"200px",autoRow:!1,paging:!1,pageSize:10,pageEmptyShow:!0,pageRemote:!1,radio:!1,repeat:!1,clickClose:!1,max:0,maxMethod:function(e,t){},showCount:0,enableKeyboard:!0,enableHoverFirst:!0,selectedKeyCode:13,toolbar:{show:!1,showIcon:!0,list:["ALL","CLEAR"]},tree:{show:!1,showFolderIcon:!0,showLine:!0,indent:20,expandedKeys:[],strict:!0,lazy:!1,load:null,simple:!1,nodeType:"__node_type",clickExpand:!0,clickCheck:!0},cascader:{show:!1,indent:100,strict:!0},prop:{name:"name",value:"value",selected:"selected",disabled:"disabled",children:"children",optgroup:"optgroup",click:"click"},theme:{color:"#009688",maxColor:"#e54d42",hover:"#f2f2f2"},model:{label:{type:"block",text:{left:"",right:"",separator:", "},block:{showCount:0,showIcon:!0,template:null},count:{template:function(e,t){return"已选中 ".concat(t.length," 项, 共 ").concat(e.length," 项")}}},icon:"show",type:"absolute"},iconfont:{select:"",unselect:"",half:"",parent:""},show:function(){},hide:function(){},template:function(e){e.item,e.sels;var t=e.name;return e.value,t},on:function(e){e.arr,e.item,e.selected},submitConversion:function(e,t){return e.map((function(e){return e[t.value]})).join(",")},done:function(){}}}(e.language),this.update(e)}},{key:"update",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=!!e.data;this.options=Object(c.b)(this.options,e),this.options.__render_success=!1;var n=this.options.dom;if(n){var o=this.options.data||[];if("function"==typeof o&&(o=o(),this.options.data=o),Object(c.d)(o))return T(m(Fe,qe({},this.options,{__update:Date.now(),updateData:t})),n),this.options.__render_success=!0,this;Object(c.k)("data数据必须为数组类型, 不能是".concat("undefined"==typeof data?"undefined":Ye(data),"类型"))}else Object(c.k)("没有找到渲染对象: ".concat(e.el,", 请检查"))}},{key:"reset",value:function(){var e=this.options.el;return this.init($e[e]),et[e].init(this.options,!0),this}},{key:"opened",value:function(){var e=et[this.options.el];return!e.state.show&&e.onClick(),this}},{key:"closed",value:function(){var e=et[this.options.el];return e.state.show&&e.onClick(),this}},{key:"getValue",value:function(e){var t=this,n=this.options,o=n.tree,r=n.prop,i=n.data,a=et[this.options.el].state.sels,l=a;o.show&&o.strict&&o.simple&&(l=[],Object(c.j)(i,a,l,r));var s=Object(c.c)(l,r.children,["__node"]);return"name"===e?s.map((function(e){return e[t.options.prop.name]})):"nameStr"===e?s.map((function(e){return e[t.options.prop.name]})).join(","):"value"===e?s.map((function(e){return e[t.options.prop.value]})):"valueStr"===e?s.map((function(e){return e[t.options.prop.value]})).join(","):s}},{key:"setValue",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(Object(c.d)(e))return et[this.options.el].value(this.options.radio?e.slice(0,1):e,t,n),this;Object(c.k)("请传入数组结构...")}},{key:"append",value:function(e){if(Object(c.d)(e))return et[this.options.el].append(e),this;Object(c.k)("请传入数组结构...")}},{key:"delete",value:function(e){if(Object(c.d)(e))return et[this.options.el].del(e),this;Object(c.k)("请传入数组结构...")}},{key:"warning",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e||this.options.theme.maxColor;return!0===t?et[this.options.el].base.style.borderColor=n:et[this.options.el].updateBorderColor(n),this}},{key:"getTreeValue",value:function(e,t){var n=this.options,o=n.tree,r=n.cascader,i=n.prop,a=i.value;if(!o.show&&!r.show)return this.getValue(e);for(var l=et[this.options.el].state.sels,s=[],u=o.nodeType,p=function(e,t){s.find((function(t){return t[a]===e[a]}))||((e=Ke({},e))[u]=t,s.push(e))},f=0;fe.length)&&(t=e.length);for(var n=0,o=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"pid",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"id",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"children",r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i={};return safety(e).filter((function(e){var a=e[n],l=e[t],s=i[a],c=i[l];return s&&(e[o]=s[o]),i[a]=e,c||(c=Je({},o,[]),i[l]=c),c.push(e),n==r}))}}}}); ================================================ FILE: app/admin/t/tpl/style/tags/jquery.tagsinput.css ================================================ div.tagsinput { border:1px solid #CCC; background: #FFF; padding:5px; width:300px; height:100px; overflow-y: auto;} div.tagsinput span.tag { border: 1px solid #a5d24a; -moz-border-radius:2px; -webkit-border-radius:2px; display: block; float: left; padding: 5px; text-decoration:none; background: #cde69c; color: #638421; margin-right: 5px; margin-bottom:5px;font-family: helvetica; font-size:13px;} div.tagsinput span.tag a { font-weight: bold; color: #82ad2b; text-decoration:none; font-size: 11px; } div.tagsinput input { width:80px; margin:0px; font-family: helvetica; font-size: 13px; border:1px solid transparent; padding:5px; background: transparent; color: #000; outline:0px; margin-right:5px; margin-bottom:5px; } div.tagsinput div { display:block; float: left; } .tags_clear { clear: both; width: 100%; height: 0px; } .not_valid { background: #FBD8DB !important; color: #90111A !important;} ================================================ FILE: app/admin/t/tpl/style/tags/jquery.tagsinput.js ================================================ /* jQuery Tags Input Plugin 1.3.3 Copyright (c) 2011 XOXCO, Inc Documentation for this plugin lives here: http://xoxco.com/clickable/jquery-tags-input Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php ben@xoxco.com */ (function($) { var delimiter = new Array(); var tags_callbacks = new Array(); $.fn.doAutosize = function(o){ var minWidth = $(this).data('minwidth'), maxWidth = $(this).data('maxwidth'), val = '', input = $(this), testSubject = $('#'+$(this).data('tester_id')); if (val === (val = input.val())) {return;} // Enter new content into testSubject var escaped = val.replace(/&/g, '&').replace(/\s/g,' ').replace(//g, '>'); testSubject.html(escaped); // Calculate new width + whether to change var testerWidth = testSubject.width(), newWidth = (testerWidth + o.comfortZone) >= minWidth ? testerWidth + o.comfortZone : minWidth, currentWidth = input.width(), isValidWidthChange = (newWidth < currentWidth && newWidth >= minWidth) || (newWidth > minWidth && newWidth < maxWidth); // Animate width if (isValidWidthChange) { input.width(newWidth); } }; $.fn.resetAutosize = function(options){ // alert(JSON.stringify(options)); var minWidth = $(this).data('minwidth') || options.minInputWidth || $(this).width(), maxWidth = $(this).data('maxwidth') || options.maxInputWidth || ($(this).closest('.tagsinput').width() - options.inputPadding), val = '', input = $(this), testSubject = $('').css({ position: 'absolute', top: -9999, left: -9999, width: 'auto', fontSize: input.css('fontSize'), fontFamily: input.css('fontFamily'), fontWeight: input.css('fontWeight'), letterSpacing: input.css('letterSpacing'), whiteSpace: 'nowrap' }), testerId = $(this).attr('id')+'_autosize_tester'; if(! $('#'+testerId).length > 0){ testSubject.attr('id', testerId); testSubject.appendTo('body'); } input.data('minwidth', minWidth); input.data('maxwidth', maxWidth); input.data('tester_id', testerId); input.css('width', minWidth); }; $.fn.addTag = function(value,options) { options = jQuery.extend({focus:false,callback:true},options); this.each(function() { var id = $(this).attr('id'); var tagslist = $(this).val().split(delimiter[id]); if (tagslist[0] == '') { tagslist = new Array(); } value = jQuery.trim(value); if (options.unique) { var skipTag = $(this).tagExist(value); if(skipTag == true) { //Marks fake input as not_valid to let styling it $('#'+id+'_tag').addClass('not_valid'); } } else { var skipTag = false; } if (value !='' && skipTag != true) { $('').addClass('tag').append( $('').text(value).append('  '), $('', { href : '#', title : 'Removing tag', text : 'x' }).click(function () { return $('#' + id).removeTag(escape(value)); }) ).insertBefore('#' + id + '_addTag'); tagslist.push(value); $('#'+id+'_tag').val(''); if (options.focus) { $('#'+id+'_tag').focus(); } else { $('#'+id+'_tag').blur(); } $.fn.tagsInput.updateTagsField(this,tagslist); if (options.callback && tags_callbacks[id] && tags_callbacks[id]['onAddTag']) { var f = tags_callbacks[id]['onAddTag']; f.call(this, value); } if(tags_callbacks[id] && tags_callbacks[id]['onChange']) { var i = tagslist.length; var f = tags_callbacks[id]['onChange']; f.call(this, $(this), tagslist[i-1]); } } }); return false; }; $.fn.removeTag = function(value) { value = unescape(value); this.each(function() { var id = $(this).attr('id'); var old = $(this).val().split(delimiter[id]); $('#'+id+'_tagsinput .tag').remove(); str = ''; for (i=0; i< old.length; i++) { if (old[i]!=value) { str = str + delimiter[id] +old[i]; } } $.fn.tagsInput.importTags(this,str); if (tags_callbacks[id] && tags_callbacks[id]['onRemoveTag']) { var f = tags_callbacks[id]['onRemoveTag']; f.call(this, value); } }); return false; }; $.fn.tagExist = function(val) { var id = $(this).attr('id'); var tagslist = $(this).val().split(delimiter[id]); return (jQuery.inArray(val, tagslist) >= 0); //true when tag exists, false when not }; // clear all existing tags and import new ones from a string $.fn.importTags = function(str) { id = $(this).attr('id'); $('#'+id+'_tagsinput .tag').remove(); $.fn.tagsInput.importTags(this,str); } $.fn.tagsInput = function(options) { var settings = jQuery.extend({ interactive:true, defaultText:'add a tag', minChars:0, width:'300px', height:'100px', autocomplete: {selectFirst: false }, 'hide':true, 'delimiter':',', 'unique':true, removeWithBackspace:true, placeholderColor:'#666666', autosize: true, comfortZone: 20, inputPadding: 6*2 },options); this.each(function() { if (settings.hide) { $(this).hide(); } var id = $(this).attr('id'); if (!id || delimiter[$(this).attr('id')]) { id = $(this).attr('id', 'tags' + new Date().getTime()).attr('id'); } var data = jQuery.extend({ pid:id, real_input: '#'+id, holder: '#'+id+'_tagsinput', input_wrapper: '#'+id+'_addTag', fake_input: '#'+id+'_tag' },settings); delimiter[id] = data.delimiter; if (settings.onAddTag || settings.onRemoveTag || settings.onChange) { tags_callbacks[id] = new Array(); tags_callbacks[id]['onAddTag'] = settings.onAddTag; tags_callbacks[id]['onRemoveTag'] = settings.onRemoveTag; tags_callbacks[id]['onChange'] = settings.onChange; } var markup = '
    '; if (settings.interactive) { markup = markup + ''; } markup = markup + '
    '; $(markup).insertAfter(this); $(data.holder).css('width',settings.width); $(data.holder).css('min-height',settings.height); if ($(data.real_input).val()!='') { $.fn.tagsInput.importTags($(data.real_input),$(data.real_input).val()); } if (settings.interactive) { $(data.fake_input).val($(data.fake_input).attr('data-default')); $(data.fake_input).css('color',settings.placeholderColor); $(data.fake_input).resetAutosize(settings); $(data.holder).bind('click',data,function(event) { $(event.data.fake_input).focus(); }); $(data.fake_input).bind('focus',data,function(event) { if ($(event.data.fake_input).val()==$(event.data.fake_input).attr('data-default')) { $(event.data.fake_input).val(''); } $(event.data.fake_input).css('color','#000000'); }); if (settings.autocomplete_url != undefined) { autocomplete_options = {source: settings.autocomplete_url}; for (attrname in settings.autocomplete) { autocomplete_options[attrname] = settings.autocomplete[attrname]; } if (jQuery.Autocompleter !== undefined) { $(data.fake_input).autocomplete(settings.autocomplete_url, settings.autocomplete); $(data.fake_input).bind('result',data,function(event,data,formatted) { if (data) { $('#'+id).addTag(data[0] + "",{focus:true,unique:(settings.unique)}); } }); } else if (jQuery.ui.autocomplete !== undefined) { $(data.fake_input).autocomplete(autocomplete_options); $(data.fake_input).bind('autocompleteselect',data,function(event,ui) { $(event.data.real_input).addTag(ui.item.value,{focus:true,unique:(settings.unique)}); return false; }); } } else { // if a user tabs out of the field, create a new tag // this is only available if autocomplete is not used. $(data.fake_input).bind('blur',data,function(event) { var d = $(this).attr('data-default'); if ($(event.data.fake_input).val()!='' && $(event.data.fake_input).val()!=d) { if( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) ) $(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)}); } else { $(event.data.fake_input).val($(event.data.fake_input).attr('data-default')); $(event.data.fake_input).css('color',settings.placeholderColor); } return false; }); } // if user types a comma, create a new tag $(data.fake_input).bind('keypress',data,function(event) { if (event.which==event.data.delimiter.charCodeAt(0) || event.which==13 ) { event.preventDefault(); if( (event.data.minChars <= $(event.data.fake_input).val().length) && (!event.data.maxChars || (event.data.maxChars >= $(event.data.fake_input).val().length)) ) $(event.data.real_input).addTag($(event.data.fake_input).val(),{focus:true,unique:(settings.unique)}); $(event.data.fake_input).resetAutosize(settings); return false; } else if (event.data.autosize) { $(event.data.fake_input).doAutosize(settings); } }); //Delete last tag on backspace data.removeWithBackspace && $(data.fake_input).bind('keydown', function(event) { if(event.keyCode == 8 && $(this).val() == '') { event.preventDefault(); var last_tag = $(this).closest('.tagsinput').find('.tag:last').text(); var id = $(this).attr('id').replace(/_tag$/, ''); last_tag = last_tag.replace(/[\s]+x$/, ''); $('#' + id).removeTag(escape(last_tag)); $(this).trigger('focus'); } }); $(data.fake_input).blur(); //Removes the not_valid class when user changes the value of the fake input if(data.unique) { $(data.fake_input).keydown(function(event){ if(event.keyCode == 8 || String.fromCharCode(event.which).match(/\w+|[áéíóúÁÉÍÓÚñÑ,/]+/)) { $(this).removeClass('not_valid'); } }); } } // if settings.interactive }); return this; }; $.fn.tagsInput.updateTagsField = function(obj,tagslist) { var id = $(obj).attr('id'); $(obj).val(tagslist.join(delimiter[id])); }; $.fn.tagsInput.importTags = function(obj,val) { $(obj).val(''); var id = $(obj).attr('id'); var tags = val.split(delimiter[id]); for (i=0; i {include="style"} {include="edit"}
      {php $ctype = []; $i = 0; $allconfig = M('sysconfig')->findAll(); $newconfig = []; foreach($allconfig as $vs){ $newconfig[$vs['typeid']][] = $vs; } function bubbleSort($arr) { $n = count($arr); for ($i = 0; $i < $n - 1; $i++) { for ($j = 0; $j < $n - $i - 1; $j++) { if ($arr[$j]['orders'] < $arr[$j + 1]['orders']) { // 交换元素 $temp = $arr[$j]; $arr[$j] = $arr[$j + 1]; $arr[$j + 1] = $temp; } } } return $arr; } foreach($newconfig as $kk=>$vv){ //冒泡排序 $newconfig[$kk] = bubbleSort($vv); } /} {loop table="ctype" orderby="id asc" isopen="1" as="v"} {if(checkAction('Sys/ctype/type/'.$v['action']))}
    • {fun JZLANG($v['title'])}
    • {php $ctype[]=$v; $i++; /} {/if} {/loop} {if($admin['gid']==1)}
    • {fun JZLANG('自定义配置')}
    • {/if}
    {foreach $ctype as $s}
    {foreach $newconfig[$s['id']] as $v} {if($v['type']==1)}
    {if($v['tip'])} {/if} {if($admin['gid']==1)}
    {!--$webconf['{$v['field']}']--}
    {if($v['sys']!=1)}
    {/if} {/if}
    {else if($v['type']==2)}
    {if($v['tip'])} {/if} {if($admin['gid']==1)}
    {!--$webconf['{$v['field']}']--}
    {if($v['sys']!=1)}
    {/if} {/if}
    {else if($v['type']==3)}
    {if($v['sys']!=1 && $admin['gid']==1)}
    {/if}
    {else if($v['type']==4)} {php $edit = require(APP_PATH.APP_HOME.'/'.HOME_VIEW.'/'.Tpl_template.'/common/uediter.php'); echo $edit; /} {if($admin['gid']==1)}
    {!--$webconf['{$v['field']}']--}
    {if($v['sys']!=1)}
    {/if} {/if} {else if($v['type']==5)}
    {if($v['tip'])} {/if} {if($admin['gid']==1)}
    {!--$webconf['{$v['field']}']--}
    {if($v['sys']!=1)}
    {/if} {/if}
    {else if($v['type']==6)}
    {if($v['tip'])} {/if} {if($admin['gid']==1)}
    {!--$webconf['{$v['field']}']--}
    {if($v['sys']!=1)}
    {/if} {/if}
    {else if($v['type']==7)}
    {if($v['tip'])} {/if} {if($admin['gid']==1)}
    {!--$webconf['{$v['field']}']--}
    {if($v['sys']!=1)}
    {/if} {/if}
    {else if($v['type']==8)}
    {if($v['sys']!=1 && $admin['gid']==1)}
    {/if}
    {/if} {/foreach} {if($s['sys']!=1 && $admin['gid']==1)}
    {/if}
    {/foreach}
    {if($admin['gid']==1)}
    {fun JZLANG('自定义配置')}


    {fun JZLANG('自定义配置栏')}
    {/if}
    ================================================ FILE: app/admin/t/tpl/systype.html ================================================ {include="style"}
    {if($admin['isadmin'])} {fun JZLANG('新增配置栏目')} {/if}
    {foreach $lists as $v} {/foreach}
    ID {fun JZLANG('配置栏名称')} {fun JZLANG('配置标识')} {fun JZLANG('系统配置')} {fun JZLANG('是否启用')} {fun JZLANG('操作')}
    {$v['id']} {$v['title']} {$v['action']} {if($v['sys'])}{else}{/if} {if($admin['isadmin'])} {fun JZLANG('编辑')} {fun JZLANG('查看')} {/if} {if($admin['isadmin'])} {if(!$v['sys'])}{fun JZLANG('删除')} {/if} {/if}
    ================================================ FILE: app/admin/t/tpl/template-list.html ================================================ {include="style"}
      {foreach $lists as $v}
    • {$v['name']}
      {fun JZLANG('作者:')}{$v['author']}
      {if($v['official']==1)}{fun JZLANG('官方')}{else if($v['official']==2)}{fun JZLANG('本地')}{else}{fun JZLANG('第三方')}{/if} 【 {$v['template']} 】 v{$v['version']}{if($v['isupdate'])} {fun JZLANG('有更新')}{/if}
      {$v['description']}
      {if($v['install'])} {fun JZLANG('已使用')} {fun JZLANG('备份数据')} {else if($v['official']==2)} {fun JZLANG('安装模板')} {else}
      {fun JZLANG('下载')}
      {/if}
    • {/foreach}
    {$pages}
    ================================================ FILE: app/admin/t/tpl/template-update.html ================================================ {include="style"}

    {$templatedata['name']}

    {fun JZLANG('当前版本:')}v{$templatedata['version']}  {fun JZLANG('最新版本:')}v{$data['version']}  {fun JZLANG('作者:')}{$templatedata['author']}  {fun JZLANG('更新时间:')}{$data['time']}

    {fun JZLANG('更新内容')}
    {fun nl2br($data['data'])}
    ================================================ FILE: app/admin/t/tpl/tohtml.html ================================================ {include="style"}
    {loop table="molds" sys="0" as="v"} {if($v['biaoshi']!='links' && $v['biaoshi']!='tags')} {/if} {/loop}
    {fun JZLANG('模块名称')} {fun JZLANG('指定栏目')} {fun JZLANG('输出范围')} {fun JZLANG('操作')}
    {fun JZLANG('栏目模块')}
    {fun JZLANG('文章模块')}
    {fun JZLANG('商品模块')}
    {$v['name']}{fun JZLANG('模块')}
    ================================================ FILE: app/admin/t/tpl/unicode.html ================================================ IconFont Demo

    • 330横向收起
      &#xe974;
    • 331刷新
      &#xe975;
    • 332同步
      &#xe976;
    • 333加载loading-A
      &#xe977;
    • 333加载loading-B
      &#xe978;
    • 401位置-线性
      &#xe979;
    • 401位置
      &#xe97a;
    • 402导航
      &#xe97b;
    • 404定位
      &#xe97c;
    • 404监控、摄像头-线性
      &#xe97d;
    • 403拓点图
      &#xe97e;
    • 
      404监控、摄像头
      &#xe97f;
    • 405雷达、探测
      &#xe980;
    • 406报表
      &#xe981;
    • 407饼图-线性
      &#xe982;
    • 406报表-线性
      &#xe983;
    • 407饼图
      &#xe984;
    • 408条形图
      &#xe985;
    • 408条形图-线性
      &#xe986;
    • 409折线图
      &#xe987;
    • 409折线图-线性
      &#xe988;
    • 410指南、指导-线性
      &#xe989;
    • 411地图
      &#xe98a;
    • 410指南、指导
      &#xe98b;
    • 902投诉
      &#xe98c;
    • 901巡检、检验
      &#xe98d;
    • 50店铺
      &#xe98e;
    • 01运输中、物流-线性
      &#xe88f;
    • 50店铺-线性
      &#xe98f;
    • 01运输中、物流
      &#xe890;
    • 51快递员
      &#xe990;
    • 02包裹、发货
      &#xe891;
    • 51快递员-线性
      &#xe991;
    • 02包裹、发货-线性
      &#xe892;
    • 44贷款-线性
      &#xe992;
    • 03拆包裹、取件
      &#xe893;
    • 45还款-线性
      &#xe993;
    • 03拆包裹、取件-线性
      &#xe894;
    • 47退款-细
      &#xe994;
    • 04自提柜
      &#xe895;
    • 234日历-线性-细
      &#xe995;
    • 04自提柜-线性
      &#xe896;
    • 49计算器、利率-线性-细
      &#xe996;
    • 05采购-线性
      &#xe897;
    • 257用户资料
      &#xe997;
    • 05采购
      &#xe898;
    • 257用户资料-线性
      &#xe998;
    • 06商品
      &#xe899;
    • 258皮肤&主题
      &#xe999;
    • 06商品-线性
      &#xe89a;
    • 258皮肤&主题-线性
      &#xe99a;
    • 07配载、装车
      &#xe89b;
    • 259钻石
      &#xe99b;
    • 07配载、装车-线性
      &#xe89c;
    • 259钻石-线性
      &#xe99c;
    • 08质量-线性
      &#xe89d;
    • 54设计-线性
      &#xe99d;
    • 08质量
      &#xe89e;
    • 55开发-线性
      &#xe99e;
    • 09安全、保障
      &#xe89f;
    • 48银行卡
      &#xe99f;
    • 09安全、保障-线性
      &#xe8a0;
    • 48银行卡-线性
      &#xe9a0;
    • 10仓库、仓储
      &#xe8a1;
    • 52红包-线性
      &#xe9a1;
    • 10仓库、仓储-线性
      &#xe8a2;
    • 52红包
      &#xe9a2;
    • 11中转站-线性
      &#xe8a3;
    • 爱心
      &#xe9a3;
    • 11中转站
      &#xe8a4;
    • 编辑
      &#xe9a4;
    • 12库存-线性
      &#xe8a5;
    • 3D眼镜
      &#xe9a5;
    • 12库存
      &#xe8a6;
    • 彩蛋
      &#xe9a6;
    • 13末端网点-线性
      &#xe8a7;
    • 安全
      &#xe9a7;
    • 13末端网点
      &#xe8a8;
    • 帮助
      &#xe9a8;
    • 14签收、审批通过-线性
      &#xe8a9;
    • 不感兴趣
      &#xe9a9;
    • 14签收、审批通过
      &#xe8aa;
    • 播放记录
      &#xe9aa;
    • 15拒签收-线性
      &#xe8ab;
    • 创作
      &#xe9ab;
    • 15拒签收
      &#xe8ac;
    • 成功
      &#xe9ac;
    • 16寄件、发送-线性
      &#xe8ad;
    • 测试
      &#xe9ad;
    • 16寄件、发送
      &#xe8ae;
    • 电话
      &#xe9ae;
    • 17企业、园区、物业
      &#xe8af;
    • 点赞
      &#xe9af;
    • 17企业、园区、物业-线性
      &#xe8b0;
    • 定位
      &#xe9b0;
    • 19结算-线性
      &#xe8b1;
    • 电筒_关
      &#xe9b1;
    • 19结算
      &#xe8b2;
    • 电影
      &#xe9b2;
    • 20积分
      &#xe8b3;
    • 地图
      &#xe9b3;
    • 20积分-线性
      &#xe8b4;
    • 电筒_开
      &#xe9b4;
    • 21优惠劵-线性
      &#xe8b5;
    • 电影票
      &#xe9b5;
    • 22资料、手册
      &#xe8b6;
    • 订单
      &#xe9b6;
    • 22资料、手册-线性
      &#xe8b7;
    • 更多
      &#xe9b7;
    • 21优惠劵
      &#xe8b8;
    • 翻倍
      &#xe9b8;
    • 23规则
      &#xe8b9;
    • 发现
      &#xe9b9;
    • 25单据-线性
      &#xe8ba;
    • 儿童票
      &#xe9ba;
    • 24组织架构、接口
      &#xe8bb;
    • 公益
      &#xe9bb;
    • 25单据
      &#xe8bc;
    • 红包
      &#xe9bc;
    • 26创建单据-线性
      &#xe8bd;
    • 复制
      &#xe9bd;
    • 26创建单据
      &#xe8be;
    • 分享
      &#xe9be;
    • 27账单-线性
      &#xe8bf;
    • 
      话题符号
      &#xe9bf;
    • 27账单
      &#xe8c0;
    • 会员
      &#xe9c0;
    • 28体积、空间
      &#xe8c1;
    • 阿里鱼
      &#xe9c1;
    • 28体积、空间-线性
      &#xe8c2;
    • 机具
      &#xe9c2;
    • 29业务-线性
      &#xe8c3;
    • 减少
      &#xe9c3;
    • 29业务
      &#xe8c4;
    • 卡包
      &#xe9c4;
    • 30应用程序-线性
      &#xe8c5;
    • 话题
      &#xe9c5;
    • 30应用程序
      &#xe8c6;
    • 关注
      &#xe9c6;
    • 31标准
      &#xe8c7;
    • 买一赠一
      &#xe9c7;
    • 31标准-线性
      &#xe8c8;
    • 密码
      &#xe9c8;
    • 32权限、钥匙
      &#xe8c9;
    • &#xe9c9;
    • 32权限、钥匙-线性
      &#xe8ca;
    • &#xe9ca;
    • 33资源
      &#xe8cb;
    • 礼盒
      &#xe9cb;
    • 33资源-线性
      &#xe8cc;
    • 排行榜
      &#xe9cc;
    • 34模板、框架-线性
      &#xe8cd;
    • 礼品卡
      &#xe9cd;
    • 34模板、框架
      &#xe8ce;
    • 朋友圈
      &#xe9ce;
    • 35新闻、资讯
      &#xe8cf;
    • 明星活动
      &#xe9cf;
    • 35新闻、资讯-线性
      &#xe8d0;
    • 取票
      &#xe9d0;
    • 36合作、关系-线性
      &#xe8d1;
    • 扫一扫
      &#xe9d1;
    • 36合作、关系
      &#xe8d2;
    • 日历
      &#xe9d2;
    • 36线路
      &#xe8d3;
    • 评论
      &#xe9d3;
    • 37-服务-线性
      &#xe8d4;
    • 轻会员
      &#xe9d4;
    • 37-服务
      &#xe8d5;
    • 日签
      &#xe9d5;
    • 38-客服-线性
      &#xe8d6;
    • 闪电
      &#xe9d6;
    • 38-客服
      &#xe8d7;
    • 筛选
      &#xe9d7;
    • 39-国际-线性
      &#xe8d8;
    • 商圈
      &#xe9d8;
    • 39-国际
      &#xe8d9;
    • 删除
      &#xe9d9;
    • 40海关-线性
      &#xe8da;
    • 设置
      &#xe9da;
    • 40海关
      &#xe8db;
    • 上传
      &#xe9db;
    • 41头程、空运
      &#xe8dc;
    • 社区
      &#xe9dc;
    • 42尾程
      &#xe8dd;
    • 声音关闭
      &#xe9dd;
    • 43财务
      &#xe8de;
    • 失败
      &#xe9de;
    • 43财务-线性
      &#xe8df;
    • 时间
      &#xe9df;
    • 46免费
      &#xe8e0;
    • 声音
      &#xe9e0;
    • 46免费-线性
      &#xe8e1;
    • 收藏
      &#xe9e1;
    • 47退款
      &#xe8e2;
    • 手机
      &#xe9e2;
    • 49计算器、利率
      &#xe8e3;
    • 首页
      &#xe9e3;
    • 49计算器、利率-线性
      &#xe8e4;
    • 数据
      &#xe9e4;
    • 201checkbox-未选
      &#xe8e5;
    • 刷新
      &#xe9e5;
    • 201checkbox-选中
      &#xe8e6;
    • 搜索
      &#xe9e6;
    • 202Raidobox-未选
      &#xe8e7;
    • 叹号
      &#xe9e7;
    • 202Raidobox-选中
      &#xe8e8;
    • 讨论区
      &#xe9e8;
    • 201checkbox-选中部分
      &#xe8e9;
    • 添加优惠券
      &#xe9e9;
    • 203右下角勾选
      &#xe8ea;
    • 提示
      &#xe9ea;
    • 206搜索-线性
      &#xe8eb;
    • 图片
      &#xe9eb;
    • 205设置-线性
      &#xe8ec;
    • 退票
      &#xe9ec;
    • 205设置
      &#xe8ed;
    • 未选中
      &#xe9ed;
    • 204首页
      &#xe8ee;
    • 微博
      &#xe9ee;
    • 204首页-线性
      &#xe8ef;
    • 问卷
      &#xe9ef;
    • 206搜索
      &#xe8f0;
    • 我的
      &#xe9f0;
    • 207问题-线性
      &#xe8f1;
    • 微信
      &#xe9f1;
    • 207问题
      &#xe8f2;
    • 我的关注
      &#xe9f2;
    • 209电话-线性圆框
      &#xe8f3;
    • 虾米
      &#xe9f3;
    • 208聊天、对话
      &#xe8f4;
    • 想看
      &#xe9f4;
    • 208聊天、对话-线性
      &#xe8f5;
    • 相机
      &#xe9f5;
    • 209电话
      &#xe8f6;
    • 消息
      &#xe9f6;
    • 209电话-圆框
      &#xe8f7;
    • 下载
      &#xe9f7;
    • 210信-线性
      &#xe8f8;
    • 小聚场
      &#xe9f8;
    • 211铃铛
      &#xe8f9;
    • 小食
      &#xe9f9;
    • 211铃铛-线性
      &#xe8fa;
    • 消息中心
      &#xe9fa;
    • 210信
      &#xe8fb;
    • 银行卡
      &#xe9fb;
    • 212喇叭-线性
      &#xe8fc;
    • 眼睛
      &#xe9fc;
    • 212喇叭
      &#xe8fd;
    • 影城卡
      &#xe9fd;
    • 213麦克风-线性
      &#xe8fe;
    • 已想看
      &#xe9fe;
    • 213收藏
      &#xe8ff;
    • 
      影评模板
      &#xe9ff;
    • 213麦克风
      &#xe900;
    • 演出
      &#xea00;
    • 213喜欢-线性
      &#xe901;
    • 小蜜
      &#xea01;
    • 213收藏-线性
      &#xe902;
    • 影院
      &#xea02;
    • 213喜欢
      &#xe903;
    • 增加
      &#xea03;
    • 215更多-横向
      &#xe904;
    • 语音
      &#xea04;
    • 216更多-竖向
      &#xe905;
    • 优惠券
      &#xea05;
    • 217时间-线性
      &#xe906;
    • WIFI
      &#xea06;
    • 214声波、语音消息
      &#xe907;
    • 直播
      &#xea07;
    • 217时间
      &#xe908;
    • 优酷会员
      &#xea08;
    • 219上传、导出
      &#xe909;
    • 娱乐宝
      &#xea09;
    • 218下载、导入
      &#xe90a;
    • 指纹
      &#xea0a;
    • 223保存-线性
      &#xe90b;
    • 爱心
      &#xea0b;
    • 220闪光灯
      &#xe90c;
    • 成功
      &#xea0c;
    • 222闪光灯-自动
      &#xe90d;
    • 点赞
      &#xea0d;
    • 221闪光灯-关闭
      &#xe90e;
    • 电话
      &#xea0e;
    • 223保存
      &#xe90f;
    • 帮助
      &#xea0f;
    • 224用户-线性
      &#xe910;
    • 电影票
      &#xea10;
    • 224用户
      &#xe911;
    • 发现
      &#xea11;
    • 226角色、群体
      &#xe912;
    • 定位
      &#xea12;
    • 225默认头像
      &#xe913;
    • 公告
      &#xea13;
    • 227注册、添加好友
      &#xe914;
    • 话题
      &#xea14;
    • 228任务
      &#xe915;
    • 减少
      &#xea15;
    • 229中文模式
      &#xe916;
    • 会员
      &#xea16;
    • 231附件
      &#xe917;
    • 评论
      &#xea17;
    • 232编辑、输入-线性
      &#xe918;
    • 社区
      &#xea18;
    • 232编辑、输入
      &#xe919;
    • 失败
      &#xea19;
    • 230英文模式
      &#xe91a;
    • 时间
      &#xea1a;
    • 233键盘-线性
      &#xe91b;
    • 闪电
      &#xea1b;
    • 233键盘
      &#xe91c;
    • 我的
      &#xea1c;
    • 234日历
      &#xe91d;
    • 首页
      &#xea1d;
    • 236未出勤
      &#xe91e;
    • 手机
      &#xea1e;
    • 235考勤、出勤
      &#xe91f;
    • 叹号
      &#xea1f;
    • 237拍照
      &#xe920;
    • 收藏
      &#xea20;
    • 237拍照-线性
      &#xe921;
    • 数据
      &#xea21;
    • 238图片-线性
      &#xe922;
    • 问答
      &#xea22;
    • 238图片
      &#xe923;
    • 眼睛
      &#xea23;
    • 239扫描
      &#xe924;
    • 影城卡
      &#xea24;
    • 240显示、可见
      &#xe925;
    • 相机
      &#xea25;
    • 242锁定
      &#xe926;
    • 影院
      &#xea26;
    • 241隐藏、不可见
      &#xe927;
    • 银行优惠
      &#xea27;
    • 243解锁
      &#xe928;
    • 小食
      &#xea28;
    • 244安装、施工-线性
      &#xe929;
    • 演出
      &#xea29;
    • 245筛选过滤
      &#xe92a;
    • 增加
      &#xea2a;
    • 244安装、施工
      &#xe92b;
    • 电影
      &#xea2b;
    • 246注销、关机
      &#xe92c;
    • 优惠券
      &#xea2c;
    • 247好评-圆框
      &#xe92d;
    • 热门
      &#xea2d;
    • 248差评-圆框
      &#xe92e;
    • 创作
      &#xea2e;
    • 248差评
      &#xe92f;
    • 247好评
      &#xe930;
    • 250一般
      &#xe931;
    • 249满意
      &#xe932;
    • 251不满意
      &#xe933;
    • 253列表视图、菜单
      &#xe934;
    • 252宫格视图
      &#xe935;
    • 255Phone手机
      &#xe936;
    • 254PC台式机
      &#xe937;
    • 256PDA手持工作设备
      &#xe938;
    • 301加-方框
      &#xe939;
    • 301加-线性方框
      &#xe93a;
    • 301加-线性圆框
      &#xe93b;
    • 301加-圆框
      &#xe93c;
    • 302减-方框
      &#xe93d;
    • 301加
      &#xe93e;
    • 
      302减-圆框
      &#xe93f;
    • 302减
      &#xe940;
    • 302减-线性方框
      &#xe941;
    • 303正确、完成-线性圆框
      &#xe942;
    • 303正确、完成-圆框
      &#xe943;
    • 303正确、完成
      &#xe944;
    • 302减-线性圆框
      &#xe945;
    • 304错误、关闭、取消-线性方框
      &#xe946;
    • 304错误、关闭、取消-圆框
      &#xe947;
    • 304错误、关闭、取消-线性圆框
      &#xe948;
    • 304错误、关闭、取消
      &#xe949;
    • 304错误、关闭、取消-方框
      &#xe94a;
    • 305信息-线性圆框
      &#xe94b;
    • 305信息
      &#xe94c;
    • 306问号-线性圆框
      &#xe94d;
    • 306问号
      &#xe94e;
    • 306问号-圆框
      &#xe94f;
    • 305信息-圆框
      &#xe950;
    • 307感叹号-三角框
      &#xe951;
    • 307感叹号-圆框
      &#xe952;
    • 307感叹号-线性圆框
      &#xe953;
    • 307感叹号-线性三角框
      &#xe954;
    • 307感叹号
      &#xe955;
    • 308上一页、后退、返回-线性圆框
      &#xe956;
    • 308上一页、后退、返回-圆框
      &#xe957;
    • 309下一页、前进、查看更多-线性圆框
      &#xe958;
    • 309下一页、前进、查看更多-圆框
      &#xe959;
    • 308上一页、后退、返回
      &#xe95a;
    • 309下一页、前进、查看更多
      &#xe95b;
    • 310向下、展开-线性圆框
      &#xe95c;
    • 310向下、展开-圆框
      &#xe95d;
    • 310向下、展开
      &#xe95e;
    • 311向上、收起-圆框
      &#xe95f;
    • 311向上、收起-线性圆框
      &#xe960;
    • 312指向左
      &#xe961;
    • 313指向右
      &#xe962;
    • 315指向上
      &#xe963;
    • 微信
      &#xe601;
    • 支付宝
      &#xe600;
    • QQ
      &#xe62e;
    • 微信
      &#xe60e;
    • 微信
      &#xe621;
    • qq
      &#xe607;
    • qq
      &#xe66a;
    • 支付宝
      &#xe603;
    • electrical
      &#xe6d4;
    • home
      &#xe6d7;
    • electronics
      &#xe6da;
    • gifts
      &#xe6db;
    • lights
      &#xe6de;
    • sports
      &#xe6e0;
    • toys
      &#xe6e1;
    • auto
      &#xe6e3;
    • jewelry
      &#xe6e4;
    • trade-assurance
      &#xe6e5;
    • browse
      &#xe6e6;
    • rfq-qm
      &#xe6e7;
    • rfq-quantity
      &#xe6e8;
    • atm-away
      &#xe6e9;
    • rfq
      &#xe6eb;
    • scanning
      &#xe6ec;
    • compare
      &#xe6ee;
    • filter
      &#xe6f1;
    • pin
      &#xe6f2;
    • history
      &#xe6f3;
    • product-features
      &#xe6f4;
    • supplier-features
      &#xe6f5;
    • similar-product
      &#xe6f6;
    • link
      &#xe6f7;
    • cut
      &#xe6f8;
    • nav-list
      &#xe6fa;
    • image-text
      &#xe6fb;
    • text
      &#xe6fc;
    • move
      &#xe6fd;
    • subtract
      &#xe6fe;
    • dollar
      &#xe702;
    • raw
      &#xe704;
    • office
      &#xe705;
    • agriculture
      &#xe707;
    • machinery
      &#xe709;
    • assessed-Badge
      &#xe70a;
    • personal-center
      &#xe70b;
    • integral
      &#xe70c;
    • operation
      &#xe70e;
    • remind
      &#xe713;
    • download
      &#xe714;
    • map
      &#xe715;
    • bad
      &#xe716;
    • good
      &#xe717;
    • skip
      &#xe718;
    • play
      &#xe719;
    • stop
      &#xe71a;
    • compass
      &#xe71b;
    • security
      &#xe71c;
    • share
      &#xe71d;
    • store
      &#xe722;
    • manage-order
      &#xe723;
    • rejected-order
      &#xe724;
    • phone
      &#xe725;
    • bussiness-man
      &#xe726;
    • shoes
      &#xe728;
    • Mobile-phone
      &#xe72a;
    • email-filling
      &#xe72d;
    • favorites-filling
      &#xe730;
    • account-filling
      &#xe732;
    • credit-level
      &#xe735;
    • credit-level-filling
      &#xe736;
    • exl
      &#xe73f;
    • pdf
      &#xe740;
    • zip
      &#xe741;
    • sorting
      &#xe743;
    • copy
      &#xe744;
    • save
      &#xe747;
    • inquiry-template
      &#xe749;
    • template-default
      &#xe74a;
    • libra
      &#xe74c;
    • survey
      &#xe74e;
    • ship
      &#xe74f;
    • bussiness-card
      &#xe753;
    • hot
      &#xe756;
    • data
      &#xe757;
    • trade
      &#xe758;
    • onepage
      &#xe75a;
    • signboard
      &#xe75c;
    • shuffling-banner
      &#xe75e;
    • component
      &#xe75f;
    • component-filling
      &#xe760;
    • color
      &#xe761;
    • color-filling
      &#xe7cd;
    • favorites
      &#xe7ce;
    • pic-filling
      &#xe802;
    • RFQ
      &#xe803;
    • RFQ-filling
      &#xe804;
    • original-image
      &#xe806;
    • logistic
      &#xe811;
    • Calculator
      &#xe812;
    • video
      &#xe820;
    • earth
      &#xe828;
    • task-management
      &#xe829;
    • trust
      &#xe82a;
    • password
      &#xe82b;
    • 3column
      &#xe839;
    • apparel
      &#xe83a;
    • bags
      &#xe83b;
    • folder
      &#xe83c;
    • 4column
      &#xe83d;
    • code
      &#xe842;
    • RFQ-filling
      &#xe843;
    • customs-clearance
      &#xe863;
    • good-filling
      &#xe866;
    • camera
      &#xe86e;
    • pin-fill
      &#xe87a;
    • help-fill
      &#xe87b;
    • add-account
      &#xe87c;
    • listing-content
      &#xe87d;
    • warehouse-delivery
      &#xe87e;
    • customization
      &#xe87f;
    • inspection
      &#xe880;
    • packing-labeling
      &#xe881;
    • online-tracking
      &#xe882;
    • play-filling
      &#xe883;
    • nosound-filling
      &#xe884;
    • sound-filling
      &#xe885;
    • electrical-equipment
      &#xe886;
    • home-appliances
      &#xe887;
    • furniture
      &#xe888;
    • fashion-accessories
      &#xe889;
    • security-protection
      &#xe88a;
    • textile-products
      &#xe88b;
    • tools-hardware
      &#xe88c;
    • office-supplies
      &#xe88d;
    • vehicles
      &#xe88e;
    • all
      &#xe696;
    • back
      &#xe697;
    • cart
      &#xe698;
    • Category
      &#xe699;
    • close
      &#xe69a;
    • comments
      &#xe69b;
    • cry
      &#xe69c;
    • delete
      &#xe69d;
    • edit
      &#xe69e;
    • email
      &#xe69f;
    • favorite
      &#xe6a0;
    • form
      &#xe6a2;
    • help
      &#xe6a3;
    • information
      &#xe6a4;
    • less
      &#xe6a5;
    • more_unfold
      &#xe6a6;
    • more
      &#xe6a7;
    • pic
      &#xe6a8;
    • QRCode
      &#xe6a9;
    • refresh
      &#xe6aa;
    • RFQ
      &#xe6ab;
    • search
      &#xe6ac;
    • selected
      &#xe6ad;
    • set
      &#xe6ae;
    • Smile
      &#xe6af;
    • success
      &#xe6b1;
    • survey
      &#xe6b2;
    • training
      &#xe6b3;
    • ViewGallery
      &#xe6b4;
    • Viewlist
      &#xe6b5;
    • warning
      &#xe6b6;
    • wrong
      &#xe6b7;
    • account
      &#xe6b8;
    • add
      &#xe6b9;
    • atm
      &#xe6ba;
    • clock
      &#xe6bb;
    • remind
      &#xe6bc;
    • calendar
      &#xe6bf;
    • attachment
      &#xe6c0;
    • discount
      &#xe6c5;
    • service
      &#xe6c7;
    • print
      &#xe6c9;
    • box
      &#xe6cb;
    • process
      &#xe6ce;
    • beauty
      &#xe6d2;
    • 311向上、收起
      &#xe964;
    • 314指向下
      &#xe965;
    • 316第一页
      &#xe966;
    • 317最后页
      &#xe967;
    • 319表头-正序
      &#xe968;
    • 318表头-可排序
      &#xe969;
    • 320表头-倒序
      &#xe96a;
    • 321 回顶部
      &#xe96b;
    • 323向左交换
      &#xe96c;
    • 322相互交换
      &#xe96d;
    • 324向右交换
      &#xe96e;
    • 326数值下降
      &#xe96f;
    • 327全屏
      &#xe970;
    • 329横向展开
      &#xe971;
    • 325数值上升
      &#xe972;
    • 328退出全屏
      &#xe973;
    ================================================ FILE: app/admin/t/tpl/wechat-caidan.html ================================================ {include="style"}

    非网站管理员不可随意更改菜单!

    TYPE
    1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
    2、view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
    3、media_id:下发消息(除文本消息)用户点击media_id类型按钮后,微信服务器会将开发者填写的永久素材id对应的素材下发给用户,永久素材类型可以是图片、音频、视频、图文消息。请注意:永久素材id必须是在“素材管理/新增永久素材”接口上传后获得的合法id。
    排序: 按照正序,越小排在越前面,每个菜单都要给他设置一个排序值,否则会报错。
    {foreach $lists['menu']['button'] as $k=>$v} {php if($v['type']=='miniprogram'){ $v['key'] = $v['appid']; $v['url'] = $v['pagepath']; } /} {if(count($v['sub_button'])>0)} {foreach $v['sub_button'] as $vv} {php if($vv['type']=='miniprogram'){ $vv['key'] = $vv['appid']; $vv['url'] = $vv['pagepath']; } /} {/foreach} {/if} {/foreach}
    排序 菜单名称 type key url media_id 操作
    |--






    ================================================ FILE: app/admin/t/tpl/wechat-sucai.html ================================================ {include="style"}
    {if($data['type']=='news')} {foreach $lists as $k=>$v} {foreach $v['news_item'] as $kk=>$vv} {if($kk>0)} {/if} {/foreach} {/foreach}
    media_id title thumb_media_id show_cover_pic author digest content url content_source_url
    {$v['media_id']} {$v['news_item'][0]['title']} {$v['news_item'][0]['thumb_media_id']} {$v['news_item'][0]['show_cover_pic']} {$v['news_item'][0]['author']} {$v['news_item'][0]['digest']} {fun newstr($v['news_item'][0]['content'],30)} {$v['news_item'][0]['url']} {$v['news_item'][0]['content_source_url']}
    {$vv['title']} {$vv['thumb_media_id']} {$vv['show_cover_pic']} {$vv['author']} {$vv['digest']} {fun newstr($vv['content'],30)} {$vv['url']} {$vv['content_source_url']}
    总共{$total_count}条 {if($data['offset']>0)} {/if} {if($item_count<$total_count)} {/if}
    {else} {foreach $lists['item'] as $v} {if($v['media_id'])} {/if} {/foreach}
    media_id name update_time url
    {$v['media_id']} {$v['name']} {fun date('Y-m-d H:i:s',$v['update_time'])} {if($data['type']=='image')}{else}{$v['url']}{/if}
    总共{$total_count}条 {if($data['offset']>0)} {/if} {if($item_count<$total_count)} {/if}
    {/if}






    ================================================ FILE: app/admin/t/tpl/welcome.html ================================================ {include="style"}
    {fun JZLANG('最近更新')} {fun JZLANG('全部文章')}
    {loop table="article" orderby="addtime desc" limit="10" as="v"} {/loop}
    {fun JZLANG('标题')} {fun JZLANG('缩略图')} {fun JZLANG('更新时间')} {fun JZLANG('阅读量')}
    {fun newstr($v['title'],30)} {if($v['litpic'])}{else}无{/if} {fun formatTime($v['addtime'],'Y-m-d')} {$v['hits']}
    {php $comment = M('molds')->find(array('biaoshi'=>'comment'));/} {if($comment['isopen'])}
    {fun JZLANG('最新评论')}
    {loop table="comment" limit="10" as="v"}
    {php $user = memberInfo($v['userid']);/}

    {$user['username']} {fun JZLANG('在')} {$classtypedata[$v['tid']]['classname']} {fun JZLANG('发布了评论')}

    {fun formatTime($v['addtime'],'Y-m-d H:i:s')}
    {/loop}
    {/if}
    {fun JZLANG('版本信息')}
    {fun JZLANG('当前版本')} v{$webconf['web_version']} {fun JZLANG('项目地址')}
    {fun JZLANG('服务器')} {$_SERVER['SERVER_NAME']}
    {fun JZLANG('操作系统')} {fun php_uname('s')}
    {fun JZLANG('运行环境')} {fun php_uname()}
    {fun JZLANG('PHP版本')} {__PHP_VERSION__}
    {fun JZLANG('运行方式')} {fun php_sapi_name()}
    {fun JZLANG('上传限制')} {fun get_cfg_var ("upload_max_filesize")}
    {fun JZLANG('用户留言')}
      {loop table="message" limit="10" orderby="addtime desc" as="v"}
    • {$v['user']}

      {$v['body']}

      {fun formatTime($v['addtime'],'Y-m-d H:i:s')} {fun JZLANG('回复')}
    • {/loop}
    ================================================ FILE: app/home/c/CommentController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/08 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class CommentController extends CommonController { function index(){ //检查模块是否开启 if(!M('molds')->find(['isopen'=>1,'biaoshi'=>'comment'])){ if($this->frparam('ajax')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('评论模块未开启!'))); } Error(JZLANG('评论模块未开启!')); } if($this->frparam('go',0,false,"POST")){ if($this->islogin){ if(isset($GLOBALS['Redis'])){ $message_time = $GLOBALS['Redis']->get('message_time'); $message_num = $GLOBALS['Redis']->get('message_num'); if(!$message_time){ $message_time = time(); $message_num = 0; } if(($message_time+10*60)setex('message_time', 10 * 60, time()); } $message_num += 1; $GLOBALS['Redis']->setex('message_num', 10 * 60, $message_num); if($message_num>5 && ($message_time+10*60)>=time()){ if($this->frparam('ajax')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('您的操作过于频繁,请十分钟后再试~'))); } Error(JZLANG('您的操作过于频繁,请十分钟后再试~')); } }else{ if(!isset($_SESSION['message_time'])){ $_SESSION['message_time'] = time(); $_SESSION['message_num'] = 0; } if(($_SESSION['message_time']+10*60)10 && ($_SESSION['message_time']+10*60)>time()){ if($this->frparam('ajax')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('您的操作过于频繁,请十分钟后再试~'))); } Error(JZLANG('您的操作过于频繁,请十分钟后再试~')); } } //$w = $this->frparam(); //$w = get_fields_data($w,'comment',0); $w['tid'] = $this->frparam('tid',0,0); $w['aid'] = $this->frparam('aid',0,0); $w['zid'] = $this->frparam('zid',0,0); $w['pid'] = $this->frparam('pid',0,0); $w['body'] = $this->frparam('body',1,null); $w['reply'] = null; if(!$w['body']){ if($this->frparam('ajax')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('评论内容不能为空!'))); } Error(JZLANG('评论内容不能为空!')); } if(!$w['tid']){ if($this->frparam('ajax')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('请提交栏目ID'))); } Error(JZLANG('栏目ID不能为空!')); } //是否主帖子 if($w['zid']){ $z_userid = M('comment')->getField(['id'=>$w['zid']],'userid'); }else{ $z_userid = 0; } //是否贴中贴 if($w['pid']){ $p_userid = M('comment')->getField(['id'=>$w['pid']],'userid'); }else{ $p_userid = 0; } $about = []; if(strpos($w['body'],'[@')!==false){ $pars = '/\[@([^]]+)]/'; $res = preg_match_all($pars,$w['body'],$match); if($res){ foreach($match[0] as $k=>$v){ $w['body'] = str_replace($v,' @'.$match[1][$k].' ',$w['body']); } } foreach($match[1] as $v){ $v = format_param($v,1); $r = M('member')->getField(['username'=>$v],'id'); if($r && $r!=$z_userid && $r!=$p_userid){ $about[] = $r; } } } if($this->webconf['autocheckcomment']==1){ $w['isshow'] = 1; }else{ $w['isshow'] = 0; } $w['userid'] = $_SESSION['member']['id']; $w['likes'] = $this->frparam('star',1,0); $w['isread'] = 0; $w['zan'] = 0; $w['addtime'] = time(); $n = M('comment')->add($w); if($n){ //内容URL $molds = $this->classtypedata[$w['tid']]['molds']; if(!$w['aid']){ //栏目评论 $url = $this->classtypedata[$w['tid']]['url']; }else{ //非栏目评论 $htmlurl=M($molds)->getField(['id'=>$w['aid']],'htmlurl'); $url = get_domain().'/'.$htmlurl.'/'.$w['aid']; } //检查是否用户发布的内容,提示被评论 if($w['aid']){ $member_id=M($molds)->getField(['id'=>$w['aid']],'member_id'); if($member_id){ $task['aid'] = $n; $task['tid'] = $w['tid']; $task['userid'] = $member_id; $task['puserid'] = $this->member['id']; $task['molds'] = $molds; $task['type'] = 'comment'; $task['addtime'] = time(); $task['body'] = $w['body']; $task['url'] = $url; M('task')->add($task); } } //检查是否回复帖子 if($w['zid']){ if($z_userid){ $task['aid'] = $n; $task['tid'] = $w['tid']; $task['userid'] = $z_userid; $task['puserid'] = $this->member['id']; $task['molds'] = $molds; $task['type'] = 'comment'; $task['addtime'] = time(); $task['body'] = $w['body']; $task['url'] = $url; M('task')->add($task); } } //检查是否回复帖子 if($w['pid']){ if($p_userid && $z_userid!=$p_userid){ $task['aid'] = $n; $task['tid'] = $w['tid']; $task['userid'] = $p_userid; $task['puserid'] = $this->member['id']; $task['molds'] = $molds; $task['type'] = 'reply'; $task['addtime'] = time(); $task['body'] = $w['body']; $task['url'] = $url; M('task')->add($task); } } //检查是否@用户 if(count($about)>0){ $task = []; $task['aid'] = $n; $task['tid'] = $w['tid']; $task['molds'] = $molds; $task['type'] = 'at'; $task['addtime'] = time(); $task['body'] = $w['body']; $task['url'] = $url; $task['puserid'] = $this->member['id']; foreach ($about as $value) { $task['userid'] = $value; M('task')->add($task); } } //更改评分-将以前的评分清空 if($w['likes']!=0){ M('comment')->update('id!='.$n.' and userid='.$w['userid'],['likes'=>0]); } //评论奖励 if($this->webconf['comment_award_open']==1 && $w['tid']!=0 && $w['aid']!=0){ $award = round($this->webconf['comment_award'],2); $id = $w['aid']; $max_award = round($this->webconf['comment_max_award'],2); $member_id = M($molds)->getField(['id'=>$id],'member_id'); $molds = $this->classtypedata[$w['tid']]['molds']; //去除自己写的评论 if($member_id!=0 && $award>0 && $member_id!=$this->member['id']){ $rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$id,'msg'=>JZLANG('评论奖励')]); if(!$rr){ $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG("评论奖励")."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $v){ $all_jifen+=$v['amount']; } } if($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $id; $w['msg'] = JZLANG('评论奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } } } M($molds)->goInc(['id'=>$this->frparam('aid')],'comment_num',1); if($this->frparam('ajax')){ JsonReturn(array('code'=>0,'msg'=>JZLANG('评价成功!'),'url'=>$url)); } Success(JZLANG('评价成功!'),$url); } }else{ $referer = (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER']=='') ? U('user/index') : $_SERVER['HTTP_REFERER']; $_SESSION['return_url'] = $referer; if($this->frparam('ajax')){ JsonReturn(array('code'=>1,'msg'=>JZLANG('您未登录,请重新登录~'),'url'=>U('login/index'))); } Redirect(U('login/index')); } } } //获取评论列表 function getlist(){ //检查模块是否开启 if(!M('molds')->find(['isopen'=>1,'biaoshi'=>'comment'])){ JsonReturn(array('code'=>1,'msg'=>JZLANG('评论模块未开启!'))); } $aid = $this->frparam('aid',0,0); $tid = $this->frparam('tid',0,0); $limit = $this->frparam('limit',0,10); $page = $this->frparam('page',0,1); $comment = new Page('Comment'); $sql = "isshow=1 and pid=0 and aid=".$aid." and tid=".$tid; $data = $comment->where($sql)->orderby('likes desc,id desc')->limit($limit)->page($page)->go(); foreach($data as $k=>$v){ $data[$k]['classname'] = $v['tid'] ? $v['tid'] : $this->classtypedata[$v['tid']]; $data[$k]['article'] = !$v['aid'] ? [] : M($this->classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid'],'isshow'=>1]); $data[$k]['user'] = !$v['userid'] ? [] : M('member')->find(['id'=>$v['userid']],null,'id,username,litpic'); $data[$k]['addtime'] = formatTime($v['addtime']); $children = M('comment')->findAll(['zid'=>$v['id'],'isshow'=>1]); if($children){ foreach($children as $kk=>$vv){ $children[$kk]['classname'] = $vv['tid'] ? $vv['tid'] : $this->classtypedata[$vv['tid']]; $children[$kk]['article'] = !$vv['aid'] ? [] : M($this->classtypedata[$vv['tid']]['molds'])->find(['id'=>$vv['aid'],'isshow'=>1]); $children[$kk]['user'] = !$vv['userid'] ? [] : M('member')->find(['id'=>$vv['userid']],null,'id,username,litpic'); $children[$kk]['addtime'] = formatTime($vv['addtime']); } } $data[$k]['children'] = $children; } $count = M('comment')->getCount(['isshow'=>1,'aid'=>$aid,'tid'=>$tid]); JsonReturn(['code'=>0,'data'=>[ 'list'=>$data, 'count'=>$count, 'allpage'=>$comment->allpage, ],'msg'=>'success']); } } ================================================ FILE: app/home/c/CommonController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\lib\Controller; class CommonController extends Controller { function _init(){ if(class_exists('app\home\plugins\CommonController')){ $extCommonModel = new \app\home\plugins\CommonController($this->frparam()); if(method_exists($extCommonModel,APP_ACTION)){ $action = APP_ACTION; $extCommonModel->$action(); exit; } } //判断当前模板并引入扩展函数 $hometpl = get_template(); if(defined('TPL_PATH')){ $path = TPL_PATH; }else{ $path = APP_HOME; } $func = HOME_VIEW ? $path.HOME_VIEW.'/'.$hometpl.'/func/functions.php' : $path.'/'.$hometpl.'/func/functions.php'; if(file_exists($func)){ include_once($func); } $webconf = webConf(); $template = TEMPLATE; $this->webconf = $webconf; $this->template = $template; if($this->webconf['closeweb']){ $this->close(); } $m = 1; if(isMobile() && $webconf['iswap']==1){ $classtypedata = classTypeDataMobile(); $m = 1; }else{ $classtypedata = classTypeData(); $m = 0; } $this->classtypetree = $classtypedata; $this->classtypedata = getclasstypedata($classtypedata,$m); $this->common = Tpl_style.'common/'; $this->tpl = Tpl_style.$template.'/'; $this->frpage = $this->frparam('page',0,1); $customconf = get_custom(); $this->customconf = $customconf; if(isset($GLOBALS['Redis']) && $this->frparam('token',1)){ $member = $GLOBALS['Redis']->get($this->frparam('token',1)); if($member){ $_SESSION['member'] = json_decode($member,true); } } if(isset($_SESSION['member']) && $_SESSION['member']['id']){ $this->islogin = true; $this->member = $_SESSION['member']; if($this->webconf['isopenhomepower']==1){ if(strpos($_SESSION['member']['paction'],','.APP_CONTROLLER.',')!==false){ }else{ $action = APP_CONTROLLER.'/'.APP_ACTION; if(strpos($_SESSION['member']['paction'],','.$action.',')==false){ $ac = M('Power')->find(array('action'=>$action)); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您没有').'【'.$ac['name'].'】'.JZLANG('的权限!'),'url'=>U('Home/index')]); } Error(JZLANG('您没有').'【'.$ac['name'].'】'.JZLANG('的权限!'),U('Home/index')); } } } }else{ $this->islogin = false; } $jznav = getCache('jznav'); if(!$jznav){ $nav = M('menu')->findAll(['isshow'=>1]); $jznav = []; if($nav){ foreach($nav as $v){ $menulist = unserialize($v['nav']); foreach($menulist as $vv){ if($vv['status']==1){ $vv['url'] = $vv['tid'] ? $this->classtypedata[$vv['tid']]['url'] : $vv['gourl']; $vv['title'] = $vv['title'] ? $vv['title'] : ($vv['tid'] ? $this->classtypedata[$vv['tid']]['classname'] : ''); $jznav[$v['id']][]=$vv; } } } } setCache('jznav',$jznav); } $this->jznav = $jznav; } function close(){ if(file_exists(APP_PATH.'static/common/close.html')){ $this->display('@'.APP_PATH.'static/common/close.html'); exit; }else{ echo $this->webconf['closetip'];exit; } } function vercode(){ $w = $this->frparam('w',0,160); $h = $this->frparam('h',0,50); $n = $this->frparam('n',0,4); //frcode $name = $this->frparam('name',1,$this->frparam('code_name',1,'frcode')); $imagecode=new \Imagecode($w,$h,$n,$name,APP_PATH."frphp/extend/AdobeGothicStd-Bold.ttf"); $imagecode->imageout(); } function checklogin(){ if(!$this->islogin){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录,请重新登录!')]); } Redirect(U('login/index')); } } function multiuploads(){ $file = $this->frparam('filename',1); if(!$file){ $file = 'file'; } //检测是否允许前台上传文件 if(!$this->webconf['isopenhomeupload']){ $data['error'] = "Error: ".JZLANG("已关闭前台上传文件功能"); $data['code'] = 1004; JsonReturn($data); } if($this->webconf['onlyuserupload'] && !$this->islogin){ $data['error'] = "Error: 仅会员才可以上传!"; $data['code'] = 1005; JsonReturn($data); } if($this->webconf['onlyuserupload'] && $this->islogin){ $all = M('pictures')->findAll(['userid'=>$this->member['id']],null,'size'); $allsize = 0; foreach ($all as $v){ $allsize+=$v['size']; } $limisize = $this->member['uploadsize'] * 1024; if($limisize<=$allsize){ $data['error'] = "Error: ".JZLANG('超出会员上传文件大小!'); $data['code'] = 1006; JsonReturn($data); } } foreach($_FILES[$file]['name'] as $k=>$v){ $pix = explode('.',$v); $pix = end($pix); $fileType = webConf('fileType'); if(strpos($fileType,strtolower($pix))===false || stripos($pix,'php')!==false || stripos($pix,'phtml')!==false || stripos($pix,'phar')!==false){ $data['error'] = "Error: ".JZLANG("文件类型不允许上传!"); $data['code'] = 1002; JsonReturn($data); } $fileSize = (int)webConf('fileSize'); if($fileSize!=0 && ($_FILES[$file]["size"][$k]/1024)>$fileSize){ $data['error'] = "Error: ".JZLANG("文件大小超过网站内部限制!"); $data['code'] = 1003; JsonReturn($data); } if(isset($this->webconf['home_save_path'])){ //替换日期事件 $t = time(); $d = explode('-', date("Y-y-m-d-H-i-s")); $format = $this->webconf['home_save_path']; $format = str_replace("{yyyy}", $d[0], $format); $format = str_replace("{yy}", $d[1], $format); $format = str_replace("{mm}", $d[2], $format); $format = str_replace("{dd}", $d[3], $format); $format = str_replace("{hh}", $d[4], $format); $format = str_replace("{ii}", $d[5], $format); $format = str_replace("{ss}", $d[6], $format); $format = str_replace("{time}", $t, $format); if($format!=''){ //检查文件是否存在 if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){ $path = explode('/',$format); $path1 = APP_PATH; foreach($path as $v){ if($path1==APP_PATH){ if(!file_exists($path1.$v)){ mkdir($path1.$v,0777); } $path1.=$v; }else{ if(!file_exists($path1.'/'.$v)){ mkdir($path1.'/'.$v,0777); } $path1.='/'.$v; } } }else if(!file_exists(APP_PATH.$format)){ mkdir(APP_PATH.$format,0777); } $home_save_path = $format; }else{ $home_save_path = 'public/Home'; } }else{ $home_save_path = 'public/Home'; } if(isset($this->webconf['upload_file_name']) && $this->webconf['upload_file_name']){ $filename[]=$home_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix; //定义文件名 }else{ $name = urldecode($v); $name = str_ireplace(["'",'"','%','&',' '],'',$name); $name = format_param($name,6); $filename[]=$home_save_path.'/'.$name; //定义文件名 } } $response = array(); foreach ($_FILES[$file]['tmp_name'] as $k=>$v){ if(move_uploaded_file($v, $filename[$k])){ if(isset($_SESSION['member'])){ $userid = $_SESSION['member']['id']; }else{ $userid = 0; } $filesize = round(filesize(APP_PATH.$filename[$k])/1024,2); M('pictures')->add(['litpic'=>'/'.$filename[$k],'addtime'=>time(),'userid'=>$userid,'size'=>$filesize,'tid'=>$this->frparam('tid',0,0),'filetype'=>strtolower($pix),'molds'=>$this->frparam('molds',1,null),'path'=>'Home']); $response[] = '/'.$filename[$k]; }else{ $data['error'] = "Error: ".JZLANG("请检查目录")."[".$home_save_path."]".JZLANG("写入权限"); $data['code'] = 1001; JsonReturn($data); } } $data = ['code'=>0,'urls'=>$response,'msg'=>JZLANG('上传成功!')]; JsonReturn($data); } function uploads(){ $file = $this->frparam('filename',1); if(!$file){ $file = 'file'; } if ($_FILES[$file]["error"] > 0){ $data['error'] = "Error: ".JZLANG("上传错误!"); $data['code'] = 1000; }else{ // echo "Upload: " . $_FILES["file"]["name"] . "
    "; // echo "Type: " . $_FILES["file"]["type"] . "
    "; // echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
    "; // echo "Stored in: " . $_FILES["file"]["tmp_name"]; $pix = explode('.',$_FILES[$file]['name']); $pix = end($pix); //检测是否允许前台上传文件 if(!$this->webconf['isopenhomeupload']){ $data['error'] = "Error: ".JZLANG("已关闭前台上传文件功能"); $data['code'] = 1004; JsonReturn($data); } if($this->webconf['onlyuserupload'] && !$this->islogin){ $data['error'] = "Error: 仅会员才可以上传!"; $data['code'] = 1005; JsonReturn($data); } if($this->webconf['onlyuserupload'] && $this->islogin){ $all = M('pictures')->findAll(['userid'=>$this->member['id']],null,'size'); $allsize = 0; foreach ($all as $v){ $allsize+=$v['size']; } $limisize = $this->member['uploadsize'] * 1024; if($limisize<=$allsize){ $data['error'] = "Error: 超出会员上传文件大小!"; $data['code'] = 1006; JsonReturn($data); } } $fileType = webConf('fileType'); if(strpos($fileType,strtolower($pix))===false || stripos($pix,'php')!==false || stripos($pix,'phtml')!==false || stripos($pix,'phar')!==false){ $data['error'] = "Error: ".JZLANG("文件类型不允许上传!"); $data['code'] = 1002; JsonReturn($data); } $fileSize = (int)webConf('fileSize'); if($fileSize!=0 && ($_FILES[$file]["size"]/1024)>$fileSize){ $data['error'] = "Error: ".JZLANG("文件大小超过网站内部限制!"); $data['code'] = 1003; JsonReturn($data); } if(isset($this->webconf['home_save_path'])){ //替换日期事件 $t = time(); $d = explode('-', date("Y-y-m-d-H-i-s")); $format = $this->webconf['home_save_path']; $format = str_replace("{yyyy}", $d[0], $format); $format = str_replace("{yy}", $d[1], $format); $format = str_replace("{mm}", $d[2], $format); $format = str_replace("{dd}", $d[3], $format); $format = str_replace("{hh}", $d[4], $format); $format = str_replace("{ii}", $d[5], $format); $format = str_replace("{ss}", $d[6], $format); $format = str_replace("{time}", $t, $format); if($format!=''){ //检查文件是否存在 if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){ $path = explode('/',$format); $path1 = APP_PATH; foreach($path as $v){ if($path1==APP_PATH){ if(!file_exists($path1.$v)){ mkdir($path1.$v,0777); } $path1.=$v; }else{ if(!file_exists($path1.'/'.$v)){ mkdir($path1.'/'.$v,0777); } $path1.='/'.$v; } } }else if(!file_exists(APP_PATH.$format)){ mkdir(APP_PATH.$format,0777); } $home_save_path = $format; }else{ $home_save_path = 'public/Home'; } }else{ $home_save_path = 'public/Home'; } if(!isset($this->webconf['upload_file_name']) || (isset($this->webconf['upload_file_name']) && $this->webconf['upload_file_name'])){ $filename = $home_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix; }else{ $name = urldecode($_FILES[$file]['name']); $name = str_ireplace(["'",'"','%','&',' '],'',$name); $name = format_param($name,6); $filename = $home_save_path.'/'.$name; } if(move_uploaded_file($_FILES[$file]['tmp_name'],$filename)){ $data['url'] = '/'.$filename; $data['code'] = 0; if(isset($_SESSION['member'])){ $userid = $_SESSION['member']['id']; }else{ $userid = 0; } $filesize = round(filesize(APP_PATH.$filename)/1024,2); M('pictures')->add(['litpic'=>'/'.$filename,'addtime'=>time(),'userid'=>$userid,'size'=>$filesize,'tid'=>$this->frparam('tid',0,0),'filetype'=>strtolower($pix),'molds'=>$this->frparam('molds',1,null),'path'=>'Home']); }else{ $data['error'] = "Error: ".JZLANG("请检查目录")."[public/Home]".JZLANG("写入权限"); $data['code'] = 1001; } } JsonReturn($data); exit; } function qrcode(){ extendFile('phpqrcode/phpqrcode.php'); $data = $this->frparam('data',1); //$pic = 'qrcode.png'; $errorCorrectionLevel = "L"; $matrixPointSize = 6; //$value = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME']; \QRcode::png($data, false, $errorCorrectionLevel, $matrixPointSize, 2); } function get_fields(){ $molds = strtolower($this->frparam('molds',1,'message')); if($molds!='message'){ $this->checklogin(); } $tid = $this->frparam('tid'); $sql = array(); if($tid!=0){ $sql[] = " (tids like '%,".$tid.",%' or tids is null) "; } if(!M('molds')->find(['biaoshi'=>$molds])){ JsonReturn(['code'=>1,'msg'=>JZLANG('参数错误!')]); } if(in_array($molds,['level','level_group','member_group','plugins','sysconfig','ruler','molds','power','hook','layout','fields','comment','classtype'])){ JsonReturn(['code'=>1,'msg'=>JZLANG('参数错误!')]); } $id = $this->frparam('id'); if($id){ if($molds=='member'){ $data = M($molds)->find(array('id'=>$this->member['id'])); }else{ $data = M($molds)->find(array('id'=>$id)); } }else{ $data = array(); } $sql[] = " molds = '".$molds."' and ishome=1 "; $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); $l = ''; $rd = time(); // if($molds=='article'){ // $model = 'article_zdy'; // $l .= include(APP_PATH.'static/common/uediter.php'); // }else if($molds=='product'){ // $model = 'product_zdy'; // $l .= include(APP_PATH.'static/common/uediter.php'); // } foreach($fields_list as $k=>$v){ if(!array_key_exists($v['field'],$data)){ //使用默认值 $data[$v['field']] = $v['vdata']; } if($v['ismust']==1){ $must = '['.JZLANG('必填').']'; }else{ $must = ''; } switch($v['fieldtype']){ case 1: case 14: $l .= '
    '; break; case 2: $l .= '
    '; break; case 3: $model = $molds; $l .= include(APP_PATH.'static/common/uediter.php'); break; case 4: $l .= '
    '; break; case 11: $laydate = ($data[$v['field']]=='' || $data[$v['field']]==0)?time():$data[$v['field']]; $l .= '
    '; break; case 5: $rd = rand(1000,9999); if($molds=='member' && $v['field']=='litpic'){ $uploadurl = U('user/uploads'); }else{ $uploadurl = U('common/uploads'); } $l .= '
    '; if($data[$v['field']]){ $l .= ''; } $l .= '

    '; break; case 6: $rd = rand(1000,9999); $l .= '
    '; if($data[$v['field']]){ foreach(explode('||',$data[$v['field']]) as $s){ if($s!=''){ $pic = explode('|',$s); $l .= ''; } } } $l .= '
    '; break; case 7: $l .= '
    '; break; case 12: $l .= '
    '; foreach(explode(',',$v['body']) as $vv){ $s=explode('=',$vv); $l.='
    '; break; case 8: $l .= '
    '; foreach(explode(',',$v['body']) as $vv){ $s=explode('=',$vv); $l.='
    '; break; case 9: $rd = rand(1000,9999); $l .= '
    '; $l .= '

    '; break; case 10: $rd = rand(1000,9999); $l .= '
    '; if($data[$v['field']]){ foreach(explode('||',$data[$v['field']]) as $s){ if($s!=''){ $pic = explode('|',$s); $l .= ''; } } } $l .= '
    '; break; case 13: $l .= '
    '; break; case 21: $body = explode(',',$v['body']); $tid = (int)$body[0]; $biaoshi = $this->classtypedata[$tid]['molds']; $l .= '
    '; break; case 15: $l .= '
    '; if($data[$v['field']]){ foreach(explode('||',$data[$v['field']]) as $s){ if($s){ $l .= '
    '; } } } $l .= '
    '; break; case 16: $l .= '
    '; $body = explode(',',$v['body']); $biaoshi = M('molds')->getField(['id'=>$body[0]],'biaoshi'); if(!$biaoshi){ echo $v['field'].JZLANG('字段关联绑定失败,请重新绑定!');exit; } $datalist = M($biaoshi)->findAll(['isshow'=>1]); foreach($datalist as $vv){ $l.='
    '; break; case 20: $body = explode(',',$v['body']); $tid = (int)$body[0]; $biaoshi = $this->classtypedata[$tid]['molds']; $l .= '
    '; if(!$biaoshi){ echo $v['field'].JZLANG('字段关联绑定失败,请重新绑定!');exit; } $datalist = M($biaoshi)->findAll(['isshow'=>1],null,null,50); foreach($datalist as $vv){ $l.='
    '; break; } } $l.=''; //echo $l; JsonReturn(['code'=>0,'fields_list'=>$fields_list,'tpl'=>$l]); } function jizhi(){ header("HTTP/1.0 404"); $this->display($this->template.'/404'); exit; } function error($msg){ header("HTTP/1.0 404"); $this->display($this->template.'/404'); exit; } //更新session的过期时间 function updateactive(){ $cache_time = (int)webConf('cache_time'); $cache_time = $cache_time==0 ? 3600 : $cache_time; setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $cache_time); } //递增递减 function gohits(){ $id = $this->frparam('id'); $molds = strtolower($this->frparam('molds',1,'article')); $moldslist = getCache('moldslist'); if(!$moldslist){ $list = M('molds')->findAll(); $moldslist = []; foreach($list as $v){ $moldslist[]=$v['biaoshi']; } setCache('moldslist',$moldslist); } if(in_array($molds,$moldslist)){ $i = $this->frparam('num',0,1); $n = M($molds)->getField(['id'=>$id],'hits'); $num = $n+$i; M($molds)->update(['id'=>$id],['hits'=>$num]); if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>'success','data'=>$num]); }else{ echo $num; } } } } ================================================ FILE: app/home/c/ErrorController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\lib\Controller; class ErrorController extends Controller { //错误处理示例 function index($msg=''){ header("HTTP/1.0 404"); if(APP_DEBUG){ $msg = format_param($msg,1); echo JZLANG('错误信息提示').':
    '; echo $msg; }else{ echo ' 404

    404,您请求的文件不存在!

    '; } } } ================================================ FILE: app/home/c/HomeController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; use FrPHP\Extend\ArrayPage; class HomeController extends CommonController { //首页 function index(){ //检查缓存 if(stripos(REQUEST_URI,'.php')!==false && REQUEST_URI!='/index.php'){ $this->error(JZLANG('链接错误!')); } $urls = explode('/',REQUEST_URI); if(count($urls)>=2 && REQUEST_URI=='/' && REQUEST_URI=='/index.php' && REQUEST_URI=='/index.html'){ $this->error(JZLANG('链接错误!')); } $this->ishome = true; $this->display($this->template.'/index'); } //栏目 function jizhi(){ //接收前台所有的请求 $request_url = str_replace(APP_URL,'',REQUEST_URI); $position = strpos($request_url,'?'); $url = ($position!==FALSE) ? substr($request_url,0,$position) : $request_url; $url = substr($url,1,strlen($url)-1); if($url=='' || $url=='/' || $url=='index.php' || $url=='index.html'){ $this->index();exit; } $this->ishome = false; // news/123.html news-123.html news-list-123.html $url = str_ireplace('.html','',$url); //strripos if(File_TXT_HIDE && !CLASS_HIDE_SLASH){ $url = (strripos($url,'/')+1 == strlen($url)) ? substr($url,0,strripos($url,'/')) : $url; } if(!$this->webconf['islevelurl']){ //没有开启URL层级 if(strpos($url,'/')!==false){ $urls = explode('/',$url); //内容详情页 $html = $urls[0]; if(isset($urls[1])){ $id = (int)$urls[1]; if(!$id){ $this->error(JZLANG('链接错误!'));exit; } } $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); }else{ //栏目页 $this->frpage = $this->frparam('page',0,1); if(strpos($url,'-')!==false){ //检测是否为分页 $res = M('classtype')->find(array('htmlurl'=>$url,'isclose'=>0)); if(!$res){ //存在分页,取最后一个字符串 $html_x = explode('-',$url); $this->frpage = array_pop($html_x); if(!$this->frpage){ $this->error(JZLANG('链接错误!'));exit; } $html = implode('-',$html_x);//再次拼接 $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); }else{ //不是分页 } }else{ $html = $url; $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); } } }else{ //开启URL层级 //判断是否为栏目 $html=$url; $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); if(!$res){ if(strpos($url,'/')!==false){ $urls = explode('/',$url); $urls_end = array_pop($urls); if(strpos($urls_end,'-')!==false){ //分页 //存在分页,取最后一个字符串 $html_x = explode('-',$urls_end); $this->frpage = array_pop($html_x); if(!$this->frpage){ $this->error(JZLANG('链接错误!'));exit; } $urls[] = implode('-',$html_x);//再次拼接 $html = implode('/',$urls); $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); }else{ //可能是数字? $html = implode('/',$urls); $id = (int)$urls_end; if($id<0){ $this->error(JZLANG('链接错误!'));exit; } $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); } }else{ //栏目页 $this->frpage = $this->frparam('page',0,1); if(strpos($url,'-')!==false){ //检测是否为分页 //存在分页,取最后一个字符串 $html_x = explode('-',$url); $this->frpage = array_pop($html_x); if(!$this->frpage){ $this->error(JZLANG('链接错误!'));exit; } $html = implode('-',$html_x);//再次拼接 $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); }else{ $html = $url; $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); } } } } if($res){ $res['url'] = $this->classtypedata[$res['id']]['url']; $this->type = $res; //检查授权 if($res['gids']){ $gids = explode(',',$res['gids']); if(!$this->islogin){ Redirect(U('Login/index')); }else{ if(!in_array($this->member['gid'],$gids)){ Error(JZLANG('对不起,您没有访问权限!')); } } } if(isset($id)){ //默认是详情页-非详情页另做处理 $this->id = $id; $this->jizhi_details($this->id); } $children = $this->classtypedata[$res['id']]['children']['ids']; $child = []; foreach($children as $v){ if($this->classtypedata[$v]['gids']){ $gids_n = explode(',',$this->classtypedata[$v]['gids']); if($this->islogin && in_array($this->member['gid'],$gids_n)){ $child[]=$v; } }else{ $child[]=$v; } } $sql = ' isshow=1 '; $molds = $res['molds']; if($this->webconf['schedule_table']){ $tables = explode('|',$this->webconf['schedule_table']); if(in_array($molds,$tables)){ $sql.=' and addtime<='.time().' '; } } $sql .= " and (tid in (".implode(',',$child).") or tids like '%,".$this->type['id'].",%' )"; $page = new Page($molds); $jzattr = $this->frparam('attr',1); if($jzattr){ $jzattr_arr = explode('-',$jzattr); foreach ($jzattr_arr as $s){ $sql.=" and jzattr like '%,".$s.",%' "; } } //手动设置分页条数 $limit = $res['lists_num']; if($this->frparam('limit')){ $limit = $this->frparam('limit'); } $orders = 'istop desc,orders desc,addtime desc,id desc'; $ot = $this->frparam('orders') ? $this->frparam('orders') : $res['orderstype']; switch($ot){ case 1: $orders = 'istop desc,orders desc,addtime desc,id desc'; break; case 2: $orders = 'istop desc,orders desc,id asc'; break; case 3: $orders = 'istop desc,orders asc'; break; case 4: $orders = 'istop desc,addtime desc'; break; case 5: $orders = 'istop desc,id asc'; break; case 6: $orders = 'istop desc,hits desc'; break; case 7: $orders = 'istop desc,addtime asc'; break; } $limit = $limit<=0 ? 15 : $limit; $this->currentpage = $this->frpage; $data = $page->where($sql)->orderby($orders)->limit($limit)->page($this->frpage)->go(); $pages = $page->pageList(5,'-'); $this->pages = $pages;//组合分页 foreach($data as $k=>$v){ if(!isset($v['url'])){ $data[$k]['url'] = gourl($v,$v['htmlurl']); } $data[$k]['class_name'] = $this->type['classname']; $data[$k]['class_url'] = $this->type['url']; $data[$k]['class_litpic'] = $this->type['litpic']; $data[$k]['format_addtime'] = $v['addtime'] ? date('Y-m-d H:i:s',$v['addtime']) : ''; } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 //清空screen筛选 if(isset($GLOBALS['Redis'])){ if($GLOBALS['Redis']->get('screen')){ $GLOBALS['Redis']->setex('screen',0,''); } }else if(session_id()){ if(isset($_SESSION['screen'])){ $_SESSION['screen'] = null; } }else{ if(isset($_COOKIE['screen'])){ setcookie('screen','',-1,'/'); } } $this->filters = []; if($this->frparam('ajax') && $this->webconf['isajax']){ if($this->frparam('ajax_tpl')){ $this->display($this->template.'/'.$res['molds'].'/ajax_list_'.$res['lists_html']); exit; } $sql = []; //$sql[] = " tids like '%,".$res['id'].",%' "; $sql[] = " molds = '".$res['molds']."' and isshow=1 "; $sql[] = " isajax=0 ";//查询出不允许访问的字段,进行限制 $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ $noallow = []; foreach($fields_list as $v){ $noallow[]=$v['field']; } $newdata = []; foreach($data as $v){ foreach($v as $kk=>$vv){ if(in_array($kk,$noallow)){ unset($v[$kk]); } } $newdata[]=$v; } $data = $newdata; } JsonReturn(['code'=>0,'data'=>$data,'type'=>$res,'sum'=>$this->sum,'allpage'=>$this->allpage]); } $classtypetree = array_reverse($this->classtypetree); $isgo = false; $newarray = []; $parent = [];//标记父类 $istop = false; foreach($classtypetree as $k=>$v){ if($v['id']==$res['id'] && !$isgo){ $isgo = true; $res['level'] = $v['level']; $newarray[]=$v; } if($v['id']==$res['id'] && $v['level']==0){ break; } if($v['level']==0 && $v['id']!=$res['id'] && $v['id']!=$res['pid']){ if(!$istop && $isgo && $parent['level']!=0){ $newarray[]=$v; $istop = true; } $isgo = false; } if($isgo && $v['id']!=$res['id'] && $res['level']>$v['level'] ){ if($parent['pid']){ if($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){ $newarray[]=$v; $parent = $v; } }else{ $newarray[]=$v; $parent = $v; } } } $newarray2 = array_reverse($newarray); $positions=''.JZLANG('首页').''; foreach($newarray2 as $v){ $positions.=' > '.$v['classname'].''; } $this->positions_data = $newarray2; $this->positions = $positions; if(!$res['lists_html']){ $lists_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'list_html'); $res['lists_html'] = str_replace('.html','',$lists_html); } $this->display($this->template.'/'.$res['molds'].'/'.$res['lists_html']); }else{ //进入自定义页面 /** 规定自定义页面的文件名跟访问的URL名相同,存放在page文件夹下面 **/ //html $url = ($position!==FALSE) ? substr($request_url,0,$position) : $request_url; $url = substr($url,1,strlen($url)-1); $html = str_ireplace('.html','',$url); if(defined('TPL_PATH')){ $path = TPL_PATH; }else{ $path = APP_HOME; } $filepath = HOME_VIEW ? $path.'/'.HOME_VIEW.'/'.TEMPLATE.'/page/'.$html.File_TXT : $path.'/'.TEMPLATE.'/page/'.$html.File_TXT; if(file_exists(APP_PATH.$filepath)){ $this->display($this->template.'/page/'.$html); exit; } if(file_exists(str_replace(File_TXT,'.html',APP_PATH.$filepath))){ $this->display($this->template.'/page/'.$html); exit; } //错误页面->404 $this->error(JZLANG('输入url错误!')); exit; } } //自由定义链接 function auto_url(){ $html = $this->frparam('html',1); $molds = $this->frparam('molds',1); $id = $this->frparam('id'); $tid = $this->frparam('tid'); $isclass = true; if($id && $html){ //详情页+html $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); if(!$res){ $this->error(JZLANG('链接错误!'));} $isclass = false; }else if($id && $tid){ //详情页 $res = M('classtype')->find(array('id'=>$tid,'isclose'=>0)); if(!$res){ $this->error(JZLANG('链接错误!'));} $isclass = false; }else if($tid){ //栏目页 $res = M('classtype')->find(array('id'=>$tid,'isclose'=>0)); if(!$res){ $this->error(JZLANG('链接错误!'));} }else if($molds && $id){ $tables = explode('|',$this->webconf['search_table']); if(!in_array(strtolower($molds),$tables)){ $this->error('链接错误!'); } //默认是详情页-非详情页另做处理 $this->id = $id; $tid = M($molds)->getField(['id'=>$id],'tid'); if(!$tid){ $this->error('链接错误!'); } $this->type = $this->classtypedata[$tid]; $this->jizhi_details($this->id); }else{ //html只有栏目页 $res = M('classtype')->find(array('htmlurl'=>$html,'isclose'=>0)); if(!$res){ $this->error(JZLANG('链接错误!'));} } $res['url'] = $this->classtypedata[$res['id']]['url']; $this->type = $res; //检查授权 if($res['gids']){ $gids = explode(',',$res['gids']); if(!$this->islogin){ Redirect(U('Login/index')); }else{ if(!in_array($this->member['gid'],$gids)){ Error(JZLANG('对不起,您没有访问权限!')); } } } if($isclass){ $children = $this->classtypedata[$res['id']]['children']['ids']; $child = []; foreach($children as $v){ if($this->classtypedata[$v]['gids']){ $gids_n = explode(',',$this->classtypedata[$v]['gids']); if($this->islogin && in_array($this->member['gid'],$gids_n)){ $child[]=$v; } }else{ $child[]=$v; } } $sql = ' isshow=1 '; $molds = $res['molds']; if($this->webconf['schedule_table']){ $tables = explode('|',$this->webconf['schedule_table']); if(in_array($molds,$tables)){ $sql.= ' and addtime<='.time().' '; } } $sql .= ' and tid in ('.implode(',',$child).') '; $page = new Page($molds); //手动设置分页条数 $limit = $res['lists_num']; if($this->frparam('limit')){ $limit = $this->frparam('limit'); } $this->currentpage = $this->frpage; $data = $page->where($sql)->orderby('istop desc,orders desc,id desc')->limit($limit)->page($this->frpage)->go(); $pages = $page->pageList(5,'-'); $this->pages = $pages;//组合分页 foreach($data as $k=>$v){ if(isset($v['htmlurl']) && !isset($v['url'])){ $data[$k]['url'] = gourl($v,$v['htmlurl']); } $data[$k]['class_name'] = $this->type['classname']; $data[$k]['class_url'] = $this->type['url']; $data[$k]['class_litpic'] = $this->type['litpic']; $data[$k]['format_addtime'] = $v['addtime'] ? date('Y-m-d H:i:s',$v['addtime']) : ''; } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 //清空screen筛选 if(isset($GLOBALS['Redis'])){ if($GLOBALS['Redis']->get('screen')){ $GLOBALS['Redis']->setex('screen',0,''); } }else if(session_id()){ if(isset($_SESSION['screen'])){ $_SESSION['screen'] = null; } }else{ if(isset($_COOKIE['screen'])){ setcookie('screen','',-1,'/'); } } $this->filters = []; if($this->frparam('ajax') && $this->webconf['isajax']){ if($this->frparam('ajax_tpl')){ $this->display($this->template.'/'.$res['molds'].'/ajax_list_'.$res['lists_html']); exit; } $sql = []; //$sql[] = " tids like '%,".$res['id'].",%' "; $sql[] = " molds = '".$res['molds']."' and isshow=1 "; $sql[] = " isajax=0 ";//查询出不允许访问的字段,进行限制 $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ $noallow = []; foreach($fields_list as $v){ $noallow[]=$v['field']; } $newdata = []; foreach($data as $v){ foreach($v as $kk=>$vv){ if(in_array($kk,$noallow)){ unset($v[$kk]); } } $newdata[]=$v; } $data = $newdata; } JsonReturn(['code'=>0,'data'=>$data,'type'=>$res,'sum'=>$this->sum,'allpage'=>$this->allpage]); } //面包屑导航 $classtypetree = array_reverse($this->classtypetree); $isgo = false; $newarray = []; $parent = [];//标记父类 $istop = false; foreach($classtypetree as $k=>$v){ if($v['id']==$res['id'] && !$isgo){ $isgo = true; $res['level'] = $v['level']; $newarray[]=$v; } if($v['id']==$res['id'] && $v['level']==0){ break; } if($v['level']==0 && $v['id']!=$res['id'] && $v['id']!=$res['pid']){ if(!$istop && $isgo && $parent['level']!=0){ $newarray[]=$v; $istop = true; } $isgo = false; } if($isgo && $v['id']!=$res['id'] && $res['level']>$v['level'] ){ if($parent['pid']){ if($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){ $newarray[]=$v; $parent = $v; } }else{ $newarray[]=$v; $parent = $v; } } } $newarray2 = array_reverse($newarray); $positions=''.JZLANG('首页').''; foreach($newarray2 as $v){ $positions.=' > '.$v['classname'].''; } $this->positions_data = $newarray2; $this->positions = $positions; if(!$res['lists_html']){ $lists_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'list_html'); $res['lists_html'] = str_replace('.html','',$lists_html); } $this->display($this->template.'/'.$res['molds'].'/'.$res['lists_html']); }else{ //默认是详情页-非详情页另做处理 $this->id = $id; $this->jizhi_details($this->id); } } //详情 function jizhi_details($id){ if(!$id){ $this->error(JZLANG('缺少ID!')); } if(isset($_SESSION['admin']) && $_SESSION['admin']['id']!=0){ $details = M($this->type['molds'])->find(array('id'=>$id,'tid'=>$this->type['id'])); }else{ $details = M($this->type['molds'])->find(array('id'=>$id,'isshow'=>1,'tid'=>$this->type['id'])); } if(!$details){ $this->error(JZLANG('未找到相应内容!')); exit; } if(!isset($details['url'])){ $details['url'] = gourl($details,$details['htmlurl']); } if(array_key_exists('body',$details)){ $con = $details['body']; $chains = M('chain')->findAll(['isshow'=>1]); if($chains){ foreach($chains as $v){ $url = $v['url']; $num = $v['num']; $name = $v['title']; $newname = $v['newtitle']!='' ? $v['newtitle'] : $name; if($url!=''){ $astr = "".$newname.""; }else{ $astr = $newname; } $con = preg_replace( '|(]*?)('.$name.')([^>]*?\=)([^>]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con); $con = preg_replace( '|(]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3', $con); $con = preg_replace( '|(]*?)('.$name.')([^>]*?>)(<[^<]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con); $con = str_replace_limit($name, $astr, $con, $num); $con = str_replace('%&&&&&%', $newname, $con); } } $details['body'] = $con; } $details['class_name'] = $this->type['classname']; $details['class_url'] = $this->type['url']; $details['class_litpic'] = $this->type['litpic']; $details['format_addtime'] = $details['addtime'] ? date('Y-m-d H:i:s',$details['addtime']) : ''; $this->jz = $details; $is_schedule = false; if($this->webconf['schedule_table']){ $tables = explode('|',$this->webconf['schedule_table']); if(in_array($this->type['molds'],$tables)){ $is_schedule = true; } } if($is_schedule){ $aprev_sql = ' id<'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') and addtime<='.time(); $anext_sql = ' id>'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') and addtime<='.time(); }else{ $aprev_sql = ' id<'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') '; $anext_sql = ' id>'.$id.' and isshow=1 and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') '; } $aprev = M($this->type['molds'])->find($aprev_sql,'id desc'); $anext = M($this->type['molds'])->find($anext_sql,'id asc'); if($aprev){ $aprev['url'] = gourl($aprev,$aprev['htmlurl']); } if($anext){ $anext['url'] = gourl($anext,$anext['htmlurl']); } $this->aprev = $aprev; $this->anext = $anext; //面包屑导航 $classtypetree = array_reverse($this->classtypetree); $isgo = false; $newarray = []; $parent = [];//标记父类 $istop = false; foreach($classtypetree as $k=>$v){ if($v['id']==$this->type['id'] && !$isgo){ $isgo = true; $this->type['level'] = $v['level']; $newarray[]=$v; } if($v['id']==$this->type['id'] && $v['level']==0){ break; } if($v['level']==0 && $v['id']!=$this->type['id'] && $v['id']!=$this->type['pid']){ if(!$istop && $isgo && $parent['level']!=0){ $newarray[]=$v; $istop = true; } $isgo = false; } if($isgo && $v['id']!=$this->type['id'] && $this->type['level']>$v['level'] ){ if($parent['pid']){ if($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){ $newarray[]=$v; $parent = $v; } }else{ $newarray[]=$v; $parent = $v; } } } $newarray2 = array_reverse($newarray); $positions=''.JZLANG('首页').''; foreach($newarray2 as $v){ $positions.=' > '.$v['classname'].''; } $this->positions_data = $newarray2; $this->positions = $positions; if($this->frparam('ajax') && $this->webconf['isajax'] ){ $sql = []; $sql[] = " tids like '%,".$details['tid'].",%' "; $sql[] = " molds = '".$this->type['molds']."' and isshow=1 "; $sql[] = " isajax=0 ";//查询出不允许访问的字段,进行限制 $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ $noallow = []; foreach($fields_list as $v){ $noallow[]=$v['field']; } foreach($details as $kk=>$vv){ if(in_array($kk,$noallow)){ unset($details[$kk]); unset($aprev[$kk]); unset($anext[$kk]); } } } JsonReturn(['code'=>0,'jz'=>$details,'prev'=>$aprev,'next'=>$anext]); } if(!$this->type['details_html']){ $details_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'details_html'); $this->type['details_html'] = str_replace('.html','',$details_html); } $this->display($this->template.'/'.$this->type['molds'].'/'.$this->type['details_html']); exit; } //搜索--单一模块搜索 function search(){ $tables = explode('|',$this->webconf['search_table']); $molds = strtolower($this->frparam('molds',6));//搜索的模块 $tid = $this->frparam('tid',6); if(in_array($molds,$tables) && $molds!=''){ $word = $this->frparam('word',6); if($word==''){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('请输入关键词搜索!')]); } Error(JZLANG('请输入关键词搜索!')); } $this->word = $word; if(strpos($tid,',')!==false){ $tid_arr = explode(',',$tid); $tids = []; foreach($tid_arr as $v){ $tids[]=format_param($v,0); } $tid = implode(',',$tids); }else{ $tid = format_param($tid,0); } $search_words = (isset($this->webconf['search_words'])&& $this->webconf['search_words']) ? explode('|',$this->webconf['search_words']) : ['title']; $sql = ' isshow=1 '; $sq = []; foreach($search_words as $v){ $sq[]= " ".$v." like '%".$word."%' "; } if(count($sq)){ $sql.=" and (".implode(' or ',$sq).") "; } if($this->frparam('isall') && $tid){ $sql.= ' and tid in ('.implode(',',$this->classtypedata[$tid]['children']['ids']).') '; }else if($tid){ $sql.=' and tid in('.$tid.') '; } if($this->webconf['schedule_table']){ $tables = explode('|',$this->webconf['schedule_table']); if(in_array($molds,$tables)){ $sql.=' and addtime<='.time().' '; } } $page = new Page($molds); $page->typeurl = 'search'; $this->currentpage = $this->frparam('page',0,1); $data = $page->where($sql)->orderby('id desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go(); $pages = $page->pageList(5,'&page='); $this->pages = $pages;//组合分页 foreach($data as $k=>$v){ if(isset($v['htmlurl']) && !isset($v['url'])){ $data[$k]['url'] = gourl($v,$v['htmlurl']); } $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : ''; $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : ''; $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : ''; $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : ''; } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax') && $this->webconf['isajax']){ if($this->frparam('ajax_tpl')){ $this->display($this->template.'/ajax_search_list'); exit; } $sql = []; $sql[] = " molds = '".$molds."' and isshow=1 "; $sql[] = " isajax=0 ";//查询出不允许访问的字段,进行限制 $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ $noallow = []; foreach($fields_list as $v){ $noallow[]=$v['field']; } $newdata = []; foreach($data as $v){ foreach($v as $kk=>$vv){ if(in_array($kk,$noallow)){ unset($v[$kk]); } } $newdata[]=$v; } $data = $newdata; } JsonReturn(['code'=>0,'data'=>$data,'lists'=>$page->listpage,'sum'=>$page->sum,'allpage'=>$page->allpage,'msg'=>'success']); } if(defined('TPL_PATH')){ $path = TPL_PATH; }else{ $path = APP_HOME; } $file = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.$this->template.'/'.strtolower($molds).'-search'.File_TXT); if(file_exists($file)){ $this->display($this->template.'/'.strtolower($molds).'-search'); exit; } if(file_exists(str_replace(File_TXT,'.html',$file))){ $this->display($this->template.'/'.strtolower($molds).'-search'); exit; } $this->display($this->template.'/search'); }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('搜索超出设定范围!')]); } Error(JZLANG('搜索超出设定范围!')); } } //多模块搜索 function searchAll(){ $tables = explode('|',$this->webconf['search_table_muti']); $molds = $this->frparam('molds',2);//搜索的模块 $tid = $this->frparam('tid',6); if($molds && is_array($molds)){ $allow_table = []; $is_schedule = false; $schedule_tables = []; if($this->webconf['schedule_table']){ $schedule_tables = explode('|',$this->webconf['schedule_table']); $is_schedule = true; } foreach($molds as $v){ if(in_array($v,$tables)){ $allow_table[]=strtolower($v); if(!in_array($v,$schedule_tables)){ $is_schedule = false; } } } if(count($allow_table)==0){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('您的搜索超出设定范围!')]); } Error(JZLANG('您的搜索超出设定范围!')); } $word = $this->frparam('word',6); if($word==''){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('请输入关键词搜索!')]); } Error(JZLANG('请输入关键词搜索!')); } $this->word = $word; if(strpos($tid,',')!==false){ $tid_arr = explode(',',$tid); $tids = []; foreach($tid_arr as $v){ $tids[]=format_param($v,0); } $tid = implode(',',$tids); }else{ $tid = format_param($tid,0); } $search_words = (isset($this->webconf['search_words_muti'])&& $this->webconf['search_words_muti']) ? explode('|',$this->webconf['search_words_muti']) : ['title']; $sql = ' isshow=1 '; $sq = []; foreach($search_words as $v){ $sq[]= " ".$v." like '%".$word."%' "; } if(count($sq)){ $sql.=" and (".implode(' or ',$sq).") "; } if($this->frparam('isall') && $tid){ $sql.= ' and tid in ('.implode(',',$this->classtypedata[$tid]['children']['ids']).') '; }else if($tid){ $sql.=' and tid in('.$tid.') '; } $sqlx = []; if(stripos($this->webconf['search_fields_muti'],'addtime')!==false && $is_schedule){ $sql.=' and addtime<='.time().' '; } foreach($allow_table as $v){ $sqlx[] = ' select '.$this->webconf['search_fields_muti'].' from '.DB_PREFIX.$v." where ".$sql; } $sql = implode(' union all ',$sqlx); $page = new Page(); $page->typeurl = 'search'; $this->currentpage = $this->frpage; $data = $page->where($sql)->setPage(['limit'=>$this->frparam('limit',0,15)])->page($this->frpage)->goSql(); foreach($data as $k=>$v){ $data[$k]['url'] = gourl($v,$v['htmlurl']); $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : ''; $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : ''; $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : ''; $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : ''; } $pages = $page->pageList(5,'&page='); $this->pages = $pages;//组合分页 $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->pagelist = $page->listpage;//分页数组-自定义分页可用 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax') && $this->webconf['isajax']){ if($this->frparam('ajax_tpl')){ $this->display($this->template.'/ajax_searchall_list'); exit; } JsonReturn(['code'=>0,'data'=>$data]); } $this->display($this->template.'/searchall'); }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'data'=>'','msg'=>JZLANG('请输入关键词搜索!')]); } Error(JZLANG('请输入关键词搜索!')); } } //错误页面 function error($msg){ $url = substr(REQUEST_URI,1); $position = strpos($url, '?'); $url = $position === false ? $url : substr($url, 0, $position); $r = M('customurl')->find(['url'=>$url]); if($r){ if(isset($this->classtypedata[$r['tid']])){ $this->type = $this->classtypedata[$r['tid']]; $this->jizhi_details($r['aid']); }else if($r['molds']=='tags'){ $param = []; $param['id'] = $r['aid']; $tags = new TagsController($param); $tags->index(); } exit; } header("HTTP/1.0 404"); $this->display($this->template.'/404'); exit; } //生成RSS function rss(){ $item = ''; //栏目item foreach($this->classtypedata as $v){ if($v['isshow']==1){ $item .= ' <![CDATA[ '.$v['classname'].' ]]> '.$v['url'].' '.$this->webconf['web_name'].' '.date("D, d M Y H:i:s ", time()) . "GMT".' '; } } //文章item $article = M('article')->findAll(['isshow'=>1]); foreach($article as $v){ $v['url'] = gourl($v); $item .= ' <![CDATA[ '.$v['title'].' ]]> '.$v['url'].' '.$this->webconf['web_name'].' '.date("D, d M Y H:i:s ", time()) . "GMT".' '; } //商品item $product = M('product')->findAll(['isshow'=>1]); foreach($product as $v){ $v['url'] = gourl($v); $item .= ' <![CDATA[ '.$v['title'].' ]]> '.$v['url'].' '.$this->webconf['web_name'].' '.date("D, d M Y H:i:s ", time()) . "GMT".' '; } $xml = ' '.$this->webconf['web_name'].' '.$this->webconf['web_desc'].' '.get_domain().' Rss Powered By jizhicms '.get_domain().'/'.$this->webconf['web_logo'].' '.$this->webconf['web_name'].' '.get_domain().' '.$item.' '; header("Content-type:application/xml"); echo $xml; } } ================================================ FILE: app/home/c/JzpayController.php ================================================ // +---------------------------------------------------------------------- // | Date:2021/01/01 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class JzpayController extends CommonController { /** 极致平台支付接口 **/ public function _init(){ parent::_init(); } //检查是否支付 private function checke_order($orderno=null){ $w['orderno'] = $orderno; $w['mchid'] = $this->webconf['jizhi_mchid']; $api = $this->webconf['jizhi_pay_url'].'/Pay/query_order'; $data = curl_http($api,$w); $res = json_decode($data,true); if($res['code']==0){ if($res['data']['ispay']==1){ return true; }else{ return false; } }else{ return false; } } //同步跳转 function return_pay(){ //记录一下支付信息 //register_log($_REQUEST,'return_pay_log'); $orderno = $this->frparam('orderno',1); $ispay = $this->frparam('ispay'); $checkpay = $this->checke_order($orderno); if($ispay==1 && $checkpay){ $paytime = $this->frparam('paytime'); $order = M('orders')->find(['orderno'=>$orderno]); if(!$order){ Error(JZLANG('支付成功,但是系统内没有找到相应的订单!').$orderno,get_domain()); } if($order['ispay']==1){ //跳转对应查询详情 //Success('支付成功!',U('User/details',['id'=>$order['id']])); $this->overpay($order['orderno']); exit; } $r = M('orders')->update(['orderno'=>$orderno],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]); //支付成功后处理... $this->overpay($order['orderno']); exit; }else{ Error(JZLANG('支付失败'),get_domain()); } } //异步跳转--只处理状态 function notify_pay(){ //记录一下支付信息 //register_log($_REQUEST,'notify_pay_log'); $orderno = $this->frparam('orderno',1); $ispay = $this->frparam('ispay'); $checkpay = $this->checke_order($orderno); if($ispay==1 && $checkpay){ $paytime = $this->frparam('paytime'); $order = M('orders')->find(['orderno'=>$orderno]); if(!$order){ //Error('支付成功,但是系统内没有找到相应的订单!No.'.$orderno); exit; } if($order['ispay']==1){ //跳转对应查询详情 //Error('已支付成功,请勿重复操作!',U('User/details',['id'=>$order['id']])); exit; } $r = M('orders')->update(['orderno'=>$orderno],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]); if($r){ //同步跳转进行查询 //Success('支付成功!',U('User/Verify',['id'=>$id])); exit; }else{ //Error('支付成功,更新系统订单状态失败!'); exit; } } } private function overpay($orderno){ $orderno = $this->frparam('orderno',1); $order = M('orders')->find(['orderno'=>$orderno]); if($orderno && $order){ $this->order = $order; $this->display($this->template.'/paytpl/overpay'); }else{ exit(JZLANG('订单号错误!')); } } } ================================================ FILE: app/home/c/LoginController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/01-2019/02 // +---------------------------------------------------------------------- namespace app\home\c; class LoginController extends CommonController { function _init(){ if(!M('molds')->find(['biaoshi'=>'member','isopen'=>1])){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('会员中心已关闭!'),'data'=>[]]); } Error(JZLANG('会员中心已关闭!')); exit; } parent::_init(); } public function index(){ //检测是否已经设置过return_url,防止多次登录覆盖 if(!isset($_SESSION['return_url'])){ $referer = (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER']=='') ? U('user/index') : $_SERVER['HTTP_REFERER']; $_SESSION['return_url'] = $referer; } if($_POST){ $data['username'] = str_replace("'",'',$this->frparam('tel',1));//进行二次过滤校验 $data['password'] = str_replace("'",'',$this->frparam('password',1)); if(!isset($this->webconf['closehomevercode']) || $this->webconf['closehomevercode']!=1){ $vercode = strtolower($this->frparam('vercode',1)); if(isset($GLOBALS['Redis'])){ if($GLOBALS['Redis']->get('login_vercode') != md5(md5($vercode))){ JsonReturn(array('code'=>1,'msg'=>JZLANG('验证码错误!'),'data'=>[])); } }else{ if(!$vercode || md5(md5($vercode))!=$_SESSION['login_vercode']){ $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('验证码错误!')); } } } $_SESSION['login_vercode'] = getRandChar(32); if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->del('login_vercode'); } if($data['username']=='' || $data['password']==''){ $xdata = array('code'=>1,'msg'=>JZLANG('账户密码不能为空!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('账户密码不能为空!')); } $where['pass'] = md5($data['password'].$data['password']); $where['tel'] = $data['username']; $res = M('member')->find($where); //unset($where['tel']); //$where['username'] = $data['username']; unset($where['pass']); $where['token'] = $data['password'];//token登录 $res1 = M('member')->find($where); $where['email'] = $data['username']; unset($where['tel']); unset($where['token']); $where['pass'] = md5($data['password'].$data['password']); $res2 = M('member')->find($where); if($res || $res1 || $res2){ if($res1){ $res = $res1; } if($res2){ $res = $res2; } unset($res['password']); //检测权限 if($res['isshow']!=1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您的账户已被冻结!'),'url'=>$_SESSION['return_url'],'data'=>['url'=>$_SESSION['return_url']]]); } Error(JZLANG('您的账户已被冻结!')); } $group = M('member_group')->find(array('id'=>$res['gid'])); if(!$group){ if($this->frparam('ajax')) { JsonReturn(['code' => 1, 'msg' => JZLANG('未找到您所在分组,请联系管理员处理!'), 'url' => $_SESSION['return_url'],'data'=>['url' => $_SESSION['return_url']]]); } Error(JZLANG('未找到您所在分组,请联系管理员处理!')); } unset($group['id']); //检测分组权限 if($group['isagree']!=1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您所在的分组被限制登录!'),'url'=>$_SESSION['return_url'],'data'=>['url' => $_SESSION['return_url']]]); } Error(JZLANG('您所在的分组被限制登录!')); } $_SESSION['member'] = array_merge($res,$group); //$_SESSION['member'] = $res; $update['logintime'] = time(); //是否记住密码登录,更新token if($this->frparam('isremember')){ $update['token'] = $_SESSION['token']; } //检查是否开启登录奖励 if($this->webconf['login_award_open']==1){ $awoard = floatval($this->webconf['login_award']); if($awoard>0){ $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); $sql = " msg = '".JZLANG('登录奖励')."' and addtime>=".$start." and addtime<".$end." and userid=".$_SESSION['member']['id']; if(!M('buylog')->find($sql)){ $w['userid'] = $_SESSION['member']['id']; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['msg'] = JZLANG('登录奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $awoard; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); if($r){ $update['jifen'] = $_SESSION['member']['jifen']+$awoard; $_SESSION['member']['jifen'] = $update['jifen']; } } } } M('member')->update(array('id'=>$res['id']),$update); //兼容ajax登录 if($this->frparam('ajax')){ if(isset($GLOBALS['Redis'])){ $token = getRandChar(32); $GLOBALS['Redis']->setex($token,7 * 86400,json_encode($_SESSION['member'],JSON_UNESCAPED_UNICODE)); JsonReturn(['code'=>0,'msg'=>JZLANG('登录成功!'),'data'=>['token'=>$token,'url'=>$_SESSION['return_url']]]); } JsonReturn(['code'=>0,'msg'=>JZLANG('登录成功!'),'url'=>$_SESSION['return_url'],'data'=>['url'=>$_SESSION['return_url']]]); } Redirect($_SESSION['return_url']); }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('账户密码错误!'),'url'=>$_SESSION['return_url'],'data'=>['url'=>$_SESSION['return_url']]]); } Error(JZLANG('账户密码错误!')); } } $token = getRandChar(32);//系统内置32位随机数,混淆前台规则猜测(MD5) $_SESSION['token'] = $token; $this->token = $token; $this->display($this->template.'/user/login'); } function register(){ if($this->webconf['isregister']==0){ Error(JZLANG('系统已关闭会员注册!')); } $_SESSION['return_url'] = U('user/index'); if($_POST){ //检查邀请链接的合法性 if($this->webconf['onlyinvite']==1){ if(!M('member')->find(['id'=>$this->frparam('pid'),'isshow'=>1])){ $xdata = array('code'=>1,'msg'=>JZLANG('您的邀请链接不合法!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('您的邀请链接不合法!')); } } if(!isset($this->webconf['closehomevercode']) || $this->webconf['closehomevercode']!=1){ $vercode = strtolower($this->frparam('vercode',1)); if(isset($GLOBALS['Redis'])){ if($GLOBALS['Redis']->get('reg_vercode')!=md5(md5($vercode))){ JsonReturn(['code'=>1,'msg'=>JZLANG('验证码错误!'),'data'=>[]]); } }else{ if(!$vercode || md5(md5($vercode))!=$_SESSION['reg_vercode']){ $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('验证码错误!')); } } } $_SESSION['reg_vercode'] = getRandChar(32); if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->del('reg_vercode'); } $w['email'] = $this->frparam('email',1,''); $w['password'] = $this->frparam('password',1); $w['repassword'] = $this->frparam('repassword',1); $w['tel'] = $this->frparam('tel',1); if($w['password']=='' || $w['tel']==''){ $xdata = array('code'=>1,'msg'=>JZLANG('账户密码不能为空!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('账户密码不能为空!')); } if($w['password']!=$w['repassword']){ $xdata = array('code'=>1,'msg'=>JZLANG('两次密码不同!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('两次密码不同!')); } if($w['tel']){ if (preg_match("/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[0-9])\\d{8}$/", $w['tel'])) { }else { if ($this->frparam('ajax')) { JsonReturn(['code' => 1, 'msg' => JZLANG('手机号格式不正确!'),'data'=>[]]); } Error(JZLANG('手机号格式不正确!')); } } $w['regtime'] = time(); //检查邮箱 if($w['email']){ if(M('member')->find(['email'=>$w['email']])){ $xdata = array('code'=>1,'msg'=>JZLANG('您的邮箱已注册!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('您的邮箱已注册!')); } } //检查是否已被注册 if(M('member')->find(['tel'=>$w['tel']])){ $xdata = array('code'=>1,'msg'=>JZLANG('您的手机号码已注册!'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('您的手机号码已注册!')); } $w['username'] = getRandChar(6); $w['pass'] = md5(md5($w['password']).md5($w['password'])); $w['pid'] = $_SESSION['invite']; $r = M('member')->add($w); if($r){ $userid = $r; //检查是否开启邀请奖励 if($this->webconf['invite_award_open']==1 && $w['pid'] && $this->webconf['invite_award']){ $ww['userid'] = $w['pid']; $ww['buytype'] = $this->webconf['invite_type']; $ww['type'] = 3; $ww['msg'] = JZLANG('邀请奖励'); $ww['addtime'] = time(); $ww['orderno'] = 'No'.date('YmdHis'); $ww['amount'] = $this->webconf['invite_award']; if($ww['buytype']=='jifen'){ $ww['money'] = $ww['amount']/($this->webconf['jifen_exchange']); }else{ $ww['money'] = $ww['amount']/($this->webconf['money_exchange']); } M('member')->goInc(['id'=>$w['pid']],$ww['buytype'],$ww['amount']); M('buylog')->add($ww); } //自动登录 if($this->frparam('autologin')){ $member = M('member')->find(['id'=>$userid]); $member_group = M('member_group')->find(['id'=>$member['gid']]); if($member_group['isagree']!=1){ $xdata = array('code'=>1,'msg'=>JZLANG('注册成功,等待审核!'),'url'=>U('login/index')); }else{ unset($member['pass']); unset($member_group['id']); $_SESSION['member'] = array_merge($member,$member_group); if(isset($GLOBALS['Redis'])){ $token = getRandChar(32); $GLOBALS['Redis']->setex($token,7 * 86400,json_encode($_SESSION['member'],JSON_UNESCAPED_UNICODE)); JsonReturn(['code'=>0,'msg'=>'注册成功!','data'=>['token'=>$token,'url'=>U('user/index')]]); } $xdata = array('code'=>0,'msg'=>JZLANG('注册成功!'),'data'=>['url'=>U('user/index')],'url'=>U('user/index')); } if($this->frparam('ajax')){ JsonReturn($xdata); } Success($xdata['msg'],$xdata['url']); }else{ $xdata = array('code'=>0,'msg'=>JZLANG('注册成功!'),'data'=>['url'=>U('login/index')],'url'=>U('login/index')); if($this->frparam('ajax')){ JsonReturn($xdata); } Success(JZLANG('注册成功!'),U('login/index')); } }else{ $xdata = array('code'=>1,'msg'=>JZLANG('注册失败,请重试~'),'data'=>[]); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('注册失败,请重试~')); } } $invite = $this->frparam('invite',0,0); if(!$invite){ if($this->webconf['onlyinvite']==1){ Error(JZLANG('必须通过邀请链接进行注册!')); } }else{ //检查邀请链接的合法性 if(!M('member')->find(['id'=>$invite,'isshow'=>1])){ if($this->webconf['onlyinvite']==1){ Error(JZLANG('您的邀请链接不合法!')); } $invite = 0; } } $_SESSION['invite'] = $invite; $this->invite = $invite; $this->display($this->template.'/user/register'); } function forget(){ if($_POST && !isset($_POST['reset'])){ $email = $this->frparam('email',1); $vercode = strtolower($this->frparam('vercode',1)); if(!$email){ Error(JZLANG('请输入账号和邮箱!')); } if($_SESSION['forget_code']!=md5(md5($vercode))){ Error(JZLANG('图形验证码错误!')); } $user = M('member')->find(['email'=>$email]); if($user){ //生成随机秘钥 $w['logintime'] = time(); $w['token'] = getRandChar(32); M('member')->update(['id'=>$user['id']],$w); //发送邮件 if($this->webconf['email_server'] && $this->webconf['email_port'] && $this->webconf['send_email'] && $this->webconf['send_pass']){ $title = JZLANG('找回密码').'-'.$this->webconf['web_name']; $url = U('login/forget').'?token='.$w['token'].'&email='.$email; $body = JZLANG('您的账号正在进行找回密码操作,如果确定是本人操作,请在10分钟内点击').'['.JZLANG('立即找回密码').'],'.JZLANG('过期失效!'); send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$user['email'],$title,$body); if(!isset($_SESSION['forget_time'])){ $_SESSION['forget_time'] = time(); $_SESSION['forget_num'] = 0; } if(($_SESSION['forget_time']+10*60)5 && ($_SESSION['forget_time']+10*60)>time()){ //$this->error('您操作过于频繁,请10分钟后再尝试!'); if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁,请10分钟后再尝试!'),'data'=>[]]); } Error(JZLANG('您操作过于频繁,请10分钟后再尝试!')); } Success(JZLANG('找回密码邮件已发送,请到您的邮箱查看!'),get_domain()); }else{ Error(JZLANG('邮箱服务器未配置,无法发送邮件,请联系管理员找回密码!')); } }else{ Error(JZLANG('输入的信息有误!')); } } if(!isset($_POST['reset']) && $this->frparam('token',1) && $this->frparam('email',1)){ //检查token是否正确 if($this->frparam('token',1)!='' && $this->frparam('email',1)!=''){ $user = M('member')->find(['token'=>$this->frparam('token',1),'email'=>$this->frparam('email',1)]); if($user){ //检查是否已过期 $t = (time()-$user['logintime'])/60; if($t>10){ Error(JZLANG('token已失效!'),U('login/forget')); } $this->user = $user; $this->display($this->template.'/user/reset_password'); exit; } } } if($_POST && isset($_POST['reset'])){ $w['token'] = $this->frparam('reset',1); $w['username'] = $this->frparam('username',1); $pass = $this->frparam('password',1); if($w['token']!='' && $w['username']!='' && $pass!=''){ $user = M('member')->find($w); if(!$user){ Error(JZLANG('参数错误!'),U('login/forget')); } $pass = md5(md5($pass).md5($pass)); if(M('member')->update(['id'=>$user['id']],['pass'=>$pass])){ Success(JZLANG('密码重置成功,请重新登录!'),get_domain()); }else{ Error(JZLANG('新密码不能与旧密码相同!')); } } } $this->display($this->template.'/user/forget'); } function mforget(){ $params = $this->frparam(); if(!$params){ JsonReturn(['code'=>1,'msg'=>'数据异常','data'=>[]]); } $account = format_param($params['account'],6); $vercode = format_param($params['vercode'],6); if(!$account){ JsonReturn(['code'=>1,'msg'=>JZLANG('请输入账号/邮箱!'),'data'=>[]]); } $type = (int)$params['type']; switch ($type){ //发生认证码 case 1: $forget_code = $GLOBALS['Redis']->get('forget_code'); if(!$forget_code || $forget_code!=md5(md5($vercode))){ JsonReturn(['code'=>1,'msg'=>JZLANG('图形验证码错误!'),'data'=>[]]); } $GLOBALS['Redis']->del('forget_code'); if(stripos($account,'@')!==false){ //邮箱 $user = M('member')->find(['email'=>$account]); if($user){ //检查是否发送通知,通知是否过期 if($user['ishassend']){ $t = time() - $user['hassendtime']; if($t<600){ JsonReturn(['code'=>1,'msg'=>JZLANG('邮箱已发送,请10分钟后再发送!'),'data'=>[]]); } } //生成随机秘钥 $w['hassendtime'] = time(); $w['ishassend'] = 1; $w['token'] = mt_rand(100000,999999); M('member')->update(['id'=>$user['id']],$w); //发送邮件 if($this->webconf['email_server'] && $this->webconf['email_port'] && $this->webconf['send_email'] && $this->webconf['send_pass']){ $title = JZLANG('找回密码').'-'.$this->webconf['web_name']; //$url = U('login/forget').'?token='.$w['token'].'&email='.$email; $body = JZLANG('您的账号正在进行找回密码操作,如果确定是本人操作,请在10分钟内输入认证码:').''.$w['token'].''; send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$user['email'],$title,$body); JsonReturn(['code'=>0,'msg'=>JZLANG('认证码已发送,请到您的邮箱查看!'),'data'=>[]]); }else{ JsonReturn(['code'=>1,'msg'=>JZLANG('邮箱服务器未配置,无法发送邮件,请联系管理员找回密码!'),'data'=>[]]); } }else{ JsonReturn(['code'=>1,'msg'=>JZLANG('用户未找到!'),'data'=>[]]); } }else{ //手机短信 $account = intval($account); if(strlen($account)==11){ //邮箱 $user = M('member')->find(['tel'=>$account]); if(!$user){ JsonReturn(['code'=>1,'msg'=>JZLANG('用户未找到!'),'data'=>[]]); } JsonReturn(['code'=>0,'msg'=>JZLANG('短信已发送成功!'),'data'=>[]]); }else{ JsonReturn(['code'=>1,'msg'=>JZLANG('手机号格式错误!'),'data'=>[]]); } } break; case 2: $token = intval($params['code']); if(!$token){ JsonReturn(['code'=>1,'msg'=>JZLANG('认证码不能为空!'),'data'=>[]]); } if(stripos($account,'@')!==false){ //邮箱 $user = M('member')->find(['email'=>$account,'token'=>$token]); }else{ $account = intval($account); if(strlen($account)==11){ //邮箱 $user = M('member')->find(['tel'=>$account,'token'=>$token]); }else{ JsonReturn(['code'=>1,'msg'=>JZLANG('手机号格式错误!'),'data'=>[]]); } } if(!$user){ JsonReturn(['code'=>1,'msg'=>JZLANG('认证码错误!'),'data'=>[]]); } $t = time() - $user['hassendtime']; if($t>600){ JsonReturn(['code'=>1,'msg'=>JZLANG('认证码过期,请重新获取认证码!'),'data'=>[]]); } $token = getRandChar(32); M('member')->update(['id'=>$user['id']],['token'=>$token]); JsonReturn(['code'=>0,'msg'=>'success','data'=>['token'=>$token]]); break; case 3: $token = format_param($params['token'],6); if(!$token){ JsonReturn(['code'=>1,'msg'=>JZLANG('非法操作!'),'data'=>[]]); } $pass = format_param($params['pass'],6); $repass = format_param($params['repass'],6); if($pass!=$repass){ JsonReturn(['code'=>1,'msg'=>JZLANG('两次密码不同!'),'data'=>[]]); } $forget_code = $GLOBALS['Redis']->get('forget_code'); if(!$forget_code || $forget_code!=md5(md5($vercode))){ JsonReturn(['code'=>1,'msg'=>JZLANG('图形验证码错误!'),'data'=>[]]); } if(stripos($account,'@')!==false){ $user = M('member')->find(['token'=>$token,'email'=>$account]); }else{ $account = intval($account); $user = M('member')->find(['token'=>$token,'tel'=>$account]); } if(!$user){ JsonReturn(['code'=>1,'msg'=>JZLANG('非法操作!'),'data'=>[]]); } $pass = md5(md5($pass).md5($pass)); M('member')->update(['id'=>$user['id']],['pass'=>$pass]); JsonReturn(['code'=>0,'msg'=>JZLANG('重置密码成功!'),'data'=>[]]); break; } } function nologin(){ if($this->islogin){ Redirect(U('user/index')); } $this->display($this->template.'/user/nologin'); } function loginout(){ $_SESSION['member'] = null; $_SESSION['return_url'] = null; if($this->frparam('ajax')){ if($this->frparam('token',1) && isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->del($this->frparam('token',1)); } JsonReturn(['code'=>0,'msg'=>JZLANG('安全退出~'),'data'=>[]]); } Error(JZLANG('安全退出~'),get_domain()); } } ================================================ FILE: app/home/c/MessageController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/08 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class MessageController extends CommonController { function index(){ if($_POST){ $w = $this->frparam(); $w = get_fields_data($w,'message',0); $w['body'] = $this->frparam('body',6,'','POST'); $w['user'] = $this->frparam('user',6,'','POST'); $w['tel'] = $this->frparam('tel',6,'','POST'); $w['aid'] = $this->frparam('aid',0,0,'POST'); $w['tid'] = $this->frparam('tid',0,0,'POST'); $w['email'] = $this->frparam('email',6,'','POST'); $w['orders'] = 0; $w['istop'] = 0; $w['hits'] = 0; if($this->webconf['autocheckmessage']==1){ $w['isshow'] = 1; }else{ $w['isshow'] = 0; } if(!isset($this->webconf['messageyzm']) || $this->webconf['messageyzm']){ $vercode = strtolower($this->frparam('vercode',1)); if(isset($GLOBALS['Redis']) && $GLOBALS['Redis']->get('message_vercode')!=md5(md5($vercode))){ JsonReturn(array('code'=>1,'msg'=>JZLANG('验证码错误!'))); }else{ if (!session_id()) { if(!$vercode || md5(md5($vercode))!=$_COOKIE['message_vercode']){ $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误!').$_COOKIE['message_vercode']); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('验证码错误!').$_COOKIE['message_vercode']); } $message_vercode = getRandChar(30); $_COOKIE['message_vercode'] = $message_vercode; }else{ if(!$vercode || md5(md5($vercode))!=$_SESSION['message_vercode']){ $xdata = array('code'=>1,'msg'=>JZLANG('验证码错误!')); if($this->frparam('ajax')){ JsonReturn($xdata); } Error(JZLANG('验证码错误!')); } $_SESSION['message_vercode'] = getRandChar(30); } } if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->del('message_vercode'); } } $w['ip'] = GetIP(); $w['addtime'] = time(); if(isset($_SESSION['member'])){ $w['userid'] = $_SESSION['member']['id']; }else if(isset($GLOBALS['Redis']) && $this->frparam('token',1)){ $m = $GLOBALS['Redis']->get($this->frparam('token',1)); if($m){ $member = json_decode($m,true); $w['userid'] = $member['id']; }else{ $w['userid'] = 0; } }else{ $w['userid'] = 0; } if($this->frparam('title',6,'','POST')==''){ //$this->error('标题不能为空!'); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('标题不能为空!')]); } Error(JZLANG('标题不能为空!')); } if($w['user']==''){ //$this->error('姓名不能为空!'); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>'称呼不能为空!']); } Error(JZLANG('称呼不能为空!')); } $w['title'] = $this->frparam('title',6); //仅在存在手机号的情况进行检测手机号是否有效-可自由设置 if($w['tel']){ if(!preg_match("/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[1-9])\\d{8}$/",$w['tel'])){ //$this->error('您的手机号格式不正确!'); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您的手机号格式不正确!')]); } Error(JZLANG('您的手机号格式不正确!')); } } // 不为空检测 $sql = " molds='message' and isshow=1 "; $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ foreach($fields_list as $v){ if($v['ismust']==1){ if($w[$v['field']]==''){ if(in_array($v['fieldtype'],array(6,10))){ if($w[$v['field'].'_urls']==''){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空!')]); }else{ Error($v['fieldname'].JZLANG('不能为空!')); } } }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空!')]); }else{ Error($v['fieldname'].JZLANG('不能为空!')); } } } } } } if(isset($GLOBALS['Redis'])){ $message_time = $GLOBALS['Redis']->get('message_time'); $message_num = $GLOBALS['Redis']->get('message_num'); if(!$message_time){ $message_time = time(); $message_num = 0; } if(($message_time+10*60)setex('message_time', 10 * 60, time()); } $message_num += 1; $GLOBALS['Redis']->setex('message_num', 10 * 60, $message_num); if($message_num>5 && ($message_time+10*60)>=time()){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁,请10分钟后再尝试!')]); } Error(JZLANG('您操作过于频繁,请10分钟后再尝试!')); } }else if(session_id()){ if(!isset($_SESSION['message_time'])){ $_SESSION['message_time'] = time(); $_SESSION['message_num'] = 0; } if(($_SESSION['message_time']+10*60)5 && ($_SESSION['message_time']+10*60)>=time()){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁,请10分钟后再尝试!')]); } Error(JZLANG('您操作过于频繁,请10分钟后再尝试!')); } }else{ if(!isset($_COOKIE['message_time'])){ setcookie('message_time',time(),time()+5 * 60,'/'); setcookie('message_num',0,time()+5 * 60,'/'); } if(($_COOKIE['message_time']+10*60)5 && ($_COOKIE['message_time']+10*60)>=time()){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('您操作过于频繁,请10分钟后再尝试!')]); } Error(JZLANG('您操作过于频繁,请10分钟后再尝试!')); } } $res = M('message')->add($w); if($res){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('提交成功!我们会尽快回复您!'),'url'=>get_domain()]); } Success(JZLANG('提交成功!我们会尽快回复您!'),get_domain()); }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('提交失败,请重试!')]); } //$this->error('提交失败,请重试!'); Error(JZLANG('提交失败,请重试!')); } } } function details(){ $id = $this->frparam('id'); if(!$id){ $error = JZLANG('链接错误'); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$error]); } Error($error); } if($this->webconf['autocheckmessage']==1){ $msg = M('message')->find(['id'=>$id]); }else{ $msg = M('message')->find(['id'=>$id,'isshow'=>1]); } if(!$msg){ $error = JZLANG('留言未找到或者未审核'); if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$error]); } Error($error); } $this->data = $msg; if($this->classtypedata[$msg['tid']]){ $this->type = $this->classtypedata[$msg['tid']]; $details_html = $this->type['details_html']; }else{ $details_html = M('molds')->getField(['biaoshi'=>'message'],'details_html'); } $this->display($this->template.'/message/'.$details_html); } } ================================================ FILE: app/home/c/MypayController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/08 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class MypayController extends CommonController { /** 自主平台支付回调 **/ public function _init(){ parent::_init(); } //跳过购物车直接进行支付 public function topay(){ //创建订单 $w = []; $w['orderno'] = 'No'.date('YmdHis'); if($this->islogin){ $w['userid'] = $this->member['id']; $w['tel'] = $this->frparam('tel',1) ? $this->frparam('tel',1) : $this->member['tel']; $w['username'] = $this->frparam('username',1) ? $this->frparam('username',1) : $this->member['username']; }else{ $w['tel'] = $this->frparam('tel',1,''); $w['username'] = $this->frparam('username',1,JZLANG('匿名')); } $w['receive_username'] = $w['username']; $w['receive_tel'] = $w['tel']; $w['receive_email'] = $this->frparam('email',1); $w['receive_address'] = $this->frparam('address',1); $id = $this->frparam('id'); $tid = $this->frparam('tid'); $w['tid'] = $tid; if(!$id){ Error(JZLANG('缺少id参数!')); } if(!$tid){ Error(JZLANG('缺少tid参数!')); } $molds = $this->classtypedata[$tid]['molds']; if(!$molds){ $molds = 'product'; } $product = M($molds)->find(['id'=>$id,'isshow'=>1]); if(!$product){ Error(JZLANG('未找到商品或者已下架!')); } if(!array_key_exists('price',$product)){ Error(JZLANG('该模块缺少price价格参数!')); } $num = $this->frparam('num',0,1); if ($num<=0){ Error('数量错误!'); } $money = $product['price'] * $num; $w['addtime'] = time(); //运费 $yunfei = $this->webconf['yunfei']; if($this->islogin){ $group = M('member_group')->find(['id'=>$this->member['gid']]); //折扣 $discount = 0.00; if($group['discount_type']==1){ $discount = $group['discount']; }else if($group['discount_type']==2){ $discount = round((1-$group['discount'])*$money,2); } }else{ $discount = 0; } $w['discount'] = $discount; //tid-id-num-price $w['body'] = '||'.$product['tid'].'-'.$id.'-'.$num.'-'.$product['price'].'||'; $w['yunfei'] = $yunfei; $w['price'] = $money-$discount+$yunfei; if($w['price']<0){ $w['price'] = 0; } if($this->webconf['isopenemail']==1 && $this->frparam('ismsg')){ if($this->webconf['email_server'] && $this->webconf['email_port'] && $this->webconf['send_email'] && $this->webconf['send_pass']){ $title = JZLANG('您的订单提交成功通知').'-'.$this->webconf['web_name']; if($this->webconf['tj_msg']!=''){ $body = str_replace('{xxx}',$w['receive_username'],$this->webconf['tj_msg']); }else{ $body = JZLANG('尊敬的').$w['receive_username'].JZLANG('我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!'); } $body.='
    '.JZLANG('订单详细信息如下').':
    '; $body.=''; foreach(explode('||',$w['body']) as $v){ if($v!=''){ $d = explode('-',$v); //tid-id-num-price if($d[0]!=''){ $type = $this->classtypedata[$d[0]];//栏目 $body.=''; } } } $body.='
    '.JZLANG('主图').''.JZLANG('商品').''.JZLANG('价格').''.JZLANG('购买数量').''.JZLANG('总价').'
    '.$product['title'].''.JZLANG('¥').$d[3].JZLANG('元').''.$d[2].''.JZLANG('¥').($d[3]*$d[2]).JZLANG('元').'
    '.JZLANG('折扣').':'.JZLANG('¥').$order['discount'].JZLANG('元').'
    '.JZLANG('运费').':'.JZLANG('¥').$order['yunfei'].JZLANG('元').'
    '.JZLANG('合计').':¥'.$order['price'].'元

    '; $body.=JZLANG('收件地址').':'.$w['receive_address'].' '.JZLANG('联系电话').':'.$w['receive_tel']; if($this->webconf['shou_email']!=''){ send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body,$this->webconf['shou_email']); }else{ send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body); } } } $res = M('orders')->add($w); if($res){ $ptype = $this->frparam('ptype',0,1); $w['id'] = $res; $order = $w; //保存提交信息 $return_url = U('user/orderdetails',['orderno'=>$order['orderno']]); switch($ptype){ case 1: if($this->webconf['paytype']==0){ //线下支付 M('orders')->update(['id'=>$order['id']],['isshow'=>4,'paytype'=>JZLANG('线下支付')]); //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; if($this->islogin){ $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,我们会尽快给您发货!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!'),'url'=>U('user/orders')]); } Success(JZLANG('我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!'),U('User/orders')); }else{ //支付宝 //检查自主平台配置 if($order['ispay']==1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付!'),'url'=>$return_url]); } Error(JZLANG('订单已支付!'),$return_url); } if($this->islogin){ //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); } if(isMobile()){ //手机端 if(isWeixin()){ //微信内 $order['paytype'] = 'h5alipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]); extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $rsaPrivateKey = $this->webconf['alipay_private_key']; $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $payConfigs = $aliPay->wxPay(); $this->queryStr = http_build_query($payConfigs); $this->display($this->template.'/paytpl/alipay_in_weixin'); exit; }else{ //支付宝H5支付 $order['paytype'] = 'h5alipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]); /*** 请填写以下配置信息 ***/ extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 $rsaPrivateKey=$this->webconf['alipay_private_key']; //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 /*** 配置结束 ***/ $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $sHtml = $aliPay->mPay(); echo $sHtml;exit; } }else{ //PC $order['paytype'] = 'alipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('电脑支付宝支付')]); /*** 请填写以下配置信息 ***/ extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 $rsaPrivateKey = $this->webconf['alipay_private_key']; //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 /*** 配置结束 ***/ $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $sHtml = $aliPay->doPay(); echo $sHtml; exit; } } break; case 2: //微信 //检查自主平台配置 if($order['ispay']==1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付!'),'url'=>$return_url]); } Error(JZLANG('订单已支付!'),$return_url); } if($this->islogin){ //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); } if(isMobile()){ //手机端 if(isWeixin()){ //微信内 $order['paytype'] = 'wxpay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信内支付')]); $url = U('order/wxpay').'?'.http_build_query($order); Redirect($url); exit; }else{ //微信H5支付 $order['paytype'] = 'h5wxpay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信H5支付')]); extendFile('pay/wechat/WxpayH5Service.php'); /** 请填写以下配置信息 */ $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //微信支付申请对应的公众号的APPID $appKey = $this->webconf['wx_appsecret']; //微信支付申请对应的公众号的APP Key $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $notifyUrl = U('Mypay/wechat_notify_pay'); //付款成功后的回调地址(不要有问号) //$returnUrl = U('Mypay/check_wechat_order').'?orderno='.$order['orderno']; //付款成功后,页面跳转的地址 $returnUrl = U('order/wxh5pay').'?orderno='.$order['orderno']; //付款成功后,页面跳转的地址 $wapUrl = $_SERVER['HTTP_HOST']; //WAP网站URL地址 $wapName = $this->webconf['web_name']; //WAP 网站名 $webip = GetIP(); /** 配置结束 */ $wxPay = new \WxpayH5Service($mchid,$appid,$apiKey); $wxPay->setTotalFee($payAmount); $wxPay->setOutTradeNo($outTradeNo); $wxPay->setOrderName($orderName); $wxPay->setNotifyUrl($notifyUrl); $wxPay->setReturnUrl($returnUrl); $wxPay->setWapUrl($wapUrl); $wxPay->setWapName($wapName); $wxPay->setIp($webip); $mwebUrl= $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl); //echo "

    点击跳转至支付页面

    "; header('Location:'.$mwebUrl); exit; } }else{ //PC $order['paytype'] = 'scanwxpay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信扫码支付')]); extendFile('pay/wechat/WxpayScan.php'); //微信扫码支付 $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //微信支付申请对应的公众号的APPID $appKey = $this->webconf['wx_appsecret']; //微信支付申请对应的公众号的APP Key $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 $wxPay = new \WxpayScan($mchid,$appid,$apiKey); $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').':'.$order['orderno']; //订单标题 $notifyUrl = U('Mypay/wechat_notify_pay'); //付款成功后的回调地址(不要有问号) $payTime = time(); //付款时间 $arr = $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime); //生成二维码 $url = U('Common/qrcode').'?data='.$arr['code_url']; $this->url = $url; $this->data = $arr['code_url']; $this->payAmount = $payAmount; $this->orderno = $outTradeNo; $this->display($this->template.'/paytpl/wechat_scan'); //echo "
    "; //echo '二维码内容:'.$arr['code_url']; exit; } break; case 3: if($this->webconf['isopenqianbao']!=1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('未开启钱包支付!'),'url'=>$return_url]); } Error(JZLANG('未开启钱包支付!'),$return_url); } if(!$this->islogin){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您未登录,无法支付!'),'url'=>$return_url]); } Error(JZLANG('您未登录,无法支付!'),$return_url); } //钱包支付 $money = M('member')->getField(['id'=>$this->member['id']],'money'); $paymoney = $order['price']*$this->webconf['money_exchange']; $allmoney = $paymoney; if($money<$paymoney){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('钱包金额不足,请充值!'),'url'=>$return_url]); } Error(JZLANG('钱包金额不足,请充值!'),$return_url); } $money_x = $money-$allmoney; $paytime = time(); M('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('钱包支付')]); M('member')->goDec(['id'=>$order['userid']],'money',$allmoney); $ww['userid'] = $order['userid']; $ww['amount'] = $allmoney; $ww['money'] = $order['price']; $ww['type'] = 2; $ww['msg'] = JZLANG('钱包支付'); $ww['orderno'] = $order['orderno']; $ww['buytype'] = 'money'; $ww['addtime'] = $paytime; M('buylog')->add($ww); $_SESSION['member']['money'] = $money_x; $order['ispay'] = 1; $order['isshow'] = 2; $order['paytime'] = $paytime; $order['paytype'] = JZLANG('钱包支付'); $this->order = $order; //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,我们会尽快给您发货!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); $this->display($this->template.'/paytpl/overpay'); exit; break; case 4: if($this->webconf['isopenjifen']!=1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('未开启积分支付!'),'url'=>$return_url]); } Error(JZLANG('未开启积分支付!'),$return_url); } if(!$this->islogin){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您未登录,无法支付!'),'url'=>$return_url]); } Error(JZLANG('您未登录,无法支付!'),$return_url); } //积分支付 $jifen = M('member')->getField(['id'=>$this->member['id']],'jifen'); $payjifen = $order['price']*$this->webconf['jifen_exchange']; $allmoney = $payjifen; if($jifen<$payjifen){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('积分不足,请充值!'),'url'=>$return_url]); } Error(JZLANG('积分不足,请充值!'),$return_url); } $money_x = $jifen-$allmoney; $paytime = time(); M('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('积分兑换')]); M('member')->goDec(['id'=>$order['userid']],'jifen',$allmoney); $ww['userid'] = $order['userid']; $ww['amount'] = $allmoney; $ww['money'] = $order['price']; $ww['type'] = 2; $ww['msg'] = JZLANG('积分兑换'); $ww['orderno'] = $order['orderno']; $ww['buytype'] = 'jifen'; $ww['addtime'] = $paytime; M('buylog')->add($ww); $_SESSION['member']['jifen'] = $money_x; $order['ispay'] = 1; $order['isshow'] = 2; $order['paytime'] = $paytime; $order['paytype'] = JZLANG('积分兑换'); $this->order = $order; //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,我们会尽快给您发货!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); $this->display($this->template.'/paytpl/overpay'); exit; break; case 5: // 支付宝当面付 //检查自主平台配置 if($order['ispay']==1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付!'),'url'=>$return_url]); } Error(JZLANG('订单已支付!'),$return_url); } //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); $order['paytype'] = 'dmfalipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝当面付')]); /*** 请填写以下配置信息 ***/ extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 $rsaPrivateKey=$this->webconf['alipay_private_key']; //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 /*** 配置结束 ***/ $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $result = $aliPay->dmfPay(); $result = $result['alipay_trade_precreate_response']; if($result['code'] && $result['code']=='10000'){ $url = U('common/qrcode').'?data='.$result['qr_code']; $this->url = $url; $this->payAmount = $payAmount; $this->order = $order; $this->orderno = $order['orderno']; $this->display($this->template.'/paytpl/dmf'); exit; }else{ echo $result['msg'].' : '.$result['sub_msg']; } exit; break; case 6: if($this->islogin){ //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); } //进入第三方支付内 $order['paytype'] = $this->frparam('payname',1,JZLANG('其他平台支付')); M('orders')->update(['id'=>$order['id']],['paytype'=>$order['paytype']]); $controller = $this->frparam('c',1); $url = U($controller.'/pay').'?'.http_build_query($order); Redirect($url); break; } }else{ Error('订单创建失败!'); } } //同步跳转 function alipay_return_pay(){ extendFile('pay/alipay/AlipayServiceCheck.php'); //支付宝公钥,账户中心->密钥管理->开放平台密钥,找到添加了支付功能的应用,根据你的加密类型,查看支付宝公钥 $alipayPublicKey=$this->webconf['alipay_public_key']; $aliPay = new \AlipayServiceCheck($alipayPublicKey); //验证签名 $result = $aliPay->rsaCheck($_REQUEST); if($result===true){ //同步回调一般不处理业务逻辑,显示一个付款成功的页面,或者跳转到用户的财务记录页面即可。 //echo '

    付款成功

    '; $out_trade_no = htmlspecialchars($_GET['out_trade_no']); $out_trade_no = format_param($out_trade_no,1); $orderno = $out_trade_no; $paytime = time(); $order = M('orders')->find(['orderno'=>$orderno]); if(!$order || $_GET['total_amount']!=$order['price']){ Error(JZLANG('支付成功,但是系统内没有找到相应的订单!').$orderno,get_domain()); } if($order['ispay']==1){ //跳转对应查询详情 //Success('支付成功!',U('User/details',['id'=>$order['id']])); $this->overpay($order['orderno']); exit; } $r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]); if($r && $order['ptype']==2){ //金币充值 $this->updatemoney($order); }else if($r && $order['ptype']==3){ //积分 $this->updatejifen($order); } //支付成功后处理... $this->overpay($order['orderno']); exit; } echo '不合法的请求'; exit(); } //异步跳转--只处理状态 function alipay_notify_pay(){ extendFile('pay/alipay/AlipayServiceCheck.php'); $alipayPublicKey=$this->webconf['alipay_public_key']; $aliPay = new \AlipayServiceCheck($alipayPublicKey); //验证签名 $result = $aliPay->rsaCheck($_REQUEST,$_POST['sign_type']); if($result===true){ //处理你的逻辑,例如获取订单号$_POST['out_trade_no'],订单金额$_POST['total_amount']等 //程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h); //echo 'success';exit(); $out_trade_no = htmlspecialchars($_GET['out_trade_no']); $out_trade_no = format_param($out_trade_no,1); $orderno = $out_trade_no; $paytime = time(); $order = M('orders')->find(['orderno'=>$orderno]); if(!$order){ //Error('支付成功,但是系统内没有找到相应的订单!'.$orderno,get_domain()); exit; } if($order['ispay']==1){ //跳转对应查询详情 //Success('支付成功!',U('User/details',['id'=>$order['id']])); //$this->overpay($order['orderno']); exit; } $r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]); //检查是否金币或积分充值 if($r && $order['ptype']==2){ //金币充值 $this->updatemoney($order); }else if($r && $order['ptype']==3){ //积分 $this->updatejifen($order); } //支付成功后处理... //$this->overpay($order['orderno']); exit; } echo 'error';exit(); } public function alipay_check_order(){ /*** 请填写以下配置信息 ***/ $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写对应应用的APPID $outTradeNo = $this->frparam('orderno',1); //要查询的商户订单号。注:商户订单号与支付宝交易号不能同时为空 $tradeNo = $this->frparam('tradeno',1,NULL); //要查询的支付宝交易号。注:商户订单号与支付宝交易号不能同时为空 $signType = 'RSA2'; //签名算法类型,使用RSA2 //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 $rsaPrivateKey=$this->webconf['alipay_private_key']; extendFile('pay/alipay/AlipayService.php'); $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setRsaPrivateKey($rsaPrivateKey); //请求参数 $requestConfigs = array( 'out_trade_no'=>$outTradeNo, 'trade_no'=>$tradeNo, ); $commonConfigs = array( //公共参数 'app_id' => $appid, 'method' => 'alipay.trade.query', //接口名称 'format' => 'JSON', 'charset'=>'utf8', 'sign_type'=>'RSA2', 'timestamp'=>date('Y-m-d H:i:s'), 'version'=>'1.0', 'biz_content'=>json_encode($requestConfigs), ); $commonConfigs["sign"] = $aliPay->generateSign($commonConfigs, $commonConfigs['sign_type']); $result = $aliPay->curlPost('https://openapi.alipay.com/gateway.do?charset=utf8',$commonConfigs); $result = json_decode($result,true); $msg = ''; $code = 1; if($result['alipay_trade_query_response']['code']!='10000'){ $msg = $result['alipay_trade_query_response']['msg'].':'.$result['alipay_trade_query_response']['sub_code'].' '.$result['alipay_trade_query_response']['sub_msg']; }else{ switch($result['alipay_trade_query_response']['trade_status']){ case 'WAIT_BUYER_PAY': $msg = JZLANG('交易创建,等待买家付款'); break; case 'TRADE_CLOSED': $msg = JZLANG('未付款交易超时关闭,或支付完成后全额退款'); break; case 'TRADE_SUCCESS': $msg = JZLANG('支付成功'); $code = 0; $out_trade_no = $outTradeNo; $orderno = $out_trade_no; $paytime = time(); $order = M('orders')->find(['orderno'=>$orderno]); if($order['ispay']==1){ //跳转对应查询详情 JsonReturn(['code'=>$code,'msg'=>$msg]); } $r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]); if($r && $order['ptype']==2){ //金币充值 $this->updatemoney($order); }else if($r && $order['ptype']==3){ //积分 $this->updatejifen($order); } //支付成功后处理... //$this->overpay($order['orderno']); break; case 'TRADE_FINISHED': $msg = JZLANG('交易结束,不可退款'); break; default: $msg = JZLANG('未知状态'); break; } } JsonReturn(['code'=>$code,'msg'=>$msg]); } public function wechat_notify_pay(){ extendFile('pay/wechat/WxpayServiceCheck.php'); $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //公众号APPID 通过微信支付商户资料审核后邮件发送 $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 $wxPay = new \WxpayServiceCheck($mchid,$appid,$apiKey); $result = $wxPay->notify(); if($result){ //完成你的逻辑 //例如连接数据库,获取付款金额$result['cash_fee'],获取订单号$result['out_trade_no'],修改数据库中的订单状态等; //现金支付金额:$result['cash_fee'] //订单金额:$result['total_fee'] //商户订单号:$result['out_trade_no'] //付款银行:$result['bank_type'] //货币种类:$result['fee_type'] //是否关注公众账号:$result['is_subscribe'] //用户标识:$result['openid'] //业务结果:$result['result_code'] SUCCESS/FAIL //支付完成时间:$result['time_end'] 格式为yyyyMMddHHmmss //具体详细请看微信文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8 $out_trade_no = htmlspecialchars($result['out_trade_no']); $out_trade_no = format_param($out_trade_no,1); $orderno = $out_trade_no; $paytime = time(); $order = M('orders')->find(['orderno'=>$orderno]); if(!$order){ //Error('支付成功,但是系统内没有找到相应的订单!'.$orderno,get_domain()); exit; } if($order['ispay']==1){ //跳转对应查询详情 //Success('支付成功!',U('User/details',['id'=>$order['id']])); //$this->overpay($order['orderno']); exit; } $r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]); //检查是否金币或积分充值 if($r && $order['ptype']==2){ //金币充值 $this->updatemoney($order); }else if($r && $order['ptype']==3){ //积分 $this->updatejifen($order); } //支付成功后处理... //$this->overpay($order['orderno']); exit; }else{ echo 'pay error'; } } public function wechat_return_pay(){ $orderno = $this->frparam('orderno',1); $order = M('orders')->find(['orderno'=>$orderno]); if($orderno && $order){ extendFile('pay/wechat/WxpayServiceCheck.php'); $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //公众号APPID 通过微信支付商户资料审核后邮件发送 $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 $wxPay = new \WxpayServiceCheck($mchid,$appid,$apiKey); $result = $wxPay->notify(); if($result){ $out_trade_no = htmlspecialchars($result['out_trade_no']); $out_trade_no = format_param($out_trade_no,1); $orderno = $out_trade_no; $paytime = time(); if($order['ispay']==1){ //跳转对应查询详情 //Success('支付成功!',U('User/details',['id'=>$order['id']])); $this->overpay($order['orderno']); exit; } $r = M('orders')->update(['orderno'=>$orderno,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime]); //检查是否金币或积分充值 if($r && $order['ptype']==2){ //金币充值 $this->updatemoney($order); }else if($r && $order['ptype']==3){ //积分 $this->updatejifen($order); } //支付成功后处理... $this->overpay($order['orderno']); exit; } } exit(JZLANG('订单号错误或订单被删除!')); } public function check_wechat_order(){ extendFile('pay/wechat/WxpayCheckOrder.php'); $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //公众号APPID 通过微信支付商户资料审核后邮件发送 $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 $outTradeNo = $this->frparam('orderno',1); //要查询的订单号 $order = M('orders')->find(['orderno'=>$outTradeNo]); if($outTradeNo && $order){ if($order['ispay']==1){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>'success']); } $this->overpay($outTradeNo);exit; } /** 配置结束 */ $wxPay = new \WxpayCheckOrder($mchid,$appid,$apiKey); $res = $wxPay->orderquery($outTradeNo); //echo json_encode($result);die; //$res = json_encode($result); if($res['code']==0){ $r = M('orders')->update(['orderno'=>$outTradeNo,'ispay'=>0],['ispay'=>1,'isshow'=>2,'paytime'=>time()]); //检查是否金币或积分充值 if($r && $order['ptype']==2){ //金币充值 $this->updatemoney($order); }else if($r && $order['ptype']==3){ //积分 $this->updatejifen($order); } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>'success']); } $this->overpay($outTradeNo); }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$res['msg']]); } Error($res['msg'],U('Order/details',['orderno'=>$outTradeNo])); } } } private function updatejifen($order){ if($order && $order['ptype']==3){ M('member')->goInc(['id'=>$order['userid']],'jifen',$order['jifen']); $ww['userid'] = $order['userid']; $ww['amount'] = $order['jifen']; $ww['money'] = $order['price']; $ww['type'] = 1; $ww['msg'] = JZLANG('在线充值'); $ww['orderno'] = $order['orderno']; $ww['buytype'] = 'jifen'; $ww['addtime'] = time(); M('buylog')->add($ww); } return true; } private function updatemoney($order){ if($order && $order['ptype']==2){ M('member')->goInc(['id'=>$order['userid']],'money',$order['jifen']); $ww['userid'] = $order['userid']; $ww['amount'] = $order['jifen']; $ww['money'] = $order['price']; $ww['type'] = 1; $ww['msg'] = JZLANG('在线充值'); $ww['orderno'] = $order['orderno']; $ww['buytype'] = 'money'; $ww['addtime'] = time(); M('buylog')->add($ww); } return true; } private function overpay($orderno){ $order = M('orders')->find(['orderno'=>$orderno,'ispay'=>1]); if($orderno && $order){ $this->order = $order; $this->display($this->template.'/paytpl/overpay'); }else{ exit(JZLANG('订单未支付或订单号错误!')); } } public function wechat_scan_over(){ $orderno = $this->frparam('orderno',1); $order = M('orders')->find(['orderno'=>$orderno,'ispay'=>1]); if($orderno && $order){ $this->order = $order; $this->display($this->template.'/paytpl/overpay'); }else{ exit(JZLANG('订单未支付或订单号错误!')); } } } ================================================ FILE: app/home/c/OrderController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/08 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class OrderController extends CommonController { function _init(){ parent::_init(); if(!$this->islogin){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录,请重新登录!')]); } Error(JZLANG('您还未登录,请重新登录!'),U('Login/index')); } } function create(){ if($this->frparam('go')){ $carts = []; if(isset($GLOBALS['Redis'])){ $carts = explode('||',$GLOBALS['Redis']->get('cart')); }else if(isset($_SESSION['cart']) && $_SESSION['cart']!=''){ $carts = explode('||',$_SESSION['cart']); } if(is_array($carts) && count($carts)>0){ $group = M('member_group')->find(['id'=>$this->member['gid']]); $new = []; $price = 0.00; $w = []; $newcart = []; $w['orderno'] = 'No'.date('YmdHis'); $w['userid'] = $this->member['id']; $w['tel'] = $this->member['tel']; $w['username'] = $this->member['username']; $w['addtime'] = time(); $qianbao = 0; $jifen = 0; foreach($carts as $v){ $d = explode('-',$v); //tid-id-num if($d[0]!='' && $d[1]!='' && $d[2]!='' && $d[2]!=0 && intval($d[2])>0){ $type = $this->classtypedata[$d[0]]; $info = M($type['molds'])->find(['id'=>$d[1]]); //tid-id-num-price $new[]=$d[0].'-'.$d[1].'-'.$d[2].'-'.$info['price']; $price+=$d[2]*$info['price']; $newcart[]=['info'=>M($type['molds'])->find(['id'=>$d[1]]),'num'=>$d[2],'price'=>$info['price'],'tid'=>$d[0]]; if(isset($info['jifen']) && $info['jifen']!=0){ $jifen+=$d[2]*$info['jifen']; }else{ $jifen+=$d[2]*$d[3]*($this->webconf['jifen_exchange']); } $qianbao+=$d[2]*$d[3]*($this->webconf['money_exchange']); } } //运费 $yunfei = $this->webconf['yunfei']; //折扣 $discount = 0.00; if($group['discount_type']==1){ $discount = $group['discount']; }else if($group['discount_type']==2){ $discount = round((1-$group['discount'])*$price,2); } $w['body'] = '||'.implode('||',$new).'||'; $w['yunfei'] = $yunfei; $w['discount'] = $discount; $w['price'] = $price-$discount+$yunfei; if($w['price']<0){ $w['price'] = 0; } $res = M('orders')->add($w); if($res){ //减库存 $allproduct = $carts; foreach($allproduct as $v){ if($v!=''){ $d = explode('-',$v); //tid-id-num-price if($d[0]!=''){ $type = $this->classtypedata[$d[0]];//栏目 $num = (int)$d[2]; $r = M($type['molds'])->goDec(['id'=>$d[1]],'stock_num',$num); } } } $_SESSION['cart'] = ''; if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->del('cart'); } $this->carts = $newcart; $this->qianbao = $qianbao+$discount*($this->webconf['money_exchange'])-$yunfei*($this->webconf['money_exchange']); $this->jifen = $jifen+$discount*($this->webconf['jifen_exchange'])-$yunfei*($this->webconf['jifen_exchange']); $this->order = M('orders')->find(['id'=>$res]); if($this->webconf['isopenjifen']==1){ M('orders')->update(['id'=>$res],['jifen'=>$this->jifen]); } if($this->webconf['isopenqianbao']==1){ M('orders')->update(['id'=>$res],['qianbao'=>$this->qianbao]); } $this->display($this->template.'/user/payment'); }else{ Error(JZLANG('创建订单失败!')); } }else{ Redirect(U('user/cart')); } }else{ Redirect(U('user/cart')); } } //支付处理 function pay(){ if($this->frparam('go')){ //保存提交信息 $return_url = U('user/orderdetails',['orderno'=>$this->frparam('orderno',1)]); $w['orderno'] = $this->frparam('orderno',1); $w['receive_username'] = $this->frparam('username',1); $w['receive_tel'] = $this->frparam('tel',1); $w['receive_email'] = $this->frparam('email',1); $w['receive_address'] = $this->frparam('address',1); $paytype = $this->frparam('paytype',0,1);//默认支付宝支付1,2微信支付 $order = M('orders')->find(['orderno'=>$w['orderno']]); if(!$order || !$w['orderno']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('订单号不存在或已被删除!'),'url'=>$return_url]); } Error(JZLANG('订单号不存在或已被删除!'),$return_url); } //购物订单 if($order['ptype']==1){ if($w['receive_username']=='' || $w['receive_tel']=='' || $w['receive_address']==''){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('收件人、手机号和收货地址不能为空!'),'url'=>$return_url]); } Error(JZLANG('收件人、手机号和收货地址不能为空!'),$return_url); } }else{ //充值订单 //检查是否支持在线支付 if($this->webconf['paytype']==0){ Error(JZLANG('未开启在线支付!'),$return_url); } } //保存信息 $res = M('orders')->update(['id'=>$order['id']],$w); //未设置在线支付 //提示接收信息邮箱 //检测是否已经配置邮件发送 if($this->webconf['isopenemail']==1 && $order['ptype']==1){ if($this->webconf['email_server'] && $this->webconf['email_port'] && $this->webconf['send_email'] && $this->webconf['send_pass']){ $title = JZLANG('您的订单提交成功通知').'-'.$this->webconf['web_name']; if($this->webconf['tj_msg']!=''){ $body = str_replace('{xxx}',$w['receive_username'],$this->webconf['tj_msg']); }else{ $body = JZLANG('尊敬的').$w['receive_username'].JZLANG('我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!'); } $body.='
    '.JZLANG('订单详细信息如下').':
    '; $body.=''; foreach(explode('||',$order['body']) as $v){ if($v!=''){ $d = explode('-',$v); //tid-id-num-price if($d[0]!=''){ $type = $this->classtypedata[$d[0]];//栏目 $product = M($type['molds'])->find(['id'=>$d[1]]); $body.=''; } } } $body.='
    '.JZLANG('主图').''.JZLANG('商品').''.JZLANG('价格').''.JZLANG('购买数量').''.JZLANG('总价').'
    '.$product['title'].''.JZLANG('¥').$d[3].JZLANG('元').''.$d[2].''.JZLANG('¥').($d[3]*$d[2]).JZLANG('元').'
    '.JZLANG('折扣').':'.JZLANG('¥').$order['discount'].JZLANG('元').'
    '.JZLANG('运费').':'.JZLANG('¥').$order['yunfei'].JZLANG('元').'
    '.JZLANG('合计').':¥'.$order['price'].'元

    '; $body.=JZLANG('收件地址').':'.$w['receive_address'].' '.JZLANG('联系电话').':'.$w['receive_tel']; if($this->webconf['shou_email']!=''){ send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body,$this->webconf['shou_email']); }else{ send_mail($this->webconf['send_email'],$this->webconf['send_pass'],$this->webconf['send_name'],$w['receive_email'],$title,$body); } } } if($this->webconf['paytype']==0 && $order['ptype']==1){ //更新订单状态,提示收到提交订单 M('orders')->update(['id'=>$order['id']],['isshow'=>4,'paytype'=>JZLANG('线下支付')]); //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,我们会尽快给您发货!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!'),'url'=>U('user/orders')]); } Success(JZLANG('我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!'),U('User/orders')); }else if($paytype==1){ //支付宝 //检查自主平台配置 if($order['ispay']==1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付!'),'url'=>$return_url]); } Error(JZLANG('订单已支付!'),$return_url); } //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); if(isMobile()){ //手机端 if(isWeixin()){ //微信内 $order['paytype'] = 'h5alipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]); extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $rsaPrivateKey = $this->webconf['alipay_private_key']; $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $payConfigs = $aliPay->wxPay(); $this->queryStr = http_build_query($payConfigs); $this->display($this->template.'/paytpl/alipay_in_weixin'); exit; }else{ //支付宝H5支付 $order['paytype'] = 'h5alipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝H5支付')]); /*** 请填写以下配置信息 ***/ extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 $rsaPrivateKey=$this->webconf['alipay_private_key']; //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 /*** 配置结束 ***/ $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $sHtml = $aliPay->mPay(); echo $sHtml;exit; } }else{ //PC $order['paytype'] = 'alipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('电脑支付宝支付')]); /*** 请填写以下配置信息 ***/ extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 $rsaPrivateKey = $this->webconf['alipay_private_key']; //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 /*** 配置结束 ***/ $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $sHtml = $aliPay->doPay(); echo $sHtml; exit; } }else if($paytype==2){ //微信 //检查自主平台配置 if($order['ispay']==1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付!'),'url'=>$return_url]); } Error(JZLANG('订单已支付!'),$return_url); } //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); if(isMobile()){ //手机端 if(isWeixin()){ //微信内 $order['paytype'] = 'wxpay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信内支付')]); $url = U('order/wxpay').'?'.http_build_query($order); Redirect($url); exit; }else{ //微信H5支付 $order['paytype'] = 'h5wxpay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信H5支付')]); extendFile('pay/wechat/WxpayH5Service.php'); /** 请填写以下配置信息 */ $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //微信支付申请对应的公众号的APPID $appKey = $this->webconf['wx_appsecret']; //微信支付申请对应的公众号的APP Key $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $notifyUrl = U('Mypay/wechat_notify_pay'); //付款成功后的回调地址(不要有问号) //$returnUrl = U('Mypay/check_wechat_order').'?orderno='.$order['orderno']; //付款成功后,页面跳转的地址 $returnUrl = U('order/wxh5pay').'?orderno='.$order['orderno']; //付款成功后,页面跳转的地址 $wapUrl = $_SERVER['HTTP_HOST']; //WAP网站URL地址 $wapName = $this->webconf['web_name']; //WAP 网站名 $webip = GetIP(); /** 配置结束 */ $wxPay = new \WxpayH5Service($mchid,$appid,$apiKey); $wxPay->setTotalFee($payAmount); $wxPay->setOutTradeNo($outTradeNo); $wxPay->setOrderName($orderName); $wxPay->setNotifyUrl($notifyUrl); $wxPay->setReturnUrl($returnUrl); $wxPay->setWapUrl($wapUrl); $wxPay->setWapName($wapName); $wxPay->setIp($webip); $mwebUrl= $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl); //echo "

    点击跳转至支付页面

    "; header('Location:'.$mwebUrl); exit; } }else{ //PC $order['paytype'] = 'scanwxpay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('微信扫码支付')]); extendFile('pay/wechat/WxpayScan.php'); //微信扫码支付 $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //微信支付申请对应的公众号的APPID $appKey = $this->webconf['wx_appsecret']; //微信支付申请对应的公众号的APP Key $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 $wxPay = new \WxpayScan($mchid,$appid,$apiKey); $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').':'.$order['orderno']; //订单标题 $notifyUrl = U('Mypay/wechat_notify_pay'); //付款成功后的回调地址(不要有问号) $payTime = time(); //付款时间 $arr = $wxPay->createJsBizPackage($payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime); //生成二维码 $url = U('Common/qrcode').'?data='.$arr['code_url']; $this->url = $url; $this->data = $arr['code_url']; $this->payAmount = $payAmount; $this->orderno = $outTradeNo; $this->display($this->template.'/paytpl/wechat_scan'); //echo "
    "; //echo '二维码内容:'.$arr['code_url']; exit; } }else if($paytype==3){ if($this->webconf['isopenqianbao']!=1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('未开启钱包支付!'),'url'=>$return_url]); } Error(JZLANG('未开启钱包支付!'),$return_url); } //钱包支付 $money = M('member')->getField(['id'=>$this->member['id']],'money'); $allmoney = $order['price']*$this->webconf['money_exchange']; if($money<$allmoney){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('钱包金额不足,请充值!'),'url'=>$return_url]); } Error(JZLANG('钱包金额不足,请充值!'),$return_url); } $money_x = $money-$allmoney; $paytime = time(); M('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('钱包支付')]); M('member')->update(['id'=>$order['userid']],['money'=>$money_x]); $ww['userid'] = $order['userid']; $ww['amount'] = $allmoney; $ww['money'] = $order['price']; $ww['type'] = 2; $ww['msg'] = JZLANG('钱包支付'); $ww['orderno'] = $order['orderno']; $ww['buytype'] = 'money'; $ww['addtime'] = $paytime; M('buylog')->add($ww); $_SESSION['member']['money'] = $money_x; $order['ispay'] = 1; $order['isshow'] = 2; $order['paytime'] = $paytime; $order['paytype'] = JZLANG('钱包支付'); $this->order = $order; //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,我们会尽快给您发货!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); $this->display($this->template.'/paytpl/overpay'); exit; }else if($paytype==4){ if($this->webconf['isopenjifen']!=1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('未开启积分支付!'),'url'=>$return_url]); } Error(JZLANG('未开启积分支付!'),$return_url); } //积分支付 $jifen = M('member')->getField(['id'=>$this->member['id']],'jifen'); $allmoney = $order['price']*$this->webconf['jifen_exchange']; //$allmoney = $order['jifen']; if($jifen<$order['jifen']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('积分不足,请充值!'),'url'=>$return_url]); } Error(JZLANG('积分不足,请充值!'),$return_url); } $money_x = $jifen-$allmoney; $paytime = time(); M('orders')->update(['id'=>$order['id']],['ispay'=>1,'isshow'=>2,'paytime'=>$paytime,'paytype'=>JZLANG('积分兑换')]); M('member')->update(['id'=>$order['userid']],['jifen'=>$money_x]); $ww['userid'] = $order['userid']; $ww['amount'] = $allmoney; $ww['money'] = $order['price']; $ww['type'] = 2; $ww['msg'] = JZLANG('积分兑换'); $ww['orderno'] = $order['orderno']; $ww['buytype'] = 'jifen'; $ww['addtime'] = $paytime; M('buylog')->add($ww); $_SESSION['member']['jifen'] = $money_x; $order['ispay'] = 1; $order['isshow'] = 2; $order['paytime'] = $paytime; $order['paytype'] = JZLANG('积分兑换'); $this->order = $order; //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,我们会尽快给您发货!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); $this->display($this->template.'/paytpl/overpay'); exit; }else if($paytype==5){ // 支付宝当面付 //检查自主平台配置 if($order['ispay']==1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('订单已支付!'),'url'=>$return_url]); } Error(JZLANG('订单已支付!'),$return_url); } //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); $order['paytype'] = 'dmfalipay'; M('orders')->update(['id'=>$order['id']],['paytype'=>JZLANG('支付宝当面付')]); /*** 请填写以下配置信息 ***/ extendFile('pay/alipay/AlipayService.php'); $appid = $this->webconf['alipay_partner']; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $returnUrl = U('Mypay/alipay_return_pay'); //付款成功后的同步回调地址 $notifyUrl = U('Mypay/alipay_notify_pay'); //付款成功后的异步回调地址 $outTradeNo = $order['orderno']; //你自己的商品订单号 $payAmount = $order['price']; //付款金额,单位:元 $orderName = JZLANG('支付订单').'-'.$order['orderno']; //订单标题 $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 $rsaPrivateKey=$this->webconf['alipay_private_key']; //商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310 /*** 配置结束 ***/ $aliPay = new \AlipayService(); $aliPay->setAppid($appid); $aliPay->setReturnUrl($returnUrl); $aliPay->setNotifyUrl($notifyUrl); $aliPay->setRsaPrivateKey($rsaPrivateKey); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $result = $aliPay->dmfPay(); $result = $result['alipay_trade_precreate_response']; if($result['code'] && $result['code']=='10000'){ $url = U('common/qrcode').'?data='.$result['qr_code']; //echo '
    '; $this->url = $url; $this->payAmount = $payAmount; $this->order = $order; $this->orderno = $order['orderno']; $this->display($this->template.'/paytpl/dmf'); exit; }else{ echo $result['msg'].' : '.$result['sub_msg']; } }else { //交易提醒 $task['aid'] = $order['id']; $task['tid'] = 0; $task['userid'] = $this->member['id']; $task['puserid'] = $this->member['id']; $task['molds'] = 'orders'; $task['type'] = 'rechange'; $task['addtime'] = time(); $task['body'] = JZLANG('您的订单').'-'.$order['orderno'].JZLANG('已经提交,请尽快支付!'); $task['url'] = U('user/orderdetails',['orderno'=>$order['orderno']]); M('task')->add($task); //进入第三方支付内 $order['paytype'] = $this->frparam('payname',1,JZLANG('其他平台支付')); M('orders')->update(['id'=>$order['id']],['paytype'=>$order['paytype']]); $controller = $this->frparam('c',1); $url = U($controller.'/pay').'?'.http_build_query($order); Redirect($url); } } } //jsapi function wxpay(){ //微信支付 extendFile('pay/wechat/WxpayService.php'); $mchid = $this->webconf['wx_mchid']; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = $this->webconf['wx_appid']; //微信支付申请对应的公众号的APPID $appKey = $this->webconf['wx_appsecret']; //微信支付申请对应的公众号的APP Key $apiKey = $this->webconf['wx_key']; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 //①、获取用户openid $wxPay = new \WxpayService($mchid,$appid,$appKey,$apiKey); $openId = $wxPay->GetOpenid(); //获取openid if(!$openId) exit(JZLANG('获取openid失败')); //②、统一下单 $outTradeNo = $this->frparam('orderno',1); //你自己的商品订单号 $payAmount = $this->frparam('price',3); //付款金额,单位:元 $orderName = JZLANG('支付订单').':'.$outTradeNo; //订单标题 $notifyUrl = U('Mypay/wechat_notify_pay'); //付款成功后的回调地址(不要有问号) $returnUrl = U('Mypay/check_wechat_order',['orderno'=>$outTradeNo]); //付款成功后的回调地址(不要有问号) $payTime = JZLANG('支付订单').'-'.$outTradeNo; //付款时间 $jsApiParameters = $wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime); $this->payAmount = $payAmount; $this->returnUrl = $returnUrl; $jsApiParameters = json_encode($jsApiParameters); $this->jsApiParameters = $jsApiParameters; $this->order = M('orders')->find(['orderno'=>$outTradeNo]); $this->display($this->template.'/paytpl/wechat_pay'); exit; } //微信h5支付验证 function wxh5pay(){ $this->orderno = $this->frparam('orderno',1); if(!$this->orderno){ Error(JZLANG('链接错误!')); } $this->display($this->template.'/paytpl/wechat_h5_pay'); exit; } } ================================================ FILE: app/home/c/ScreenController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/08 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class ScreenController extends CommonController { function index(){ //检测三个参数是否存在 if(!$this->frparam('molds',1) || !$this->frparam('tid') || !$this->frparam('jz_screen',1)){ $this->error(JZLANG('参数错误!')); } if(!M('molds')->find(['biaoshi'=>$this->frparam('molds',1)])){ $this->error(JZLANG('非法参数!')); } if(isset($GLOBALS['Redis'])){ if(!$GLOBALS['Redis']->get('screen')){ $GLOBALS['Redis']->setex('screen',SessionTime,''); } $str = $GLOBALS['Redis']->get('screen'); $session_screen = $str ? json_decode($str,true) : []; }else if(session_id()){ if(!isset($_SESSION['screen'])){ $_SESSION['screen'] = []; } $session_screen = $_SESSION['screen']; }else{ if(!isset($_COOKIE['screen'])){ setcookie('screen','',time() + SessionTime,'/'); } $str = $_COOKIE['screen']; $session_screen = $str ? json_decode($str,true) : []; } //查询扩展字段 $fields = M('fields')->findAll(['molds'=>$this->frparam('molds',1)]); $newfield = []; foreach($fields as $k=>$v){ $newfield[$v['field']] = $v; } $res = M('classtype')->find(array('id'=>$this->frparam('tid'))); //面包屑导航 $classtypetree = array_reverse($this->classtypetree); $isgo = false; $newarray = []; $parent = [];//标记父类 $istop = false; foreach($classtypetree as $k=>$v){ if($v['id']==$res['id'] && !$isgo){ $isgo = true; $res['level'] = $v['level']; $newarray[]=$v; } if($v['id']==$res['id'] && $v['level']==0){ break; } if($v['level']==0 && $v['id']!=$res['id'] && $v['id']!=$res['pid']){ if(!$istop && $isgo && $parent['level']!=0){ $newarray[]=$v; $istop = true; } $isgo = false; } if($isgo && $v['id']!=$res['id'] && $res['level']>$v['level'] ){ if($parent['pid']){ if($parent['level']>$v['level'] && $parent['pid']!=$v['pid']){ $newarray[]=$v; $parent = $v; } }else{ $newarray[]=$v; $parent = $v; } } } $newarray2 = array_reverse($newarray); $positions=''.JZLANG('首页').''; foreach($newarray2 as $v){ $positions.=' > '.$v['classname'].''; } $this->positions_data = $newarray2; $this->positions = $positions; //解析jz_screen //检测是否有page分页参数 $this->frpage = 1; if(strpos($this->frparam('jz_screen',1),'page')!==false){ $jz_screen_arr = explode('-page-',$this->frparam('jz_screen',1)); $jz_screen = explode('-',$jz_screen_arr[0]); $this->frpage = (int)$jz_screen_arr[1]; }else{ $jz_screen = explode('-',$this->frparam('jz_screen',1)); } if($this->frparam('page')){ $this->frpage = $this->frparam('page'); } $jz_screen_key = []; $jz_screen_value = []; foreach($jz_screen as $k=>$v){ if($k%2==0){ $jz_screen_key[]=$v; }else{ $jz_screen_value[]=$v; } } $screen = array_combine($jz_screen_key,$jz_screen_value); foreach($screen as $k=>$v){ if($v==0 || $v==''){ if(isset($session_screen[$k])){ unset($session_screen[$k]); } }else{ $session_screen[$k] = $v; } } $sql = '1=1 and isshow=1 and addtime<='.time().' '; //组合搜索内容 foreach($session_screen as $k=>$v){ if(!array_key_exists($k,$newfield)){ continue; } if($newfield[$k]['fieldtype']==7 || $newfield[$k]['fieldtype']==12){ //单选字段 //多选框判断 if(strpos($v,',')!==false){ $vv = explode(',',$v); $vv_arr = []; foreach($vv as $vs){ $vv_arr[]=" ".$k."='".$vs."' "; } $sql.=" and (".implode(' or ',$vv_arr).") "; $vv = null; $vv_arr = null; }else{ $sql.=" and ".$k."='".$v."' "; } }else{ //多选字段 if(strpos($v,',')!==false){ $vv = explode(',',$v); $vv_arr = []; foreach($vv as $vs){ $vv_arr[]=" ".$k." like '%,".$vs.",%' "; } $sql.=" and (".implode(' or ',$vv_arr).") "; $vv = null; $vv_arr = null; }else{ $sql.=" and ".$k." like '%,".$v.",%' "; } } } $this->filters = $session_screen; if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->setex('screen',SessionTime,json_encode($session_screen,JSON_UNESCAPED_UNICODE)); }else if(session_id()){ $_SESSION['screen'] = $session_screen; }else{ setcookie('screen',$session_screen,time() + SessionTime,'/'); } $molds = $this->frparam('molds',1); $sql .= ' and tid in ('.implode(',',$this->classtypedata[$res['id']]['children']['ids']).') '; $page = new Page($molds); //手动设置分页条数 $limit = $res['lists_num']; if($this->frparam('limit')){ $limit = $this->frparam('limit'); } //echo $sql; //筛选分页的特殊性 $page->typeurl = 'screen'; $orders = 'istop desc,orders desc,addtime desc,id desc'; $ot = $this->frparam('orders') ? $this->frparam('orders') : $res['orderstype']; switch($ot){ case 1: $orders = 'istop desc,orders desc,addtime desc,id desc'; break; case 2: $orders = 'istop desc,orders desc,id asc'; break; case 3: $orders = 'istop desc,orders asc'; break; case 4: $orders = 'istop desc,addtime desc'; break; case 5: $orders = 'istop desc,id asc'; break; case 6: $orders = 'istop desc,hits desc'; break; case 7: $orders = 'istop desc,addtime asc'; break; } $this->currentpage = $this->frpage; $data = $page->where($sql)->orderby($orders)->limit($limit)->page($this->frpage)->go(); $pages = $page->pageList(3,'-page-'); $this->pages = $pages;//组合分页 foreach($data as $k=>$v){ $data[$k]['url'] = gourl($v,$v['htmlurl']); $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : ''; $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : ''; $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : ''; $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : ''; } $this->type = $res; $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax') && $this->webconf['isajax']){ if($this->frparam('ajax_tpl',1)){ $this->display($this->template.'/'.$res['molds'].'/screen_list_'.$res['lists_html']); exit; } JsonReturn(['code'=>0,'data'=>$data,'sum'=>$this->sum,'allpage'=>$this->allpage,'listpage'=>$this->listpage]); } $this->display($this->template.'/'.$res['molds'].'/'.$res['lists_html']); } } ================================================ FILE: app/home/c/TagsController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/10/18 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; use FrPHP\Extend\ArrayPage; class TagsController extends CommonController { function index(){ $keywords = $this->frparam('tagname',1); $id = $this->frparam('id'); if($keywords || $id){ if($id){ $keywords = M('tags')->getField(['id'=>$id,'isshow'=>1],'keywords'); if(!$keywords){ Error(JZLANG('标签未找到或已删除!')); } } $this->tagname = $keywords; $sql = "keywords='".$keywords."' and isshow=1 "; $this->tags = M('tags')->find($sql); if(!$this->tags){ Error(JZLANG('标签未找到或已删除!')); } $tables = isset($this->webconf['tag_table']) ? ($this->webconf['tag_table'] ? explode('|',$this->webconf['tag_table']) : ['article','product']) : ['article','product']; $sqlx = []; foreach($tables as $v){ $sqlx[] = " select id,tid,litpic,title,hits,tags,keywords,molds,htmlurl,ownurl,description,body,addtime,userid,member_id from ".DB_PREFIX.$v." where tags like '%,".$keywords.",%' and isshow=1 "; } $sql = implode(' union all ',$sqlx); $page = new Page(); $this->currentpage = $this->frpage; $data = $page->where($sql)->limit($this->frparam('limit',0,15))->page($this->frpage)->goSql(); foreach($data as $k=>$v){ $data[$k]['url'] = gourl($v,$v['htmlurl']); $data[$k]['class_name'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['classname'] : ''; $data[$k]['class_url'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['url'] : ''; $data[$k]['class_litpic'] = isset($this->classtypedata[$v['tid']]) ? $this->classtypedata[$v['tid']]['litpic'] : ''; $data[$k]['format_addtime'] = isset($v['addtime']) ? date('Y-m-d H:i:s',$v['addtime']) : ''; } $pages = $page->pageList(5,'/page/'); $this->pages = $pages;//组合分页 $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ if($this->frparam('ajax_tpl')){ $this->display($this->template.'/ajax_tags_list'); exit; } JsonReturn(['code'=>0,'data'=>$data]); } $this->display($this->template.'/tags-details'); }else{ $sql = ' isshow=1 '; $page = new Page('tags'); //手动设置分页条数 $limit = 50; if($this->frparam('limit')){ $limit = $this->frparam('limit'); } //只适合article和product $data = $page->where($sql)->orderby('orders desc,id desc')->limit($limit)->page($this->frpage)->go(); $pages = $page->pageList(5,'/page/'); $this->pages = $pages;//组合分页 foreach($data as $k=>$v){ $data[$k]['url'] = U('tags/index',['id'=>$v['id']]); } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>$data]); } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 $this->display($this->template.'/tags'); } } } ================================================ FILE: app/home/c/UploadsController.php ================================================ webconf['isopenhomeupload']){ JsonReturn(['state'=> '已关闭前台上传文件功能!']); } if($this->webconf['onlyuserupload'] && !$this->islogin){ JsonReturn(['state'=> '仅会员才可以上传!']); } if($this->webconf['onlyuserupload'] && $this->islogin){ $all = M('pictures')->findAll(['userid'=>$this->member['id']],null,'size'); $allsize = 0; foreach ($all as $v){ $allsize+=$v['size']; } $limisize = $this->member['uploadsize'] * 1024; if($limisize<=$allsize){ JsonReturn(['state'=> '超出会员上传文件大小!']); } } $filepath = isset($_SESSION['admin']) ? $this->webconf['admin_save_path'] : $this->webconf['home_save_path']; $paths = explode('/',$filepath); $allowpath = (count($paths)>=2 && strpos($paths[1],'{')===false) ? '/'.$paths[0].'/'.$paths[1].'/' : '/'.$paths[0].'/'; if(strpos($filepath,'{')===false){ $filepath.='/{yyyy}/{mm}/{dd}'; } if(strpos($filepath,'rand')===false){ $filepath.='/{rand:8}'; } //$CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true); $CONFIG = [ /* 上传图片配置项 */ "imageActionName"=>"uploadimage", /* 执行上传图片的action名称 */ "imageFieldName"=>"upfile", /* 提交的图片表单名称 */ "imageMaxSize"=>512000000, /* 上传大小限制,单位B 500MB*/ "imageAllowFiles"=>[".png", ".jpg", ".jpeg", ".gif", ".bmp" ,".webp"], /* 上传图片格式显示 */ "imageCompressEnable"=>true, /* 是否压缩图片,默认是true */ "imageCompressBorder"=>1600, /* 图片压缩最长边限制 */ "imageInsertAlign"=>"none", /* 插入的图片浮动方式 */ "imageUrlPrefix"=>"", /* 图片访问路径前缀 */ "imagePathFormat"=>"/".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */ /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ /* {time} 会替换成时间戳 */ /* {yyyy} 会替换成四位年份 */ /* {yy} 会替换成两位年份 */ /* {mm} 会替换成两位月份 */ /* {dd} 会替换成两位日期 */ /* {hh} 会替换成两位小时 */ /* {ii} 会替换成两位分钟 */ /* {ss} 会替换成两位秒 */ /* 非法字符 \ =>* ? " < > | */ /* 具请体看线上文档=>fex.baidu.com/ueditor/#use-format_upload_filename */ /* 涂鸦图片上传配置项 */ "scrawlActionName"=>"uploadscrawl", /* 执行上传涂鸦的action名称 */ "scrawlFieldName"=>"upfile", /* 提交的图片表单名称 */ "scrawlPathFormat"=>"/".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */ "scrawlMaxSize"=>2048000, /* 上传大小限制,单位B */ "scrawlUrlPrefix"=>"", /* 图片访问路径前缀 */ "scrawlInsertAlign"=>"none", /* 截图工具上传 */ "snapscreenActionName"=>"uploadimage", /* 执行上传截图的action名称 */ "snapscreenPathFormat"=>"/".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */ "snapscreenUrlPrefix"=>"", /* 图片访问路径前缀 */ "snapscreenInsertAlign"=>"none", /* 插入的图片浮动方式 */ /* 抓取远程图片配置 */ "catcherLocalDomain"=>["127.0.0.1", "localhost", "img.baidu.com"], "catcherActionName"=>"catchimage", /* 执行抓取远程图片的action名称 */ "catcherFieldName"=>"source", /* 提交的图片列表表单名称 */ "catcherPathFormat"=>"/".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */ "catcherUrlPrefix"=>"", /* 图片访问路径前缀 */ "catcherMaxSize"=>2048000, /* 上传大小限制,单位B */ "catcherAllowFiles"=>[".png", ".jpg", ".jpeg", ".gif", ".bmp" ,".webp"], /* 抓取图片格式显示 */ /* 上传视频配置 */ "videoActionName"=>"uploadvideo", /* 执行上传视频的action名称 */ "videoFieldName"=>"upfile", /* 提交的视频表单名称 */ "videoPathFormat"=>"/".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */ "videoUrlPrefix"=>"", /* 视频访问路径前缀 */ "videoMaxSize"=>512000000, /* 上传大小限制,单位B,默认100MB */ "videoAllowFiles"=>[ ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ /* 上传文件配置 */ "fileActionName"=>"uploadfile", /* controller里,执行上传视频的action名称 */ "fileFieldName"=>"upfile", /* 提交的文件表单名称 */ "filePathFormat"=>"/".$filepath, /* 上传保存路径,可以自定义保存路径和文件名格式 */ "fileUrlPrefix"=>"", /* 文件访问路径前缀 */ "fileMaxSize"=>512000000, /* 上传大小限制,单位B,默认50MB */ "fileAllowFiles"=>[ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" ], /* 上传文件格式显示 */ /* 列出指定目录下的图片 */ "imageManagerActionName"=>"listimage", /* 执行图片管理的action名称 */ "imageManagerListPath"=>$allowpath, /* 指定要列出图片的目录 */ "imageManagerListSize"=>20, /* 每次列出文件数量 */ "imageManagerUrlPrefix"=>"", /* 图片访问路径前缀 */ "imageManagerInsertAlign"=>"none", /* 插入的图片浮动方式 */ "imageManagerAllowFiles"=>[".png", ".jpg", ".jpeg", ".gif", ".bmp" ,".webp"], /* 列出的文件类型 */ /* 列出指定目录下的文件 */ "fileManagerActionName"=>"listfile", /* 执行文件管理的action名称 */ "fileManagerListPath"=>$allowpath, /* 指定要列出文件的目录 */ "fileManagerUrlPrefix"=>"", /* 文件访问路径前缀 */ "fileManagerListSize"=>20, /* 每次列出文件数量 */ "fileManagerAllowFiles"=>[ ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" ] /* 列出的文件类型 */ ]; $action = $_GET['action']; // 安全加固:禁止通过GET参数覆盖关键配置 // 防止攻击者通过GET参数修改fileAllowFiles、filePathFormat、fileMaxSize等 $dangerousKeys = [ 'imageActionName', 'imageFieldName', 'imageMaxSize', 'imageAllowFiles', 'scrawlActionName', 'scrawlFieldName', 'scrawlPathFormat', 'scrawlMaxSize', 'snapscreenActionName', 'snapscreenPathFormat', 'catcherLocalDomain', 'catcherActionName', 'catcherFieldName', 'catcherPathFormat', 'catcherMaxSize', 'catcherAllowFiles', 'videoActionName', 'videoFieldName', 'videoPathFormat', 'videoMaxSize', 'videoAllowFiles', 'fileActionName', 'fileFieldName', 'filePathFormat', 'fileMaxSize', 'fileAllowFiles', 'imageManagerActionName', 'imageManagerListPath', 'imageManagerListSize', 'imageManagerAllowFiles', 'fileManagerActionName', 'fileManagerListPath', 'fileManagerListSize', 'fileManagerAllowFiles' ]; foreach ($dangerousKeys as $key) { if (isset($_GET[$key])) { unset($_GET[$key]); } // 同时处理数组形式的参数,如 fileAllowFiles[0] if (strpos($key, 'Files') !== false) { $baseKey = str_replace(['fileAllowFiles', 'imageAllowFiles', 'videoAllowFiles', 'catcherAllowFiles', 'fileManagerAllowFiles', 'imageManagerAllowFiles'], ['fileAllowFiles', 'imageAllowFiles', 'videoAllowFiles', 'catcherAllowFiles', 'fileManagerAllowFiles', 'imageManagerAllowFiles'], $key); if (isset($_GET[$baseKey])) { unset($_GET[$baseKey]); } } } // 额外清理可能通过数组形式传入的危险参数 $dangerousBaseKeys = ['fileAllowFiles', 'imageAllowFiles', 'videoAllowFiles', 'catcherAllowFiles', 'fileManagerAllowFiles', 'imageManagerAllowFiles', 'filePathFormat', 'imagePathFormat', 'videoPathFormat', 'scrawlPathFormat', 'catcherPathFormat', 'fileManagerListPath', 'imageManagerListPath', 'fileMaxSize', 'imageMaxSize', 'videoMaxSize', 'scrawlMaxSize', 'catcherMaxSize', 'fileFieldName', 'imageFieldName', 'videoFieldName', 'scrawlFieldName', 'fileActionName', 'imageActionName', 'videoActionName']; foreach ($dangerousBaseKeys as $baseKey) { if (isset($_GET[$baseKey])) { unset($_GET[$baseKey]); } } switch ($action) { case 'config': $result = json_encode($CONFIG); break; /* 上传图片 */ case 'uploadimage': /* 上传涂鸦 */ case 'uploadscrawl': /* 上传视频 */ case 'uploadvideo': /* 上传文件 */ case 'uploadfile': //$result = include("action_upload.php"); $result = $this->uploadfile($CONFIG); break; /* 列出图片 */ case 'listimage': //$result = include("action_list.php"); $result = $this->listfile($CONFIG); break; /* 列出文件 */ case 'listfile': // $result = include("action_list.php"); $result = $this->listfile($CONFIG); break; /* 抓取远程文件 */ case 'catchimage': //$result = include("action_crawler.php"); $result = $this->catchimage($CONFIG); break; default: $result = json_encode(array( 'state'=> '请求地址出错' )); break; } /* 输出结果 */ if (isset($_GET["callback"])) { if (preg_match("/^[\w_]+$/", $_GET["callback"])) { echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')'; } else { echo json_encode(array( 'state'=> 'callback参数不合法' )); } } else { /* {"state":"SUCCESS","url":"\/static\/upload\/20230103\/1672756587221260.jpeg","title":"1672756587221260.jpeg","original":"6.jpeg","type":".jpeg","size":34255} */ echo $result; } } function catchimage($CONFIG){ set_time_limit(0); /* 上传配置 */ $config = array( "pathFormat" => $CONFIG['catcherPathFormat'], "maxSize" => $CONFIG['catcherMaxSize'], "allowFiles" => $CONFIG['catcherAllowFiles'], "oriName" => "remote.png" ); $fieldName = $CONFIG['catcherFieldName']; /* 抓取远程图片 */ $list = array(); if (isset($_POST[$fieldName])) { $source = $_POST[$fieldName]; } else { $source = $_GET[$fieldName]; } foreach ($source as $imgUrl) { $item = new \Uploader($imgUrl, $config, "remote"); $info = $item->getFileInfo(); array_push($list, array( "state" => $info["state"], "url" => $info["url"], "size" => $info["size"], "title" => htmlspecialchars($info["title"]), "original" => htmlspecialchars($info["original"]), "source" => htmlspecialchars_decode($imgUrl) )); } /* 返回抓取数据 */ return json_encode(array( 'state'=> count($list) ? 'SUCCESS':'ERROR', 'list'=> $list )); } function listfile($CONFIG){ /* 判断类型 */ switch ($_GET['action']) { /* 列出文件 */ case 'listfile': $allowFiles = $CONFIG['fileManagerAllowFiles']; $listSize = $CONFIG['fileManagerListSize']; $path = $CONFIG['fileManagerListPath']; break; /* 列出图片 */ case 'listimage': default: $allowFiles = $CONFIG['imageManagerAllowFiles']; $listSize = $CONFIG['imageManagerListSize']; $path = $CONFIG['imageManagerListPath']; } $allowFiles = substr(str_replace(".", "|", join("", $allowFiles)), 1); /* 获取参数 */ $size = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : $listSize; $start = isset($_GET['start']) ? htmlspecialchars($_GET['start']) : 0; $end = $start + $size; /* 获取文件列表 */ $path = $_SERVER['DOCUMENT_ROOT'] . (substr($path, 0, 1) == "/" ? "":"/") . $path; $files = $this->getfiles($path, $allowFiles); if (!count($files)) { return json_encode(array( "state" => "no match file", "list" => array(), "start" => $start, "total" => count($files) )); } /* 获取指定范围的列表 */ $files=$this->array_sort($files,'mtime','desc'); $len = count($files); for ($i = min($end, $len) - 1, $list = array(); $i < $len && $i >= 0 && $i >= $start; $i--){ $list[] = $files[$i]; } //倒序 //for ($i = $end, $list = array(); $i < $len && $i < $end; $i++){ // $list[] = $files[$i]; //} /* 返回数据 */ $result = json_encode(array( "state" => "SUCCESS", "list" => $list, "start" => $start, "total" => count($files) )); return $result; } /** * 遍历获取目录下的指定类型的文件 * @param $path * @param array $files * @return array */ function getfiles($path, $allowFiles, &$files = array()) { if (!is_dir($path)) return null; if(substr($path, strlen($path) - 1) != '/') $path .= '/'; $handle = opendir($path); while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..') { $path2 = $path . $file; if (is_dir($path2)) { $this->getfiles($path2, $allowFiles, $files); } else { if (preg_match("/\.(".$allowFiles.")$/i", $file)) { $files[] = array( 'url'=> substr($path2, strlen($_SERVER['DOCUMENT_ROOT'])), 'mtime'=> filemtime($path2) ); } } } } return $files; } function array_sort($array,$row,$type){ $array_temp = array(); $arr=array(); foreach($array as $v){ $array_temp[$v[$row]] = $v; } if($type == 'asc'){ ksort($array_temp); }elseif($type='desc'){ krsort($array_temp); }else{ } $i=0; foreach ($array_temp as $vd){ $arr[$i]=$vd; $i++; } return $arr; } function uploadfile($CONFIG){ /* 上传配置 */ $base64 = "upload"; switch (htmlspecialchars($_GET['action'])) { case 'uploadimage': $config = array( "pathFormat" => $CONFIG['imagePathFormat'], "maxSize" => $CONFIG['imageMaxSize'], "allowFiles" => $CONFIG['imageAllowFiles'] ); $fieldName = $CONFIG['imageFieldName']; break; case 'uploadscrawl': $config = array( "pathFormat" => $CONFIG['scrawlPathFormat'], "maxSize" => $CONFIG['scrawlMaxSize'], "allowFiles" => $CONFIG['scrawlAllowFiles'], "oriName" => "scrawl.png" ); $fieldName = $CONFIG['scrawlFieldName']; $base64 = "base64"; break; case 'uploadvideo': $config = array( "pathFormat" => $CONFIG['videoPathFormat'], "maxSize" => $CONFIG['videoMaxSize'], "allowFiles" => $CONFIG['videoAllowFiles'] ); $fieldName = $CONFIG['videoFieldName']; break; case 'uploadfile': default: $config = array( "pathFormat" => $CONFIG['filePathFormat'], "maxSize" => $CONFIG['fileMaxSize'], "allowFiles" => $CONFIG['fileAllowFiles'] ); $fieldName = $CONFIG['fileFieldName']; break; } /* 生成上传实例对象并完成上传 */ $up = new \Uploader($fieldName, $config, $base64); /** * 得到上传文件所对应的各个参数,数组结构 * array( * "state" => "", //上传状态,上传成功时必须返回"SUCCESS" * "url" => "", //返回的地址 * "title" => "", //新文件名 * "original" => "", //原始文件名 * "type" => "" //文件类型 * "size" => "", //文件大小 * ) */ /* 返回数据 */ return json_encode($up->getFileInfo()); } } ================================================ FILE: app/home/c/UserController.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/06/20 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class UserController extends CommonController { function _init(){ if(!M('molds')->find(['biaoshi'=>'member','isopen'=>1])){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('会员中心已关闭!'),'data'=>[]]); } Error(JZLANG('会员中心已关闭!')); exit; } parent::_init(); } function checklogin(){ if(isset($GLOBALS['Redis']) && $this->frparam('token',1)){ $token = $this->frparam('token',1); $member = $GLOBALS['Redis']->get($token); if(!$member){ JsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录,请重新登录!'),'data'=>[]]); } $this->member = json_decode($member,true); $_SESSION['member'] = $this->member; $this->islogin = true; } if(!$this->islogin){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您还未登录,请重新登录!'),'data'=>[]]); } Redirect(U('login/index')); } } function index(){ $this->checklogin(); //统计用户订单 $this->order_num = M('orders')->getCount(['userid'=>$this->member['id'],'isshow'=>1]); //统计评论数 $this->comment_num = M('comment')->getCount(['userid'=>$this->member['id'],'isshow'=>1]); //统计点赞数 $this->likes_num = M('likes')->getCount(['userid'=>$this->member['id']]); //统计收藏 $this->collect_num = M('shouchang')->getCount(['userid'=>$this->member['id']]); //发布文章统计 $this->article_num = M('article')->getCount(['member_id'=>$this->member['id']]); $this->product_num = M('product')->getCount(['member_id'=>$this->member['id']]); $this->display($this->template.'/user/index'); } function userinfo(){ $this->checklogin(); if($_POST){ $w = $this->frparam(); if(!isset($GLOBALS['Redis']) && (!isset($w['csrfkey']) || $w['csrfkey']!=$_SESSION['csrfkey']) ){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('非法操作!'),'data'=>[]]); } Error(JZLANG('非法操作!')); } $w = get_fields_data($w,'member',0); unset($w['jifen']); unset($w['money']); unset($w['openid']); unset($w['gid']); unset($w['likes']); unset($w['collection']); unset($w['regtime']); unset($w['logintime']); unset($w['isshow']); unset($w['fans']); unset($w['follow']); unset($w['ismsg']); unset($w['iscomment']); unset($w['iscollect']); unset($w['islikes']); unset($w['isat']); unset($w['isrechange']); unset($w['pid']); foreach($w as $k=>$v){ $w[$k] = format_param($v,1); } $w['tel'] = $this->frparam('tel',1); $w['pass'] = $this->frparam('password',1); $w['sex'] = $this->frparam('sex',0,0); $w['repass'] = $this->frparam('repassword',1); $w['username'] = $this->frparam('username',1); $w['email'] = $this->frparam('email',1); $w['litpic'] = $this->frparam('litpic',1); $w['signature'] = $this->frparam('signature',1); $w['province'] = $this->frparam('province',1); $w['city'] = $this->frparam('city',1); $w['address'] = $this->frparam('address',1); if($w['tel']!=''){ if(preg_match("/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[0-9])\\d{8}$/",$w['tel'])){ }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('手机号码格式错误!'),'data'=>[]]); } Error(JZLANG('手机号码格式错误!')); } //檢查是否已經註冊 $r = M('member')->find(['tel'=>$w['tel']]); if($r){ if($r['id']!=$this->member['id']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('手机号已被注册!'),'data'=>[]]); } Error(JZLANG('手机号已被注册!')); } } } if($w['username']==''){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('账户不能为空!'),'data'=>[]]); } Error(JZLANG('账户不能为空!')); } if($w['pass']!=$w['repass'] && $w['pass']!=''){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('两次密码不同!'),'data'=>[]]); } Error(JZLANG('两次密码不同!')); } if($w['email']){ $r = M('member')->find(['email'=>$w['email']]); if($r){ if($r['id']!=$this->member['id']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('邮箱已被使用!'),'data'=>[]]); } Error(JZLANG('邮箱已被使用!')); } } } $r = M('member')->find(['username'=>$w['username']]); if($r){ if($r['id']!=$this->member['id']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('昵称已被使用!'),'data'=>[]]); } Error(JZLANG('昵称已被使用!')); } } if($w['pass']!=''){ $w['pass'] = md5(md5($w['pass']).md5($w['pass'])); }else{ unset($w['pass']); unset($w['repass']); } $re = M('member')->update(['id'=>$this->member['id']],$w); $member = M('member')->find(['id'=>$this->member['id']]); unset($member['pass']); $_SESSION['member'] = array_merge($_SESSION['member'],$member); if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->setex($this->frparam('token',1),7 * 86400,json_encode($_SESSION['member'],JSON_UNESCAPED_UNICODE)); } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('修改成功!'),'data'=>[]]); } Error(JZLANG('修改成功!')); } $_SESSION['csrfkey'] = getRandChar(32); $this->csrfkey = $_SESSION['csrfkey']; if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>'success','data'=>$this->member]); } $this->display($this->template.'/user/userinfo'); } function orders(){ $this->checklogin(); $page = new Page('Orders'); $this->type = $this->frparam('type',0,0); if($this->type){ //1未支付,2已支付,3超时,4待发货,5已发货,6已废弃失效,0删除订单 switch ($this->type) { case 1: $sql = 'userid='.$this->member['id'].' and isshow=1 '; break; case 2: $sql = 'userid='.$this->member['id'].' and isshow=2 '; break; case 3: $sql = 'userid='.$this->member['id'].' and isshow=3 '; break; case 4: $sql = 'userid='.$this->member['id'].' and isshow=4 '; break; case 5: $sql = 'userid='.$this->member['id'].' and isshow=5 '; break; case 6: $sql = 'userid='.$this->member['id'].' and isshow=6 '; break; default: $sql = 'userid='.$this->member['id'].' and isshow!=0 '; break; } }else{ $sql = 'userid='.$this->member['id'].' and isshow!=0 '; } $sql.=" and ptype=1 "; $data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go(); $page->file_ext = ''; $pages = $page->pageList(5,'?page='); $this->pages = $pages; foreach($data as $k=>$v){ $data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']); $data[$k]['details'] = U('user/orderdetails',['orderno'=>$v['orderno']]); $data[$k]['del'] = U('user/orderdel',['orderno'=>$v['orderno']]); } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } $this->display($this->template.'/user/order'); } //订单详情 function orderdetails(){ $this->checklogin(); $orderno = $this->frparam('orderno',1); $order = M('orders')->find(['orderno'=>$orderno,'userid'=>$this->member['id']]); if($orderno && $order){ /* if($order['isshow']!=1){ //超时或者已支付 if($order['isshow']==0){ $msg = '订单已删除'; } if($order['isshow']==3){ $msg = '订单已过期,不可支付!'; } if($order['isshow']==2){ $msg = '订单已支付,请勿重复操作!'; } if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$msg]); } Error($msg); } */ $carts = explode('||',$order['body']); $new = []; foreach($carts as $k=>$v){ $d = explode('-',$v); if($d[0]!=''){ //兼容多模块化 if(isset($this->classtypedata[$d[0]])){ $type = $this->classtypedata[$d[0]]; $res = M($type['molds'])->find(['id'=>$d[1]]); $new[] = ['info'=>$res,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]]; }else{ $new[] = ['info'=>false,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]]; } } } $this->carts = $new; $this->order = $order; $this->display($this->template.'/user/orderdetails'); } } //支付页面 function payment(){ $this->checklogin(); $orderno = $this->frparam('orderno',1); $order = M('orders')->find(['orderno'=>$orderno,'userid'=>$this->member['id']]); if($this->frparam('go') && $orderno && $order){ if($order['isshow']!=1){ //超时或者已支付 if($order['isshow']==0){ $msg = JZLANG('订单已删除'); } if($order['isshow']==3){ $msg = JZLANG('订单已过期,不可支付!'); } if($order['isshow']==2){ $msg = JZLANG('订单已支付,请勿重复操作!'); } if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$msg,'data'=>[]]); } Error($msg); } $carts = explode('||',$order['body']); $new = []; $qianbao = 0; $jifen = 0; foreach($carts as $k=>$v){ $d = explode('-',$v); if($d[0]!=''){ //兼容多模块化 if(isset($this->classtypedata[$d[0]])){ $type = $this->classtypedata[$d[0]]; $res = M($type['molds'])->find(['id'=>$d[1]]); $new[] = ['info'=>$res,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]]; if(isset($res['jifen']) && $res['jifen']!=0){ $jifen+=$d[2]*$res['jifen']; }else{ $jifen+=$d[2]*$d[3]*($this->webconf['jifen_exchange']); } }else{ $new[] = ['info'=>false,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]]; $jifen+=$d[2]*$d[3]*($this->webconf['jifen_exchange']); } $qianbao+=$d[2]*$d[3]*($this->webconf['money_exchange']); } } $this->qianbao = $qianbao+$order['discount']*($this->webconf['money_exchange'])-$order['yunfei']*($this->webconf['money_exchange']); $this->jifen = $jifen+$order['discount']*($this->webconf['jifen_exchange'])-$order['yunfei']*($this->webconf['jifen_exchange']); if($this->webconf['isopenjifen']==1){ M('orders')->update(['id'=>$order['id']],['jifen'=>$this->jifen]); } if($this->webconf['isopenqianbao']==1){ M('orders')->update(['id'=>$order['id']],['qianbao'=>$this->qianbao]); } $this->carts = $new; $this->order = $order; $this->display($this->template.'/user/payment'); } } //删除订单 function orderdel(){ $this->checklogin(); $orderno = $this->frparam('orderno',1); if(!$orderno){ Error(JZLANG('缺少订单号!'));} $order = M('orders')->find(" orderno='".$orderno."' and userid=".$this->member['id']." and isshow!=0 "); if(!$order){ Error(JZLANG('订单号错误!'));} $r = M('orders')->update(['orderno'=>$orderno,'userid'=>$this->member['id']],['isshow'=>0]); if($r){ Success(JZLANG('删除成功!'),U('user/orders')); }else{ Error(JZLANG('删除失败!')); } } function comment(){ $this->checklogin(); $page = new Page('Comment'); $sql = 'userid='.$this->member['id'].' and isshow!=2 '; $data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->limit(5)->page($this->frparam('page',0,1))->go(); $page->file_ext = ''; $pages = $page->pageList(5,'?page='); $pages = $page->pageList(); $this->pages = $pages; $this->sum = $page->sum; foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $xmolds = M($this->classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid']]); $data[$k]['date'] = date('Y/m/d H:i:s',$v['addtime']); $data[$k]['body'] = newstr($v['body'],60); $data[$k]['comment_num'] = get_comment_num($v['tid'],$v['aid']); $data[$k]['del'] = U('user/commentdel',['id'=>$v['id']]); if($xmolds){ $data[$k]['title'] = $xmolds['title']; $data[$k]['url'] = gourl($xmolds); } } } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } $this->display($this->template.'/user/comment'); } function commentdel(){ $this->checklogin(); $id = $this->frparam('id'); if(!$id){ Error(JZLANG('缺少ID!'));} $comment = M('comment')->find(['id'=>$id,'isshow'=>1,'userid'=>$this->member['id']]); if(!$comment){ Error(JZLANG('未找到评论!'));} $r = M('comment')->update(['id'=>$id,'userid'=>$this->member['id']],['isshow'=>2]); if($r){ Success(JZLANG('删除成功!'),U('user/comment')); }else{ Error(JZLANG('删除失败!')); } } function likesAction(){ if(!isset($_SESSION['return_url'])){ $referer = ($_SERVER['HTTP_REFERER']=='') ? U('user/likes') : $_SERVER['HTTP_REFERER']; $_SESSION['return_url'] = $referer; } $tid = $this->frparam('tid'); $id = $this->frparam('id'); if(!$tid || !$id){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('参数错误!'),'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]); } Error(JZLANG('参数错误!')); } if(!$this->islogin){ if(isset($_SESSION['likes'])){ $likes = $_SESSION['likes']; }else{ $likes = []; } $lk = $tid.'-'.$id; $u = M('member')->find(['username'=>'jzcustomer']); if(!$u){ $w = []; $w['username'] = 'jzcustomer'; $r = M('member')->add($w); $u['id'] = $r; $u['likes'] = ''; } if(in_array($lk,$likes)){ $newlikes = []; foreach($likes as $v){ if($v!=$lk){ $newlikes[]=$v; } } $msg = JZLANG('已取消点赞!'); $likes = $newlikes; $ulikes = explode('||',$u['likes']); $isdo = 0; $ulk = []; foreach($ulikes as $k=>$v){ if($v){ if($v==$lk && !$isdo){ $isdo = 1; continue; } $ulk[]=$v; } } if(count($ulk)){ $u['likes'] = '||'.implode('||',$ulk).'||'; }else{ $u['likes'] = ''; } $molds = $this->classtypedata[$tid]['molds']; if($molds){ M($molds)->goDec(['id'=>$id],'zan'); } }else{ $msg = JZLANG('点赞成功!'); $likes[]=$lk; if($u['likes']){ $u['likes'] .= $lk.'||'; }else{ $u['likes'] = '||'.$lk.'||'; } $molds = $this->classtypedata[$tid]['molds']; if($molds){ M($molds)->goInc(['id'=>$id],'zan'); } } $_SESSION['likes'] = $likes; M('member')->update(['id'=>$u['id']],['likes'=>$u['likes']]); if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>$msg,'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]); } Success($msg,$_SESSION['return_url']); } //查询是否已点赞 $res = M('likes')->find(['tid'=>$tid,'aid'=>$id,'userid'=>$this->member['id']]); if(!$this->classtypedata[$tid]['molds']){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('栏目未绑定模型,无法喜欢!'),'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]); } Error(JZLANG('栏目未绑定模型,无法喜欢!')); } $molds = $this->classtypedata[$tid]['molds']; $isaward = 0; if($this->webconf['likes_award_open']==1 && $this->webconf['likes_award']>0){ $award = round($this->webconf['likes_award'],2); $max_award = round($this->webconf['likes_max_award'],2); $isaward = 1; } $ww['tid'] = $tid; $ww['aid'] = $id; $ww['userid'] = $this->member['id']; $data = M($molds)->find(['tid'=>$tid,'id'=>$id]); $member_id = $data['member_id']; if($res){ //存在-取消点赞 M('likes')->delete($ww); $task['aid'] = $id; $task['tid'] = $tid; $task['userid'] = $member_id; $task['puserid'] = $this->member['id']; $task['molds'] = $molds; $task['type'] = 'likes'; M('task')->delete($task); if($isaward){ //扣除 $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $id; $w['msg'] = JZLANG('取消点赞'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = -$award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goDec(['id'=>$member_id],'jifen',$award); } $msg = JZLANG('已取消点赞!'); $molds = $this->classtypedata[$tid]['molds']; if($molds){ M($molds)->goDec(['id'=>$id],'zan'); } }else{ //不存在 $ww['addtime'] = time(); M('likes')->add($ww); $task['aid'] = $id; $task['tid'] = $tid; $task['userid'] = $member_id; $task['puserid'] = $this->member['id']; $task['molds'] = $molds; $task['type'] = 'likes'; $task['addtime'] = time(); $task['body'] = $data['title']; $task['url'] = gourl($data); M('task')->add($task); if($award){ $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG('点赞奖励')."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $v){ $all_jifen+=$v['amount']; } } //奖励 if($max_award==0 || ($all_jifen<$max_award && $max_award>0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $id; $w['msg'] = JZLANG('点赞奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } $msg = JZLANG('点赞成功!'); $molds = $this->classtypedata[$tid]['molds']; if($molds){ M($molds)->goInc(['id'=>$id],'zan'); } } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>$msg,'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]); } Success($msg,$_SESSION['return_url']); } function checkLikes(){ $this->checklogin(); $tid = $this->frparam('tid',0,0); $id = $this->frparam('id',0,0); $res = M('likes')->find(['tid'=>$tid,'aid'=>$id,'userid'=>$this->member['id']]); if($res){ JsonReturn(['code'=>0,'msg'=>'success','data'=>true]); }else{ JsonReturn(['code'=>1,'msg'=>'fail','data'=>false]); } } function likes(){ $this->checklogin(); $lists = []; $model = new Page('likes'); $data = $model->where(['userid'=>$this->member['id']])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go(); $model->file_ext = ''; $pages = $model->pageList(5,'?page='); $this->pages = $pages; foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname']; $molds = $this->classtypedata[$v['tid']]['molds']; $vdata = M($molds)->find(['id'=>$v['aid']]); $data[$k]['url'] = $vdata ? gourl($vdata) : ''; $data[$k]['details'] = $vdata ? $vdata : ['title'=>JZLANG('已被删除')]; }else{ $data[$k]['classname'] = '[ '.JZLANG('已被删除 ').']'; $data[$k]['url'] = ''; $data[$k]['details'] = []; } $data[$k]['del'] = U('user/likesdel',['id'=>$v['id']]); } $this->lists = $data;//列表数据 $this->sum = $model->sum;//总数据 $this->listpage = $model->listpage;//分页数组-自定义分页可用 $this->prevpage = $model->prevpage;//上一页 $this->nextpage = $model->nextpage;//下一页 $this->allpage = $model->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } $this->display($this->template.'/user/likes'); } function likesdel(){ $this->checklogin(); $id = $this->frparam('id'); if($id){ M('likes')->delete(['id'=>$id,'userid'=>$this->member['id']]); Success(JZLANG('删除成功!'),U('user/likes')); }else{ Error(JZLANG('参数错误!')); } } function collectAction(){ $this->checklogin(); if(!isset($_SESSION['return_url'])){ $referer = (!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER']=='') ? U('user/collect') : $_SERVER['HTTP_REFERER']; $_SESSION['return_url'] = $referer; } $tid = $this->frparam('tid'); $id = $this->frparam('id'); if(!$tid || !$id){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('参数错误!'),'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]); } Error(JZLANG('参数错误!')); } if(!$this->classtypedata[$tid]['molds']){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['url'=>$_SESSION['return_url']],'msg'=>JZLANG('栏目未绑定模型,无法收藏!'),'url'=>$_SESSION['return_url']]); } Error(JZLANG('栏目未绑定模型,无法收藏!')); } $r = M('shouchang')->find(['userid'=>$this->member['id'],'tid'=>$tid,'aid'=>$id]); $w['tid'] = $tid; $w['aid'] = $id; $w['userid'] = $this->member['id']; $isaward = 0; if($this->webconf['collect_award_open']==1 && $this->webconf['collect_award']>0){ $award = round($this->webconf['collect_award'],2); $max_award = round($this->webconf['collect_max_award'],2); $isaward = 1; } $molds = $this->classtypedata[$tid]['molds']; $data = M($molds)->find(['tid'=>$tid,'id'=>$id]); $member_id = $data['member_id']; if($r){ //已存在 M('shouchang')->delete($w); $task['aid'] = $id; $task['tid'] = $tid; $task['userid'] = $member_id; $task['puserid'] = $this->member['id']; $task['molds'] = $molds; $task['type'] = 'collect'; M('task')->delete($task); $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $id; $w['msg'] = JZLANG('取消收藏'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = -$award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); if($isaward){ //扣除 $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $id; $w['msg'] = JZLANG('取消收藏'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = -$award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goDec(['id'=>$member_id],'jifen',$award); } $msg = $w['msg']; }else{ //新增 $w['addtime'] = time(); M('shouchang')->add($w); $task['aid'] = $id; $task['tid'] = $tid; $task['userid'] = $member_id; $task['puserid'] = $this->member['id']; $task['molds'] = $molds; $task['type'] = 'collect'; $task['addtime'] = time(); $task['body'] = $data['title']; $task['url'] = gourl($data); M('task')->add($task); if($isaward){ $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG('收藏奖励')."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $v){ $all_jifen+=$v['amount']; } } if($max_award==0 || ($all_jifen<$max_award && $max_award>0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $id; $w['msg'] = JZLANG('收藏奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } $msg = JZLANG('收藏成功!'); } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>$msg,'data'=>['url'=>$_SESSION['return_url']],'url'=>$_SESSION['return_url']]); } Success($msg,$_SESSION['return_url']); } function checkCollect(){ $this->checklogin(); $tid = $this->frparam('tid',0,0); $id = $this->frparam('id',0,0); $res = M('shouchang')->find(['userid'=>$this->member['id'],'tid'=>$tid,'aid'=>$id]); if($res){ JsonReturn(['code'=>0,'msg'=>'success','data'=>true]); }else{ JsonReturn(['code'=>1,'msg'=>'fail','data'=>false]); } } function collect(){ $this->checklogin(); $lists = []; $model = new Page('shouchang'); $data = $model->where(['userid'=>$this->member['id']])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go(); $model->file_ext = ''; $pages = $model->pageList(5,'?page='); $this->pages = $pages; foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname']; $molds = $this->classtypedata[$v['tid']]['molds']; $vdata = M($molds)->find(['id'=>$v['aid']]); $data[$k]['url'] = $vdata ? gourl($vdata) : ''; $data[$k]['details'] = $vdata ? $vdata : ['title'=>JZLANG('已被删除')]; }else{ $data[$k]['classname'] = '[ '.JZLANG('已被删除').' ]'; $data[$k]['url'] = ''; $data[$k]['details'] = []; } $data[$k]['del'] = U('user/collectdel',['id'=>$v['id']]); } $this->lists = $data;//列表数据 $this->sum = $model->sum;//总数据 $this->listpage = $model->listpage;//分页数组-自定义分页可用 $this->prevpage = $model->prevpage;//上一页 $this->nextpage = $model->nextpage;//下一页 $this->allpage = $model->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } $this->display($this->template.'/user/collect'); } function collectdel(){ $this->checklogin(); $id = $this->frparam('id'); if($id){ M('shouchang')->delete(['id'=>$id,'userid'=>$this->member['id']]); Success(JZLANG('删除成功!'),U('user/collect')); }else{ Error(JZLANG('参数错误!')); } } //购物车 function cart(){ $this->checklogin(); if(isset($GLOBALS['Redis'])){ $cart = $GLOBALS['Redis']->get('cart'); if(!$cart){ $cart = ''; } }else{ if(!isset($_SESSION['cart'])){ $_SESSION['cart'] = ''; } $cart = $_SESSION['cart']; } $this->member_group = M('member_group')->find(['id'=>$this->member['gid']]); //tid-id-num $cart = explode('||',$_SESSION['cart']); $carts = []; if($cart){ foreach($cart as $k=>$v){ $d = explode('-',$v); if($d[0]!=''){ //兼容多模块化 if(isset($this->classtypedata[$d[0]])){ $type = $this->classtypedata[$d[0]]; $res = M($type['molds'])->find(['id'=>$d[1]]); $carts[] = ['info'=>$res,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]]; }else{ $carts[] = ['info'=>false,'num'=>$d[2],'tid'=>$d[0],'id'=>$d[1],'price'=>$d[3]]; } } } } $this->carts = $carts; $this->display($this->template.'/user/cart'); } //购物车 tid-id-num function addcart(){ $this->checklogin(); $id = $this->frparam('id'); $tid = $this->frparam('tid'); $num = $this->frparam('num'); if(!$id || !$tid || !$num){ JsonReturn(['code'=>1,'msg'=>JZLANG('参数错误!'),'data'=>[]]); } //检查库存 $product = M($this->classtypedata[$tid]['molds'])->find(['id'=>$id]); if($product['stock_num']<$num){ JsonReturn(['code'=>1,'msg'=>JZLANG('库存不足!'),'data'=>[]]); } //session存储 if( !isset($_SESSION['cart']) && (!isset($GLOBALS['Redis']) || !$GLOBALS['Redis']->get('cart')) ){ //id-tid-num $cart = $tid.'-'.$id.'-'.$num.'-'.$product['price']; }else{ if(isset($GLOBALS['Redis'])){ $cart = $GLOBALS['Redis']->get('cart'); }else{ $cart = $_SESSION['cart']; } $carts = explode('||',$cart); $new = []; $isnew = true; foreach($carts as $v){ $d = explode('-',$v); if($d[0]!=''){ if($d[0]==$tid && $d[1]==$id){ $d[2] = $num; $isnew = false; } $new[]=$d[0].'-'.$d[1].'-'.$d[2].'-'.$d[3]; } } if($isnew){ $new[]=$tid.'-'.$id.'-'.$num.'-'.$product['price']; } $cart = implode('||',$new); } $_SESSION['cart'] = $cart; if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->setex('cart', 7 * 86400, $cart); } JsonReturn(['code'=>0,'msg'=>'success','data'=>['url'=>U('user/cart')],'url'=>U('user/cart')]); } //删除购物车商品 function delcart(){ $this->checklogin(); $id = $this->frparam('id'); $tid = $this->frparam('tid'); if(!$id || !$tid){ JsonReturn(['code'=>1,'msg'=>JZLANG('参数错误!'),'data'=>[]]); } if(isset($GLOBALS['Redis'])){ $cart = $GLOBALS['Redis']->get('cart'); }else{ $cart = $_SESSION['cart']; } $carts = explode('||',$cart); $new = []; foreach($carts as $v){ $d = explode('-',$v); if(($d[0]!=$tid || $d[1]!=$id) && $d[0]!=''){ $new[]=$d[0].'-'.$d[1].'-'.$d[2]; } } $cart = implode('||',$new); $_SESSION['cart'] = $cart; if(isset($GLOBALS['Redis'])){ $GLOBALS['Redis']->setex('cart', 7 * 86400, $cart); } JsonReturn(['code'=>0,'msg'=>'success','data'=>['url'=>$cart],'url'=>$cart]); } //文章列表 function posts(){ $this->checklogin(); $molds = $this->frparam('molds',1,'article'); $this->molds = $molds; $this->moldsname = M('molds')->getField(['biaoshi'=>$molds],'name'); $page = new Page($molds); $this->type = $this->frparam('type'); $sql = 'member_id='.$this->member['id'].' '; switch ($this->type) { case 1: $sql.=" and isshow=2 "; break; case 2: $sql.=" and isshow=0 "; break; case 3: $sql.=" and isshow=1 "; break; default: # code... break; } $data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go(); $page->file_ext = ''; $pages = $page->pageList(5,'?page='); foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname']; }else{ $data[$k]['classname'] = '[ '.JZLANG('未分类').' ]'; } $data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']); $data[$k]['edit'] = U('user/release',['id'=>$v['id'],'molds'=>$molds]); $data[$k]['del'] = U('user/del',['id'=>$v['id'],'molds'=>$molds]); $data[$k]['view'] = U('user/preview',['id'=>$v['id'],'tid'=>$v['tid']]); $data[$k]['url'] = gourl($v); } $this->pages = $pages; $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } $this->display($this->template.'/user/article'); } function getContent(){ $this->checklogin(); $molds = $this->frparam('molds',1,'article'); if(!$this->frparam('id')){ JsonReturn(['code'=>1,'msg'=>JZLANG('ID错误!'),'data'=>[]]); } $data = M($molds)->find(['id'=>$this->frparam('id'),'member_id'=>$this->member['id']]); if(!$data){ JsonReturn(['code'=>1,'msg'=>JZLANG('未找到相关文章!'),'data'=>[]]); } JsonReturn(['code'=>0,'msg'=>'success','data'=>$data]); } //文章发布和修改 function release(){ $this->checklogin(); if($_POST){ $data = $this->frparam(); $w = []; $w['molds'] = $this->frparam('molds',1); $release_table = explode('|',$this->webconf['release_table']); if(!in_array($w['molds'],$release_table)){ JsonReturn(array('code'=>1,'msg'=>JZLANG('该模块不允许发布!'),'data'=>[])); } $ishome = M('molds')->getField(['biaoshi'=>$w['molds']],'ishome'); if(!$ishome){ JsonReturn(array('code'=>1,'msg'=>JZLANG('该模块不允许发布!'),'data'=>[])); } $w = get_fields_data($data,$w['molds'],0); $w['molds'] = $this->frparam('molds',1); //违禁词检测 if(isset($this->webconf['mingan']) && $this->webconf['mingan']!=''){ $mingan = explode(',',$this->webconf['mingan']); foreach($w as $v){ if($v){ if(is_array($v)){ foreach($v as $vv){ if($vv){ foreach($mingan as $s){ if(strpos($s,'{xxx}')!==false){ $pattern = '/'.str_replace('{xxx}','(.*)',$s).'/'; if(preg_match($pattern, $vv)){ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败,存在敏感词').' [ '.$s.' ]','data'=>[])); } }else{ if(strpos($vv,$s)!==false){ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败,存在敏感词').' [ '.$s.' ]','data'=>[])); } } } } } }else{ foreach($mingan as $s){ if(strpos($s,'{xxx}')!==false){ $pattern = '/'.str_replace('{xxx}','(.*)',$s).'/'; if(preg_match($pattern, $v)){ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败,存在敏感词').' [ '.$s.' ]','data'=>[])); } }else{ if(strpos($v,$s)!==false){ JsonReturn(array('code'=>1,'msg'=>JZLANG('添加失败,存在敏感词').' [ '.$s.' ]','data'=>[])); } } } } } } } $w['tid'] = $this->frparam('tid'); if(!$w['tid']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('请选择分类!'),'data'=>[]]); }else{ Error(JZLANG('请选择分类!')); } } if(!isset($this->classtypedata[$w['tid']])){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('分类错误!'),'data'=>[]]); }else{ Error(JZLANG('分类错误!')); } } if($this->classtypedata[$w['tid']]['ishome']!=1){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('该分类不允许发布!'),'data'=>[]]); }else{ Error(JZLANG('该分类不允许发布!')); } } //检查权限 if($this->classtypedata[$w['tid']]['gid']!=0){ if($this->classtypedata[$w['tid']]['gid']>$this->member['gid']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('您没有权限在该分类发布内容!'),'data'=>[]]); }else{ Error(JZLANG('您没有权限在该分类发布内容!')); } } } $w['htmlurl'] = $this->classtypedata[$w['tid']]['htmlurl']; $sql = array(); if($w['tid']!=0){ $sql[] = " tids like '%,".$w['tid'].",%' "; } $sql[] = " molds = '".$w['molds']."' and isshow=1 and ishome=1 "; $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ foreach($fields_list as $v){ if($v['ismust']==1){ if($data[$v['field']]==''){ if(in_array($v['fieldtype'],array(6,10))){ if($data[$v['field'].'_urls']==''){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空!'),'data'=>[]]); }else{ Error($v['fieldname'].JZLANG('不能为空!')); } } }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空!'),'data'=>[]]); }else{ Error($v['fieldname'].JZLANG('不能为空!')); } } } } } } switch($w['molds']){ case 'article': if(!$w['body']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('内容不能为空!'),'data'=>[]]); }else{ Error(JZLANG('内容不能为空!')); } } if(!$w['title']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('标题不能为空!'),'data'=>[]]); }else{ Error(JZLANG('标题不能为空!')); } } $w['seo_title'] = $w['title']; break; case 'product': if(!$w['body']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('内容不能为空!'),'data'=>[]]); }else{ Error(JZLANG('内容不能为空!')); } } if(!$w['title']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('标题不能为空!'),'data'=>[]]); }else{ Error(JZLANG('标题不能为空!')); } } if(!$w['stock_num']){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('库存不能为0!'),'data'=>[]]); }else{ Error(JZLANG('库存不能为0!')); } } $w['seo_title'] = $w['title']; break; default: break; } if(!isset($this->webconf['homerelease']) || $this->webconf['homerelease']==1){ $w['isshow'] = 0; }else{ $w['isshow'] = 1; } $w['member_id'] = $this->member['id']; $w['addtime'] = time(); if($this->frparam('id')){ $w['id'] = $this->frparam('id',1); $a = M($w['molds'])->update(['id'=>$this->frparam('id'),'member_id'=>$this->member['id']],$w); if(!$a){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('未修改内容,不能提交!'),'data'=>[]]); }else{ Error(JZLANG('未修改内容,不能提交!')); } } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('修改成功!'),'url'=>U('user/posts',['molds'=>$w['molds']]),'data'=>['url'=>U('user/posts',['molds'=>$w['molds']])]]); }else{ Success(JZLANG('修改成功!'),U('user/posts',['molds'=>$w['molds']])); } }else{ $a = M($w['molds'])->add($w); if(!$a){ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('发布失败,请重试!'),'data'=>[]]); }else{ Error(JZLANG('发布失败,请重试!')); } } if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('发布成功!'),'data'=>['url'=>U('user/posts',['molds'=>$w['molds']])],'url'=>U('user/posts',['molds'=>$w['molds']])]); }else{ Success(JZLANG('发布成功!'),U('user/posts',['molds'=>$w['molds']])); } } } $molds = $this->frparam('molds',1,'article'); $tid = $this->frparam('tid',0,0); if($this->frparam('id')){ $this->data = M($molds)->find(['id'=>$this->frparam('id'),'member_id'=>$this->member['id']]); $molds = $this->data['molds']; $this->moldsdata = M('molds')->find(['biaoshi'=>$molds]); $tid = $this->data['tid']; }else{ $this->data = false; } $this->molds = $molds; $this->tid = $tid; $this->classtypetree = get_classtype_tree(); $this->display($this->template.'/user/article-add'); } //删除文章 function del(){ $this->checklogin(); $molds = $this->frparam('molds',1,'article'); $id = $this->frparam('id'); if(!$id){ Error(JZLANG('链接错误!'));} $res = M($molds)->find(['id'=>$id,'member_id'=>$this->member['id']]); if(!$res){ Error(JZLANG('未找到您要的文章!'));} $r = M($molds)->delete(['id'=>$id]); if($r){ if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('删除成功!'),'data'=>[]]); } Success(JZLANG('删除成功!'),U('user/posts',['molds'=>$molds])); }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('删除失败!'),'data'=>[]]); } Error(JZLANG('删除失败!')); } } function uploads(){ $this->checklogin(); $file = $this->frparam('filename',1); if ($_FILES[$file]["error"] > 0){ $data['error'] = "Error: " . $_FILES[$file]["error"]; $data['code'] = 1000; }else{ $pix = explode('.',$_FILES[$file]['name']); $pix = end($pix); //检测是否允许前台上传文件 if(!$this->webconf['isopenhomeupload']){ $data['error'] = "Error: ".JZLANG("已关闭前台上传文件功能"); $data['code'] = 1; JsonReturn($data); } $fileType = webConf('fileType'); if(strpos($fileType,strtolower($pix))===false || stripos($pix,'php')!==false || stripos($pix,'phar')!==false){ $data['error'] = "Error: ".JZLANG("文件类型不允许上传!"); $data['code'] = 1; JsonReturn($data); } $fileSize = (int)webConf('fileSize'); if($fileSize!=0 && ($_FILES[$file]["size"]/1024)>$fileSize){ $data['error'] = "Error: ".JZLANG("文件大小超过网站内部限制!"); $data['code'] = 1; JsonReturn($data); } $home_save_path = 'static/upload/user'; if(!file_exists(APP_PATH.$home_save_path)){ mkdir(APP_PATH.$home_save_path,0777); } $filename = $home_save_path.'/head_'.$this->member['id'].'.'.$pix; if(move_uploaded_file($_FILES[$file]['tmp_name'],$filename)){ $data['url'] = '/'.$filename; $data['code'] = 0; if(isset($_SESSION['member'])){ $userid = $_SESSION['member']['id']; }else{ $userid = 0; } $filesize = round(filesize(APP_PATH.$filename)/1024,2); M('pictures')->add(['litpic'=>'/'.$filename,'addtime'=>time(),'userid'=>$userid,'size'=>$filesize,'path'=>'Home','filetype'=>strtolower($pix),'molds'=>'member']); }else{ $data['error'] = "Error: ".JZLANG("请检查目录")."[".$home_save_path."]".JZLANG("写入权限"); $data['code'] = 1; } } JsonReturn($data,true); exit; } function jizhi(){ $this->display($this->template.'/404'); } function follow(){ $this->checklogin(); $uid = $this->frparam('uid'); if($uid){ $member_id = $this->member['id']; $follow = M('member')->getField(['id'=>$member_id],'follow'); if(strpos($follow,','.$uid.',')!==false){ Error(JZLANG('您已经关注了该用户!')); } if($uid==$member_id){ Error(JZLANG('您不能关注自己!')); } //拼接方式 [ , ] if($follow==''){ $follow = ','.$uid.','; }else{ $follow.=$uid.','; } //需要更新用户的关注数及关注人的关注列表 M('member')->update(['id'=>$member_id],['follow'=>$follow]); $_SESSION['member']['follow'] = $follow; M('member')->goInc(['id'=>$uid],'fans',1); if($this->webconf['follow_award_open']==1){ $award = round($this->webconf['follow_award'],2); $max_award = round($this->webconf['follow_max_award'],2); $molds = 'member'; $member_id = $uid; $id = $uid; if($member_id!=0 && $award>0){ $rr = M('buylog')->find(['userid'=>$member_id,'type'=>3,'molds'=>$molds,'aid'=>$id,'msg'=>JZLANG('关注奖励')]); if(!$rr){ $start = mktime(0, 0, 0, date('m'), date('d'), date('Y')); $end = mktime(23, 59, 59, date('m'), date('d'), date('Y')); $sql = " addtime>=".$start." and addtime<".$end." and userid=".$member_id." and type=3 and msg='".JZLANG('关注奖励')."' "; $all = M('buylog')->findAll($sql,null,'amount'); $all_jifen = 0; if($all){ foreach($all as $v){ $all_jifen+=$v['amount']; } } if($max_award==0 || ($all_jifen<$max_award && $max_award!=0)){ $w['userid'] = $member_id; $w['buytype'] = 'jifen'; $w['type'] = 3; $w['molds'] = $molds; $w['aid'] = $id; $w['msg'] = JZLANG('关注奖励'); $w['addtime'] = time(); $w['orderno'] = 'No'.date('YmdHis'); $w['amount'] = $award; $w['money'] = $w['amount']/($this->webconf['money_exchange']); $r = M('buylog')->add($w); M('member')->goInc(['id'=>$member_id],'jifen',$award); } } } } Success(JZLANG('关注成功!'),U('user/follow')); }else{ $this->frpage = $this->frparam('page',0,1); $page = new Page('member'); $member_id = $this->member['id']; $follow = M('member')->getField(['id'=>$member_id],'follow'); if($follow!=''){ //,1,2,2,4, $ids = trim($follow,','); }else{ $ids = 0; } $sql = " id in(".$ids.") " ; $data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit(12)->page($this->frpage)->go(); $pages = $page->pageList(5,'?page='); $this->pages = $pages;//组合分页 $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 $this->display($this->template.'/user/follow'); } } //取消关注 function nofollow(){ $this->checklogin(); $uid = $this->frparam('uid'); if($uid){ $member_id = $this->member['id']; $follow = M('member')->getField(['id'=>$member_id],'follow'); if(strpos($follow,','.$uid.',')===false){ Error(JZLANG('您没有关注该用户,无法操作!')); } $follow = explode(',',$follow); $f = []; foreach ($follow as $key => $value) { if($value!='' && (int)$value!=$uid){ $f[]=$value; } } if(!count($f)){ $follow = ''; }else{ $follow = ','.implode(',',$f).','; } M('member')->update(['id'=>$member_id],['follow'=>$follow]); $_SESSION['member']['follow'] = $follow; M('member')->goDec(['id'=>$uid],'fans',1); Success(JZLANG('取关成功!'),U('user/follow')); }else{ Error(JZLANG('链接错误!')); } } function fans(){ $this->checklogin(); $this->frpage = $this->frparam('page',0,1); $page = new Page('member'); $member_id = $this->member['id']; $sql = " follow like '%,".$member_id.",%'" ; $data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit(15)->page($this->frpage)->go(); $pages = $page->pageList(3,'?page='); $this->pages = $pages;//组合分页 $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 $this->display($this->template.'/user/fans'); } /* 以下序号跟msgtype无关,仅表示可能的消息 1、发布的文章/商品/其他被评论消息 article/product comment 2、发布的文章/商品/其他被点赞消息 article/product likes 3、发布的文章/商品/其他被收藏消息 article/product collect 4、被别人@消息 comment at 5、留言被别人回复消息 comment reply 6、交易消息 buylog rechange *7、官方消息 news channel *8、私信消息 member msg */ function notify(){ $this->checklogin(); $page = new Page('task'); $msgtype = $this->frparam('msgtype'); $this->msgtype = $msgtype; if($msgtype){ switch ($msgtype) { case 1: $sql = 'userid='.$this->member['id']." and isshow=1 and (type = 'comment' or type = 'reply') "; break; case 2: $sql = 'userid='.$this->member['id']." and isshow=1 and type = 'collect'"; break; case 3: $sql = 'userid='.$this->member['id']." and isshow=1 and type = 'likes'"; break; case 4: $sql = 'userid='.$this->member['id']." and isshow=1 and type = 'at'"; break; case 5: $sql = 'userid='.$this->member['id']." and isshow=1 and type = 'rechange'"; break; default: $sql = 'userid='.$this->member['id'].' and isshow=1 '; break; } }else{ $sql = 'userid='.$this->member['id'].' and isshow=1 '; } //$sql = 'userid='.$this->member['id']; $data = $page->where($sql)->orderby('addtime desc')->page($this->frparam('page',0,1))->go(); $page->file_ext = ''; $pages = $page->pageList(5,'?page='); foreach($data as $k=>$v){ $data[$k] = $v; $data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']); $data[$k]['turl'] = U('user/notifyto',['id'=>$v['id']]); $data[$k]['del'] = U('user/notifydel',['id'=>$v['id']]); } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>$data,'msg'=>'success']); } $this->display($this->template.'/user/notify'); } function allread(){ $this->checklogin(); M('task')->update(['userid'=>$this->member['id']],['isread'=>1]); JsonReturn(['code'=>0,'msg'=>JZLANG('操作成功!'),'data'=>[]]); } function notifyto(){ $this->checklogin(); $id = $this->frparam('id'); if(!$id){ Error(JZLANG('链接错误!')); } $notify = M('task')->find(['id'=>$id,'isshow'=>1,'userid'=>$this->member['id']]); if(!$notify){ Error(JZLANG('消息已被删除!')); } $task['readtime'] = time(); $task['isread'] = 1; M('task')->update(['id'=>$id],$task); Redirect($notify['url']); } function notifydel(){ $this->checklogin(); $id = $this->frparam('id'); if(!$id){ Error(JZLANG('链接错误!')); } $notify = M('task')->find(['id'=>$id,'isshow'=>1,'userid'=>$this->member['id']]); if(!$notify){ Error(JZLANG('消息已被删除!')); } $r = M('task')->update(['id'=>$id],['isshow'=>0]); if($r){ Success(JZLANG('删除成功!'),U('user/notify')); }else{ Error(JZLANG('删除失败!')); } } //个人中心公共页 function active(){ $username = $this->frparam('uname',1); $uid = $this->frparam('uid'); if($username || $uid){ if($username){ $this->user = M('member')->find(['username'=>$username]); }else{ $this->user = M('member')->find(['id'=>$uid]); } }else{ if($this->frparam('ajax')){ JsonReturn(['code'=>1,'msg'=>JZLANG('链接错误!'),'data'=>[]]); } Error(JZLANG('链接错误!')); } if(!$this->user){ Error(JZLANG('用户未找到!')); } //统计评论数 $this->comment_num = M('comment')->getCount(['userid'=>$this->user['id'],'isshow'=>1]); //统计点赞数 $this->likes_num = M('likes')->getCount(['userid'=>$this->user['id']]); //统计收藏 $this->collect_num = M('shouchang')->getCount(['userid'=>$this->user['id']]); //发布文章统计 $this->article_num = M('article')->getCount(['member_id'=>$this->user['id']]); $this->product_num = M('product')->getCount(['member_id'=>$this->user['id']]); $this->type = $this->frparam('type',0,1); switch($this->type){ case 1: $molds = $this->frparam('molds',1,'article'); if($molds!='article'){ Error(JZLANG('链接错误!')); } $this->molds = $molds; $this->moldsname = M('molds')->getField(['biaoshi'=>$molds],'name'); $page = new Page($molds); $this->type = $this->frparam('type'); $sql = 'member_id='.$this->user['id'].' and isshow=1 '; $data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go(); $page->file_ext = ''; $pages = $page->pageList(5,'?page='); foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname']; }else{ $data[$k]['classname'] = '[ '.JZLANG('未分类 ').']'; } $data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']); $data[$k]['url'] = gourl($v); } $this->pages = $pages; $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } break; case 2: $molds = $this->frparam('molds',1,'article'); if($molds!='product'){ Error(JZLANG('链接错误!')); } $this->molds = $molds; $this->moldsname = M('molds')->getField(['biaoshi'=>$molds],'name'); $page = new Page($molds); $this->type = $this->frparam('type'); $sql = 'member_id='.$this->user['id'].' and isshow=1 '; $data = $page->where($sql)->limit($this->frparam('limit',0,15))->orderby('addtime desc')->page($this->frparam('page',0,1))->go(); $page->file_ext = ''; $pages = $page->pageList(5,'?page='); foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname']; }else{ $data[$k]['classname'] = '[ '.JZLANG('未分类').' ]'; } $data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']); $data[$k]['url'] = gourl($v); } $this->pages = $pages; $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } break; case 3: $this->frpage = $this->frparam('page',0,1); $page = new Page('member'); $member_id = $this->user['id']; $follow = M('member')->getField(['id'=>$member_id],'follow'); if($follow!=''){ //,1,2,2,4, $ids = trim($follow,','); }else{ $ids = 0; } $sql = " id in(".$ids.") " ; $data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit($this->frparam('limit',0,15))->page($this->frpage)->go(); $pages = $page->pageList(5,'?page='); $this->pages = $pages;//组合分页 $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } break; case 4: $this->frpage = $this->frparam('page',0,1); $page = new Page('member'); $member_id = $this->user['id']; $sql = " follow like '%,".$member_id.",%'" ; $data = $page->where($sql)->orderby('fans desc,regtime desc,id desc')->limit($this->frparam('limit',0,15))->page($this->frpage)->go(); $pages = $page->pageList(3,'?page='); $this->pages = $pages;//组合分页 $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } break; case 5: $model = new Page('shouchang'); $member_id = $this->user['id']; $data = $model->where(['userid'=>$member_id])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go(); $model->file_ext = ''; $pages = $model->pageList(5,'?page='); $this->pages = $pages; foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname']; $molds = $this->classtypedata[$v['tid']]['molds']; $vdata = M($molds)->find(['id'=>$v['aid']]); $data[$k]['url'] = gourl($vdata); $data[$k]['details'] = $vdata; }else{ $data[$k]['classname'] = '[ '.JZLANG('已被删除').' ]'; $data[$k]['url'] = ''; $data[$k]['details'] = []; } } $this->sum = $model->sum; $this->lists = $data; $this->listpage = $model->listpage;//分页数组-自定义分页可用 $this->prevpage = $model->prevpage;//上一页 $this->nextpage = $model->nextpage;//下一页 $this->allpage = $model->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } break; case 6: $page = new Page('Comment'); $sql = 'userid='.$this->user['id'].' and isshow=1 '; $data = $page->where($sql)->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go(); $page->file_ext = ''; $pages = $page->pageList(5,'?page='); $this->pages = $pages; $this->sum = $page->sum; foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $xmolds = M($this->classtypedata[$v['tid']]['molds'])->find(['id'=>$v['aid']]); if($xmolds){ $data[$k]['title'] = $xmolds['title']; $data[$k]['date'] = date('Y/m/d H:i:s',$v['addtime']); $data[$k]['url'] = gourl($xmolds); $data[$k]['body'] = newstr($v['body'],60); $data[$k]['comment_num'] = get_comment_num($v['tid'],$v['aid']); } } } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } break; case 7: $lists = []; $model = new Page('likes'); $data = $model->where(['userid'=>$this->member['id']])->orderby('addtime desc')->limit($this->frparam('limit',0,15))->page($this->frparam('page',0,1))->go(); $model->file_ext = ''; $pages = $model->pageList(5,'?page='); $this->pages = $pages; foreach($data as $k=>$v){ if(isset($this->classtypedata[$v['tid']])){ $data[$k]['classname'] = $this->classtypedata[$v['tid']]['classname']; $molds = $this->classtypedata[$v['tid']]['molds']; $vdata = M($molds)->find(['id'=>$v['aid']]); $data[$k]['url'] = gourl($vdata); $data[$k]['details'] = $vdata; }else{ $data[$k]['classname'] = '[ '.JZLANG('已被删除 ').']'; $data[$k]['url'] = ''; $data[$k]['details'] = []; } } $this->lists = $data; $this->listpage = $model->listpage;//分页数组-自定义分页可用 $this->prevpage = $model->prevpage;//上一页 $this->nextpage = $model->nextpage;//下一页 $this->allpage = $model->allpage;//总页数 if($this->frparam('ajax')){ JsonReturn(['code'=>0,'data'=>['list'=>$data,'count'=>$this->sum,'allpage'=>$this->allpage],'msg'=>'success']); } break; } $this->display($this->template.'/user/people'); } //消息提醒设置 function setmsg(){ $this->checklogin(); if($_POST){ $data['ismsg'] = $this->frparam('ismsg',0,0); $data['iscomment'] = $this->frparam('iscomment',0,0); $data['iscollect'] = $this->frparam('iscollect',0,0); $data['islikes'] = $this->frparam('islikes',0,0); $data['isat'] = $this->frparam('isat',0,0); $data['isrechange'] = $this->frparam('isrechange',0,0); M('member')->update(['id'=>$this->member['id']],$data); $_SESSION['member'] = array_merge($_SESSION['member'],$data); if($this->frparam('ajax')){ JsonReturn(['code'=>0,'msg'=>JZLANG('设置成功'),'data'=>[]]); } Success(JZLANG('设置成功!'),U('user/setmsg')); } $this->display($this->template.'/user/setmsg'); } function getclass(){ $molds = $this->frparam('molds',1,'article'); $data = M('classtype')->findAll(['molds'=>$molds,'ishome'=>1],'orders desc'); if(!$data){ $data = []; } $data = getTree($data); JsonReturn(['code'=>0,'data'=>$data,'msg'=>'success']); } //钱包 function wallet(){ $this->checklogin(); $lists = M('buylog')->findAll(['userid'=>$this->member['id'],'type'=>1]); $cz_money = 0; $cz_jifen = 0; foreach ($lists as $key => $value) { if($value['buytype']=='money'){ $cz_money += $value['amount']; }else{ $cz_jifen += $value['amount']; } } $this->user = M('member')->find(['id'=>$this->member['id']]); $this->cz_money = $cz_money; $this->cz_jifen = $cz_jifen; $this->display($this->template.'/user/wallet'); } //购买 function buy(){ $this->checklogin(); if($_POST){ if($this->webconf['paytype']==0){ JsonReturn(['code'=>1,'msg'=>JZLANG('未开启在线支付!'),'data'=>[]]); } $money = $this->frparam('allmoney',3); $number = $this->frparam('number'); if(!$money || !$number){ JsonReturn(['code'=>1,'msg'=>JZLANG('参数错误!'),'data'=>[]]); } $w['jifen'] = $number; $w['price'] = $money; $w['orderno'] = 'No'.date('YmdHis'); $paytype = $this->frparam('paytype',0,1); $w['userid'] = $this->member['id']; $w['paytype'] = $paytype; $buytarget = $this->frparam('buytarget',0,1); if($buytarget==1){ $w['ptype'] = 2; }else{ $w['ptype'] = 3; } $w['addtime'] = time(); $res = M('orders')->add($w); if($res){ JsonReturn(['code'=>0,'msg'=>'success','data'=>$w]); }else{ JsonReturn(['code'=>1,'msg'=>JZLANG('参数错误!'),'data'=>[]]); } } $this->display($this->template.'/user/buy'); } //购买列表 function buylist(){ $this->checklogin(); //兑换记录 $page1 = new Page('buylog'); $this->type = $this->frparam('type',0,1); if($this->type==1){ $sql =" type=2 "; }else if($this->type==2){ $sql =" type=1 "; }else{ $sql = " type=3 "; } $sql.=" and userid=".$this->member['id']; $data1 = $page1->where($sql)->orderby('addtime desc')->page($this->frparam('p',0,1))->go(); $page1->typeurl = 'search'; $pages1 = $page1->pageList(5,'&p='); $this->pages1 = $pages1; foreach($data1 as $k=>$v){ $data1[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']); $data1[$k]['details'] = U('user/buydetails',['id'=>$v['id']]); } $this->lists1 = $data1;//列表数据 $this->sum1 = $page1->sum;//总数据 $this->listpage1 = $page1->listpage;//分页数组-自定义分页可用 $this->prevpage1 = $page1->prevpage;//上一页 $this->nextpage1 = $page1->nextpage;//下一页 $this->allpage1 = $page1->allpage;//总页数 //订单记录 $page = new Page('orders'); $this->type = $this->frparam('type',0,1); if($this->type==1){ $sql =" ptype=1 "; }else{ $sql =" ptype=2 "; } $sql.=" and isshow!=0 and userid=".$this->member['id']; $data = $page->where($sql)->orderby('addtime desc')->page($this->frparam('page',0,1))->go(); $page->typeurl = 'search'; $pages = $page->pageList(5,'&page='); $this->pages = $pages; foreach($data as $k=>$v){ $data[$k]['date'] = date('Y-m-d H:i:s',$v['addtime']); $data[$k]['orderdetails'] = U('user/orderdetails',['orderno'=>$v['orderno']]); $data[$k]['orderdel'] = U('user/orderdel',['orderno'=>$v['orderno']]); $data[$k]['buytype'] = M('buylog')->getField(['orderno'=>$v['orderno']],'type'); } $this->lists = $data;//列表数据 $this->sum = $page->sum;//总数据 $this->listpage = $page->listpage;//分页数组-自定义分页可用 $this->prevpage = $page->prevpage;//上一页 $this->nextpage = $page->nextpage;//下一页 $this->allpage = $page->allpage;//总页数 $this->display($this->template.'/user/buy-list'); } //交易详情 function buydetails(){ $this->checklogin(); $id = $this->frparam("id"); if($id){ $data = M('buylog')->find(['id'=>$id,'userid'=>$this->member['id']]); if($data){ $this->data = $data; $this->display($this->template.'/user/buy-view'); }else{ Error(JZLANG('记录不存在!')); } }else{ Error(JZLANG('链接错误!')); } } //动态获取消息 function getmsg(){ echo has_no_read_msg(); } //预览信息 function preview(){ $this->checklogin(); $tid = $this->frparam('tid'); $id = $this->frparam('id'); if(!$id){ $this->error(JZLANG('缺少ID!')); } if(!$tid){ $this->error(JZLANG('缺少栏目ID!')); } $this->type = $this->classtypedata[$tid]; $details = M($this->type['molds'])->find(array('id'=>$id,'member_id'=>$this->member['id'])); if(!$details){ $this->error(JZLANG('未找到相应内容!')); exit; } if(!isset($details['url'])){ $details['url'] = gourl($details); } //body if(array_key_exists('body',$details)){ $con = $details['body']; $chains = M('chain')->findAll(['isshow'=>1]); if($chains){ foreach($chains as $v){ $url = $v['url']; $num = $v['num']; $name = $v['title']; $newname = $v['newtitle']!='' ? $v['newtitle'] : $name; if($url!=''){ $astr = "".$newname.""; }else{ $astr = $newname; } $con = preg_replace( '|(]*?)('.$name.')([^>]*?\=)([^>]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con); $con = preg_replace( '|(]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3', $con); $con = preg_replace( '|(]*?)('.$name.')([^>]*?>)(<[^<]*?)('.$name.')([^>]*?>)|U', '$1%&&&&&%$3$4%&&&&&%$6', $con); $con = str_replace_limit($name, $astr, $con, $num); $con = str_replace('%&&&&&%', $newname, $con); } } $details['body'] = $con; } $this->jz = $details; $aprev_sql = ' id<'.$id.' and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') '; $anext_sql = ' id>'.$id.' and tid in ('.implode(',',$this->classtypedata[$this->type['id']]['children']['ids']).') '; $aprev = M($this->type['molds'])->find($aprev_sql,'id desc'); $anext = M($this->type['molds'])->find($anext_sql,'id asc'); if($aprev){ $aprev['url'] = gourl($aprev); } if($anext){ $anext['url'] = gourl($anext); } $this->aprev = $aprev; $this->anext = $anext; //面包屑导航 $classtypetree = array_reverse($this->classtypetree); $isgo = false; $newarray = []; $parent = [];//标记父类 $istop = false; foreach($classtypetree as $k=>$v){ if($v['id']==$this->type['id'] && !$isgo){ $isgo = true; $this->type['level'] = $v['level']; $newarray[]=$v; } if($v['id']==$this->type['id'] && $v['level']==0){ break; } if($v['level']==0 && $v['id']!=$this->type['id'] && $v['id']!=$this->type['pid']){ if(!$istop && $isgo && $parent['level']!=0){ $newarray[]=$v; $istop = true; } $isgo = false; } if($isgo && $v['id']!=$this->type['id'] && $this->type['level']>$v['level']){ if(isset($parent['pid'])){ if($parent['level']!=$v['level']){ $newarray[]=$v; } }else{ $newarray[]=$v; } $parent = $v; } } $newarray2 = array_reverse($newarray); $positions=''.JZLANG('首页').''; foreach($newarray2 as $v){ $positions.=' > '.$v['classname'].''; } $this->positions_data = $newarray2; $this->positions = $positions; if($this->frparam('ajax') && $this->webconf['isajax'] ){ $sql = []; $sql[] = " tids like '%,".$details['tid'].",%' "; $sql[] = " molds = '".$this->type['molds']."' and isshow=1 "; $sql[] = " isajax=0 ";//查询出不允许访问的字段,进行限制 $sql = implode(' and ',$sql); $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ $noallow = []; foreach($fields_list as $v){ $noallow[]=$v['field']; } foreach($details as $kk=>$vv){ if(in_array($kk,$noallow)){ unset($details[$kk]); unset($aprev[$kk]); unset($anext[$kk]); } } } JsonReturn(['code'=>0,'data'=>['jz'=>$details,'prev'=>$aprev,'next'=>$anext],'msg'=>'success','jz'=>$details,'prev'=>$aprev,'next'=>$anext]); } if(!$this->type['details_html']){ $details_html = M('molds')->getField(['biaoshi'=>$this->type['molds']],'details_html'); $this->type['details_html'] = str_replace('.html','',$details_html); } $this->display($this->template.'/'.$this->type['molds'].'/'.$this->type['details_html']); } } ================================================ FILE: app/home/c/WechatController.php ================================================ // +---------------------------------------------------------------------- // | Date:2020/01/01 // +---------------------------------------------------------------------- namespace app\home\c; use frphp\extend\Page; class WechatController extends CommonController { public function _init(){ parent::_init(); } public function index(){ if (isset($_GET['echostr'])){ $this->checkWeixin(); }else{ $this->responseMsg(); } } //微信登录 public function login(){ //存储当前页面链接 if(!isset($_SESSION['return_url'])){ $referer = ($_SERVER['HTTP_REFERER']=='') ? U('user/index') : $_SERVER['HTTP_REFERER']; $_SESSION['return_url'] = $referer; } //检查微信配置 if($this->webconf['wx_login_appid']!='' && $this->webconf['wx_login_appsecret']!='' && $this->webconf['wx_login_token']!=''){ //获取openid,并检测是否已存在 if(!isset($_GET['code'])){ //进入授权登录 $appid = $this->webconf['wx_login_appid']; $localhost = get_domain().$_SERVER['REQUEST_URI'];//当前页面url //echo $localhost;exit; $redirect_uri = urlencode($localhost); $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_base&state=123#wechat_redirect"; //echo $url;exit; header('location:'.$url); }else{ $res = $this->getopenid(); $openid = $res['openid']; if(!$openid){ $_GET['code']=null; //授权失败重新登录 Redirect(U('login')); } $islive = M('member')->find(array('openid'=>$openid)); if($islive){ //已存在的用户,直接登录系统 unset($islive['pass']); //更新登录时间 M('member')->update(['id'=>$islive['id']],['logintime'=>time()]); $_SESSION['member'] = $islive; Redirect($_SESSION['return_url']); }else{ //未绑定,进行授权登录,获取用户信息 $_GET['code']=null; $this->register(); } } }else{ exit(JZLANG('系统未配置微信登录!')); } } //绑定微信号 public function bindinguser(){ if(!isset($_GET['code'])){ //进入授权登录 $appid = $this->webconf['wx_login_appid']; $localhost = get_domain().$_SERVER['REQUEST_URI'];//当前页面url //echo $localhost;exit; $redirect_uri = urlencode($localhost); $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_base&state=123#wechat_redirect"; //echo $url;exit; header('location:'.$url); }else{ $res = $this->getopenid(); $openid = $res['openid']; if(!$openid){ $_GET['code']=null; //Error('授权失败,重新登录~',U('bindinguser')); Redirect(U('bindinguser')); } $islive = M('member')->find(array('openid'=>$openid)); if($islive){ //绑定账户 if($this->member['openid']==$islive['openid']){ Success(JZLANG('微信已绑定!'),U('User/index')); }else{ Error(JZLANG('您的微信已被绑定,不能再绑定!'),U('User/index')); } }else{ //未绑定,进行授权绑定 $_GET['code']=null; $this->register(); } } } //验证微信公众号 public function checkWeixin(){ //微信会发送4个参数到我们的服务器后台 签名 时间戳 随机字符串 随机数 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $echostr = format_param($_GET["echostr"],1); $token = $this->webconf['wx_login_token']; // 1)将token、timestamp、nonce三个参数进行字典序排序 $tmpArr = array($nonce,$token,$timestamp); sort($tmpArr,SORT_STRING); // 2)将三个参数字符串拼接成一个字符串进行sha1加密 $str = implode($tmpArr); $sign = sha1($str); // 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if ($sign == $signature) { echo $echostr; } } public function responseMsg(){ //get post data, May be due to the different environments //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postStr = file_get_contents('php://input'); //extract post data if (!empty($postStr)){ /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, the best way is to check the validity of xml by yourself */ libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $this->postObj = $postObj; $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $textTpl = " %s 0 "; if($postObj->MsgType=='event'){ switch ($postObj->Event){ case 'CLICK': /* if($postObj->EventKey == 'xxx'){ } */ break; case 'subscribe': //获取用户信息,并存入数据库 $openid = $fromUsername; //查询是否已有账号 $openid = format_param($openid,1); $islive = M('member')->find(array('openid'=>$openid)); if(!$islive){ $access_token = $this->getAccessToken(); $url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN'; $user = file_get_contents($url); $user = json_decode($user,true); $n = M('member')->add(['username'=>'微信用户'.date('YmdHis'),'openid'=>$openid,'regtime'=>$time]); if($n){ if($this->webconf['huanying']!=''){ $contentStr = htmlspecialchars_decode($this->webconf['huanying']); $msgType = "text"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } } } break; } }else{ /* if($keyword){ $contentStr = '已收到您的信息:'.$keyword; }else{ $contentStr = '您好,请问我可以为你做什么呢?'; } $msgType = "text"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; */ } }else { echo ""; exit; } } public function getAccessToken(){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->webconf['wx_login_appid']."&secret=".$this->webconf['wx_login_appsecret']; $json = file_get_contents($url); //解析json //var_dump($json); $obj = json_decode($json); return $obj->access_token; } //获取用户的详情 public function getopenid(){ $code = $_GET['code']; $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->webconf['wx_login_appid']."&secret=".$this->webconf['wx_login_appsecret']."&code=".$code."&grant_type=authorization_code "; $res = file_get_contents($url); $json_obj = json_decode($res,true); //var_dump($json_obj);exit; if(isset($json_obj['openid'])){ $openid = $json_obj['openid']; $_SESSION['openid'] = $openid; $access_token = $json_obj['access_token']; $openid = $json_obj['openid']; return array('openid'=>$openid,'access_token'=>$access_token); }else{ //return false; exit($res); } } //用户注册 public function register(){ if(!isset($_GET['code'])){ $appid = $this->webconf['wx_login_appid']; $redirect_uri = urlencode(U('register')); $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"; header('location:'.$url); }else{ $res = $this->getopenid(); $openid = $res['openid']; if(!$openid){ $_GET['code']=null; //Error('登录失败,重新登录~',U('register')); Redirect(U('register')); } $islive = M('member')->find(array('openid'=>$openid)); //查询是否已存在 if(!$islive){ $access_token = $res['access_token']; $url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN'; $user = file_get_contents($url); $user = json_decode($user,true); $time = time(); $n = M('member')->add(['username'=>$user['nickname'],'openid'=>$openid,'litpic'=>$user['headimgurl'],'sex'=>$user['sex'],'logintime'=>$time]); if($n){ $user = M('member')->find(['id'=>$n]); unset($user['pass']); $_SESSION['member'] = $user; //Success('登录成功!',U('User/index')); Redirect(U('User/index')); }else{ $_GET['code']=null; //未知错误,重新注册 Redirect(U('register')); } }else{ //已存在的用户,直接登录系统 unset($islive['pass']); //更新登录时间 M('member')->update(['id'=>$islive['id']],['logintime'=>time()]); $_SESSION['member'] = $islive; Redirect(U('user/index')); } } } //发送模板消息 function sendTemplate($data){ $access_token = $this->getAccessToken(); $api = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$access_token; $res = curl_http($api,json_encode($data,JSON_UNESCAPED_UNICODE),'POST'); $res = json_decode($res,1); if($res['errcode']==0){ return true; }else{ Error($res['errmsg']); } } //发红包--涉及支付的账户,请填写系统设置中的支付相关微信商户 function hongbao($title,$money,$openid,$biaoyu='恭喜发财'){ //$money = 100; //最低1元,单位分 $sender = $title; $obj = array(); $obj['wxappid'] = $this->webconf['wx_appid']; //appid $obj['mch_id'] = $this->webconf['wx_mchid'];//商户id $obj['mch_billno'] = $this->webconf['wx_mchid'].date('YmdHis').rand(1000,9999);//组合成28位,根据官方开发文档,可以自行设置 $obj['client_ip'] = $_SERVER['REMOTE_ADDR']; $obj['re_openid'] = $openid;//接收红包openid $obj['total_amount'] = $money; $obj['min_value'] = $money; $obj['max_value'] = $money; $obj['total_num'] = 1; $obj['nick_name'] = $sender; $obj['send_name'] = $sender; $obj['wishing'] = $biaoyu; $obj['act_name'] = $sender; $obj['remark'] = $sender; $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; $obj['nonce_str'] = $this->create_noncestr(); //创建随机字符串 $stringA = $this->create_qianming($obj,false); //创建签名 $stringSignTemp = $stringA."&key=".$this->webconf['key']; //签名后加api $sign = strtoupper(md5($stringSignTemp)); //签名加密并大写 $obj['sign'] = $sign; //将签名传入数组 $postXml = $this->arrayToXml($obj); //将参数转为xml格式 //var_dump($postXml); $responseXml = $this->curl_post_ssl($url,$postXml); //提交请求 //var_dump($responseXml); //return $responseXml; $xml = simplexml_load_string($responseXml); $res = json_decode(json_encode($xml),TRUE); return $res; } //生成随机字符串,默认32位 function create_noncestr($length=32) { //创建随机字符 $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; $str = ""; for($i=0;$i<$length;$i++) { $str.=substr($chars, mt_rand(0,strlen($chars)-1),1); } return $str; } //数组转xml function arrayToXml($arr) { $xml = ""; foreach ($arr as $key=>$val) { if (is_numeric($val)) { $xml.="<".$key.">".$val.""; } else { $xml.="<".$key.">"; } } $xml.=""; return $xml; } //post请求网站,需要证书 function curl_post_ssl($url, $vars, $second=30,$aHeader=array()) { $ch = curl_init(); //超时时间 curl_setopt($ch,CURLOPT_TIMEOUT,$second); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); //这里设置代理,如果有的话 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //cert 与 key 分别属于两个.pem文件 //请确保您的libcurl版本是否支持双向认证,版本高于7.20.1 curl_setopt($ch,CURLOPT_SSLCERT,$this->webconf['apiclient_cert']); curl_setopt($ch,CURLOPT_SSLKEY,$this->webconf['apiclient_key']); curl_setopt($ch,CURLOPT_CAINFO,$this->webconf['rootca']); if( count($aHeader) >= 1 ){ curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader); } curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS,$vars); $data = curl_exec($ch); if($data){ curl_close($ch); return $data; }else { $error = curl_errno($ch); echo "call faild, errorCode:$error\n"; curl_close($ch); return false; } } } ================================================ FILE: app/home/lang/back.php ================================================ '', '删除失败,该分组不允许删除!' => '', '删除成功!' => '', '删除失败,请重试!' => '', '非法操作!' => '', '修改失败,您的权限不足!' => '', '修改成功!' => '', '修改失败,请重新提交!' => '', '没有该角色!' => '', '新增成功!' => '', '新增失败,请重新提交!' => '', '修改失败,该分组不允许修改!' => '', '您没有权限操作!' => '', '两次密码不同!' => '', '手机号已被注册!' => '', '昵称已被使用!' => '', '邮箱已被使用!' => '', '修改失败!' => '', '新增失败!' => '', '系统管理员不能删除!' => '', '删除失败!' => '', '批量操作失败!' => '', '批量删除成功!' => '', '添加失败' => '', '存在敏感词' => '', '已存在相同的自定义URL!' => '', '添加成功,继续添加~' => '', '内容配置' => '', '修改失败' => '', '发布奖励' => '', '您未做任何修改,不能提交!' => '', '复制成功!' => '', '复制失败!' => '', '批量复制成功!' => '', '批量修改成功!' => '', '批量操作成功!' => '', 'URL链接命名不能是' => '', '非法URL' => '', '添加栏目成功,继续添加~' => '', '模型错误!' => '', '不能选择当前栏目及下级为顶级栏目' => '', '该栏目有子栏目,请先删除子栏目!' => '', '栏目不能为空!' => '', '操作成功!' => '', '请选择分类!' => '', '添加成功!继续添加~' => '', '添加失败!' => '', '该分类下存在内容,请先删除该分类下的内容!' => '', '添加成功!' => '', '已审核' => '', '被删除' => '', '未审核' => '', '已读' => '', '未读' => '', '批量审核成功!' => '', '批量审核失败!' => '', '您没有权限!' => '', '文件类型不允许上传!' => '', '文件大小超过网站内部限制!' => '', '请检查目录写入权限' => '', '错误信息提示' => '', '模块为空,请选择模块!' => '', '缺少ID' => '', '请选择模块!' => '', '显示' => '', '隐藏' => '', '是' => '', '否' => '', '单行文本' => '', '多行文本' => '', '文本编辑器' => '', '数字' => '', '单图片' => '', '多图片' => '', '单选下拉' => '', '多选' => '', '单附件' => '', '多附件' => '', '时间戳' => '', '单选按钮' => '', '单选关联' => '', '小数' => '', '多行录入' => '', '多选关联' => '', '栏目' => '', '副栏目' => '', '系统TAG' => '', '字段名和字段标识不能为空!' => '', '字段标识已存在!' => '', '系统保护字段,不允许创建!' => '', '字段长度不对!' => '', '字段长度不对,时间属性必须长度为11' => '', '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '', '字段创建成功,但是字段表记录失败,请反馈官方解决!' => '', '字段创建成功!' => '', '字段修改成功!' => '', '字段修改失败!' => '', '上传图片' => '', '选择图片' => '', '图片未找到' => '', '删除这张图片' => '', '删除' => '', '上传异常!' => '', '文字描述' => '', '左移' => '', '右移' => '', '请选择' => '', '上传附件' => '', '字段关联绑定失败,请重新绑定!' => '', '请选择关联项' => '', 'TAG标签' => '', '按Enter回车自动添加' => '', '添加一个标签' => '', '系统字段不允许删除!' => '', '请选择字段!' => '', '请选择栏目!' => '', '参数有误!' => '', '请选择桌面配置!' => '', '系统默认不可删除!' => '', '网站地图创建成功!' => '', '网站地图创建失败,请检查根目录权限!' => '', '清除失败!' => '', '清除成功!' => '', '生成失败!' => '', '生成成功!' => '', '已清理一部分页面,请不要关闭当前页面,还需要继续清理HTML~' => '', '已生成一部分页面,请不要关闭当前页面,还需要继续生成HTML~' => '', '静态HTML页面已全部清理完毕!' => '', '总共清理页面数:' => '', '每次清理页面数:' => '', '停顿时间:' => '', '开始时间:' => '', '结束时间:' => '', '总共花费时间:' => '', '总共生成页面数:' => '', '每次生成页面数:' => '', '系统创建目录失败!' => '', '模块未绑定栏目,无法生存HTML!' => '', '链接错误!' => '', '请输入属性名称!' => '', '属性已存在!' => '', '参数错误!' => '', '系统属性只允许修改和隐藏,不允许删除!' => '', '请输入内链词!' => '', '请输入内链!' => '', '内链词已存在!' => '', '已审' => '', '退回' => '', '未审' => '', '账户密码不能为空!' => '', '验证码错误!' => '', '该账户已被封禁!' => '', '登录成功!' => '', '账户密码错误!' => '', '安全退出~' => '', '无' => '', '不显示' => '', '邮箱已被注册!' => '', '添加失败,请重新提交!' => '', '没有找到该用户!' => '', '该分组下存在用户,请先移除用户再删除!' => '', '删除失败,该分类有下级功能,请先删除下级功能!' => '', '未选择删除对象!' => '', '模块名和标识不能为空!' => '', '模型已添加不能重复添加!' => '', '该表已存在!' => '', '标题' => '', '默认为空' => '', '所属栏目' => '', '选择栏目' => '', '绑定后可以在当前模型的其他栏目中显示' => '', '关键词' => '', '每个词用英文逗号(,)拼接' => '', '缩略图' => '', '可留空' => '', '简介' => '', '内容' => '', '发布会员' => '', '前台发布会员ID记录' => '', '管理员' => '', '后台发布管理员ID记录' => '', '外链URL' => '', '默认为空,系统访问内容则直接跳转到此链接' => '', '自定义URL' => '', '默认为空,自定义URL' => '', '点击量' => '', '系统自动添加' => '', '评论数' => '', '系统自带' => '', '点赞数' => '', '排序' => '', '添加时间' => '', '选择时间' => '', '推荐属性' => '', '1置顶2热点3推荐' => '', '置顶=1,热点=2,推荐=3' => '', '是否显示' => '', '显示隐藏' => '', '显示=1,未审=0,退回=2' => '', '列表' => '', '新增' => '', '修改' => '', '复制' => '', '批量删除' => '', '批量修改' => '', '批量复制' => '', '批量审核' => '', '管理' => '', '新增模型成功,快去创建对应的栏目吧!' => '', '新增模型成功,快去设置表字段吧!' => '', '新增模型失败!' => '', '标识不能为空!' => '', '系统模型标识不允许修改!' => '', '页面有错误,缺少模块ID!' => '', '里面存在数据,请先清空表内数据!' => '', '是系统模型,不允许删除!' => '', '字段表记录未清除,请手动清除!' => '', '模型' => '', '用户' => '', '栏目链接' => '', '外链' => '', '自定义链接' => '', '发布时间' => '', '字段名称不能为空!' => '', '显示=1,隐藏=0' => '', '显示=1,隐藏=0,退回=2' => '', '是=1,否=0' => '', '重构成功!' => '', '系统栏目' => '', '系统副栏目' => '', '模型标识' => '', '发布管理员' => '', '前台用户' => '', '待付款' => '', '已付' => '', '超时' => '', '待审核待支付' => '', '已发货' => '', '已废弃' => '', '未付' => '', '您的订单发货通知' => '', '尊敬的' => '', '您的订单已发货了,这几天请您留意一下快递,谢谢您的惠顾!期待再次为您服务!' => '', '订单详细信息如下:' => '', '主图' => '', '价格' => '', '购买数量' => '', '总价' => '', '折扣:' => '', '元' => '', '运费:' => '', '¥' => '', '合计:' => '', '收件地址:' => '', '联系电话:' => '', '钱包' => '', '积分' => '', '充值' => '', '兑换' => '', '奖励' => '', '该用户不存在!' => '', '充值数量不对!' => '', '操作失败!' => '', '插件配置' => '', '未分类' => '', '商品配置' => '', '批量复制失败!' => '', '部分未执行成功!' => '', '还原失败,可能是ID已经存在!' => '', '数据不存在!' => '', '删除失败,系统功能不能删除!' => '', '配置栏下有自定义配置,无法删除配置栏' => '', '已存在配置标识,请重新设置!' => '', '提交成功!' => '', '删除失败!系统字段不允许删除!' => '', '图片不存在,删除失败!' => '', '远程存储图片无法删除!' => '', '图片ID错误!' => '', '部分删除成功,存在远程链接无法删除!' => '', '非法操作' => '', '请检查目录' => '', '写入权限' => '', '配置成功!' => '', '参数存在安全隐患!' => '', '参数错误,必须携带插件ID!' => '', '发生错误' => '', '下载缓存文件不存在!' => '', '请选择使用场景!' => '', '执行插件安装程序失败!' => '', '安装成功!' => '', '备份成功!' => '', '该插件暂无更新!' => '', '参数错误,请选择对应模板!' => '', '文件不存在!' => '', '解压失败!' => '', '数据库中没有表!' => '', '写入文件失败!' => '', ' 写入文件失败!' => '', '解压完毕!本次解压花费' => '', '秒' => '', '更新成功!' => '', '个人中心' => '', '测试1' => '', '测试2' => '', '测试3' => '', '接口报错' => '', '微信配置错误!' => '', '网站首页' => '', '首页' => '', '碎片化管理' => '', '新增碎片' => '', '刷新' => '', '基本信息' => '', '使用说明' => '', '指定几个id或者几个tid的内容输出' => '', 'SQL中输入' => '', '或者' => '', '模糊查询,查询标题跟 “网站建设” 相关的内容' => '', '网站建设' => '', '模糊查询,查询标题/内容跟 “网站建设” 相关的内容' => '', '不支持联表查询' => '', '注意字符串都要使用英文单引号' => '', '如' => '', '碎片名称' => '', '碎片标识' => '', '建议英文,不要重复' => '', '不限栏目' => '', '子栏目包含' => '', '包含' => '', '不包含' => '', '输出条数' => '', '0表示输出所有' => '', '更新周期' => '', '单位' => '', '分钟' => '', '保存' => '', '返回' => '', '确定' => '', '导航管理' => '', '新增导航' => '', '导航名称' => '', '导航菜单' => '', '链接' => '', '打开' => '', '操作' => '', '不填默认栏目名称' => '', '自定义链接则需要填写' => '', '本页面' => '', '新页面' => '', '管理员管理' => '', '新增管理员信息' => '', '基本' => '', '扩展' => '', '登录名' => '', '将会成为您唯一的登入名' => '', '手机' => '', '邮箱' => '', '角色' => '', '选择角色' => '', '密码' => '', '6到16个字符,不改请留空' => '', '确认密码' => '', '状态' => '', '正常' => '', '禁用' => '', '增加成功' => '', '修改管理员信息' => '', '管理员列表' => '', '搜索' => '', '是否封禁' => '', '封禁' => '', '开始日' => '', '截止日' => '', '请输入用户名' => '', '编辑' => '', '添加管理员' => '', '正常|封禁' => '', '所属角色' => '', '登录时间' => '', '注册时间' => '', '确认要删除吗?' => '', '请选择对象!' => '', '批量删除成功' => '', '个人信息' => '', '基础' => '', '设置' => '', '填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!' => '', '恢复数据' => '', '此规则配置仅在不填留空的情况下才会触发' => '', 'SEO标题' => '', '等于内容标题' => '', '不填则留空' => '', '缩略图规则' => '', '自动获取内容第一张图片' => '', '不自动获取' => '', '简介规则' => '', '自动获取内容前200字符' => '', 'TAG规则' => '', '同步关键词' => '', '不同步关键词' => '', '敏感词过滤字段' => '', '需要过滤敏感词在系统配置中进行设置' => '', '请输入需要过滤的字段' => '', '返回列表' => '', '取消' => '', '预览' => '', '批量修改栏目' => '', '修改推荐属性' => '', '审核' => '', '列表字段设置' => '', '顶' => '', '热' => '', '荐' => '', '请选择修改栏目!' => '', '确认要批量修改内容分类吗?' => '', '批量修改成功' => '', '请选择修改属性!' => '', '请选择修改对象!' => '', '请选择审核选项!' => '', '请选择审核对象!' => '', '确认要批量处理吗?' => '', '批量审核成功' => '', '确认要复制吗?' => '', '批量复制成功' => '', '添加属性' => '', '名称' => '', '修改属性' => '', '新增属性' => '', '系统设置' => '', '数据库管理' => '', '备份数据库' => '', '备份数:' => '', '数据库备份名' => '', '大小' => '', '备份副本' => '', '还原数据' => '', '删除备份' => '', '还原数据库将覆盖现有的数据库,您确认要还原数据库吗?' => '', '您确定要删除备份数据库吗?删除后将不可找回!' => '', '数据缓存' => '', '文件夹cache/data,主要是网站内容缓存,栏目,详情页等' => '', '文件夹cache/tmp,主要是服务器session文件缓存,当前session将不会被清空' => '', '日志缓存' => '', '文件夹cache/log,包括错误日志、支付日志、登录日志等' => '', '模板缓存' => '', '文件夹cache,主要是程序执行时生成的模板编译文件' => '', '缩略图缓存' => '', '文件夹image,主要是程序执行时生成的自定义缩略图' => '', '立即清空' => '', '请选择清空目标!' => '', '清理成功!' => '', '内链管理' => '', '添加内链' => '', '内链词' => '', '内链' => '', '替换词' => '', '替换次数' => '', '替换词,可为空!' => '', '请填写内链' => '', '替换次数,默认-1,替换全部,可不写。' => '', '提交' => '', '修改内链' => '', '内链词和内链不能为空!' => '', '充值类型' => '', '当前兑换率:' => '', '兑换率指1元相当于多少钱包/积分' => '', '交易类型' => '', '赠送' => '', '充值数量' => '', '用户ID' => '', '备注' => '', '添加' => '', '充值管理' => '', '充值列表' => '', '选择交易类型' => '', '买入' => '', '选择交易种类' => '', '请输入前台用户手机号' => '', '请输入用户昵称' => '', '请输入订单号' => '', '会员充值' => '', '总订单' => '', '已充值' => '', '已兑换' => '', '总赠送' => '', '尾页' => '', '订单号' => '', '类型' => '', '交易' => '', '用户名' => '', '数量' => '', '金额' => '', '时间' => '', '查看' => '', '选择模块' => '', '选择上级' => '', '顶级栏目' => '', '分类名' => '', '图片 ' => '', '择图片' => '', '排序规则' => '', '组合:排序倒序,时间倒序,ID倒序' => '', '组合:排序倒序,ID正序' => '', '排序正序' => '', '时间倒序' => '', 'ID正序' => '', '点击量倒序' => '', '时间正序' => '', '默认不需要更改' => '', 'URL命名' => '', '请填写文件名,如:index,不填请留空' => '', '填写栏目命名后,系统将自动用作该栏目URL链接,如:news,访问该栏目链接:' => '', '多个相同URL,将覆盖前面的栏目' => '', '列表显示' => '', '设置列表页显示的内容条数' => '', '栏目模板' => '', '手动填写,不填请留空' => '', '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '', '详情页模板' => '', '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面,列表内的详情页。' => '', '栏目外链' => '', '栏目外链,如:htt://xxx.com/abc,不填请留空' => '', '填写栏目外链后,访问栏目链接将会跳到外链,不填请留空!' => '', '发布显示' => '', '勾选后,前台会员发布会显示该栏目' => '', '导航显示' => '', '模板覆盖' => '', '覆盖' => '', '不覆盖' => '', '模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。' => '', '访问限制' => '', '是否关闭' => '', '关闭' => '', '开启' => '', '栏目关闭后,前台不显示,也无法访问!' => '', '增加' => '', '请选择模板页面/使用自定义' => '', '批量新增' => '', '添加栏目' => '', '格式:栏目名|栏目URL,一行一个,如:关于我们|about' => '', '格式:栏目名|栏目URL,一行一个' => '', '请选择模板页面' => '', '图片 ' => '', '请填写完整文件名,如:index,不填请留空' => '', ' 模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。' => '', '请选择栏目' => '', '顶级' => '', '展开|折叠' => '', '模块名' => '', '快捷操作' => '', '显示|隐藏' => '', '添加下级' => '', '字段管理' => '', '新增文章' => '', '新增商品' => '', '新增内容' => '', '请选择对象' => '', '已删除!' => '', '删除成功' => '', '扩展管理' => '', '新增轮播图' => '', '所属分类' => '', '图片' => '', '图片高' => '', '0表示不限制' => '', '图片宽' => '', '跳转链接' => '', '不填请留空' => '', '数字越大越靠前' => '', '修改轮播图' => '', '选择分类' => '', '更新时间' => '', '轮播图列表' => '', '请选择分类' => '', '请输入标题' => '', '新增图片' => '', '分类列表' => '', '添加分类' => '', '共有数据:' => '', '条' => '', '长' => '', '宽' => '', '轮播图分类' => '', '评论管理' => '', '添加评论' => '', '评论栏目' => '', '文章ID' => '', '主回复ID' => '', '同属于一个评论的ID,如果没有评论中的评论,则为0' => '', '回复帖子ID' => '', '评论内容' => '', '管理员回复' => '', '是否提醒回复' => '', '提醒' => '', '不提醒' => '', '喜欢/点赞' => '', '是否已读' => '', '是否删除' => '', '已删除' => '', '未删除' => '', '只能管理员删除评论,用户只能软删除评论' => '', '查看评论' => '', '评论列表' => '', '请输入评论内容' => '', '查看相关内容' => '', '查看用户' => '', '所属文章' => '', '评论时间' => '', '请选择审核选项' => '', '批量处理成功' => '', '调用方式' => '', '这里输出想要的内容,如:' => '', '查看SQL' => '', '系统扩展' => '', '桌面管理' => '', '新增配置' => '', '配置名称' => '', '左侧菜单栏' => '', '没有二级菜单不会生效' => '', '顶部菜单栏' => '', '适用角色' => '', '默认所有' => '', '系统默认' => '', '系统默认指没有指定桌面配置的管理员,进入后台后默认的配置' => '', '一个菜单名称' => '', '顶级菜单' => '', '菜单图标' => '', '二级菜单' => '', '图标' => '', '修改菜单名称' => '', '确定要删除吗?' => '', '最后一个索引不能删除!' => '', '添加菜单名称' => '', '菜单选择' => '', '图标选择' => '', '修改配置' => '', '桌面名称' => '', '系统' => '', '是否默认' => '', '所有角色' => '', '复制配置' => '', '修改碎片' => '', '指定几个id或者几个tid的内容输出(栏目:不限制栏目)' => '', 'SQL中输入:' => '', 'SQL中输入: ' => '', '如: ' => '', '单位:分钟' => '', '修改导航' => '', '扩展模型管理' => '', '模块管理' => '', '新增字段' => '', '角色绑定' => '', '目绑定' => '', '字段名称' => '', '简短的名称' => '', '字段标识' => '', '只能英文字母[或者后面+数字],必须含有英文字母,小写字母,简短' => '', '字段类型' => '', '选择' => '', '长度' => '', '说明' => '', '不限' => '', '带编辑器文本' => '', '只能填写数字,长度不能超过11位' => '', '金钱,小数等,保留2位' => '', '时间日期' => '', '多图,图集' => '', '红=1,黄=2' => '', '单项选择,下拉选择,如:红=1,黄=2,蓝=3' => '', '单项选择,按钮选择,如:红=1,黄=2,蓝=3' => '', '多项选择,如:红=1,黄=2,蓝=3' => '', '一个附件,压缩包,Excel,Word文档' => '', '多个附件,压缩包,Excel,Word文档' => '', '请选择关联模块' => '', '列表显示字段' => '', '单选关联,可以直接调用关联模块内容列表,列表显示对应字段内容' => '', '多行录入,可以在页面动态新增内容输入框' => '', '多选关联,可以直接调用关联模块内容列表,列表显示对应字段内容' => '', '系统栏目,不可修改' => '', '系统副栏目,不可修改' => '', '系统TAG,不可修改' => '', '默认值' => '', '默认字段值,不填默认int类型的值是0,string类型的值是null。多选参数的值是两边带【,】,如【,1,】表示值为1' => '', '字段提示' => '', '用于填写时的提示信息,50字以内' => '', '表单排序' => '', '是否必填' => '', '必填' => '', '非必填' => '', '带有文本框编辑器的除外' => '', '前台显示' => '', '前台表单' => '', '后台显示' => '', '后台搜索' => '', '仅用于后台列表头部带有该字段搜索' => '', '列表中显示' => '', '仅用于后台列表显示该字段' => '', '显示格式化' => '', '不做处理' => '', '仅用于后台列表显示该字段内容处理' => '', 'ajax可访问' => '', '不能' => '', '能' => '', '由于本系统对json数据封装,限制访问可以提高安全性' => '', '角色名' => '', '栏目名' => '', '修改字段' => '', '栏目绑定' => '', '红=1,黄=2,蓝=3' => '', '关联模块内容ID' => '', '可以在页面动态新增内容输入框' => '', '温馨提示:排序和宽度在列表点击也可以更改。' => '', '排序:当前列表显示排序,不会影响录入排序,越大越靠前。' => '', '搜索:在列表顶部的搜索中,可以搜索该字段。' => '', '宽度:列表显示的宽度。由于屏幕宽度问题,可以根据自己关注的字段在列表中显示更清晰,默认100。' => '', '宽度' => '', '批量绑定栏目' => '', '字段' => '', '后台' => '', '确认要删除吗?删除的同时将删除对应的表内容!' => '', '角色管理' => '', '角色修改' => '', '是否超管' => '', '不是' => '', '超级管理员拥有无上权利,无视下面权限限制' => '', '发布审核' => '', '超级管理员除外,发布的内容是否需要审核' => '', '栏目权限' => '', '是否设置栏目权限,默认不设置。开启后下面的栏目权限设置才有效' => '', '选中顶级栏目,则默认子栏目也选中。如果只需要子栏目权限,请不要选中顶级栏目' => '', '子栏目' => '', '拥有权限' => '', '选中主模块,则默认子模块也选中。如果只需要子模块权限,请不要选中主模块' => '', '主模块' => '', '子模块' => '', '描述' => '', '请输入内容' => '', '关闭后,该分组管理员将不能登录' => '', '添加角色' => '', '后台管理' => '', '展开左侧栏' => '', '清理缓存' => '', '退出' => '', '前台首页' => '', '后台首页' => '', '我的桌面' => '', '关闭当前' => '', '关闭其他' => '', '关闭所有' => '', '扩展模块管理' => '', '批量修改分类' => '', '批量处理' => '', '友情链接分类' => '', '分类' => '', '后台管理登录' => '', '验证码' => '', '登录' => '', '登录ID' => '', '登录用户' => '', '模块' => '', '方法' => '', '操作时间' => '', '会员管理' => '', '新增会员' => '', '用于找回密码' => '', '手机号' => '', '必须唯一' => '', '昵称' => '', '分组' => '', '头像' => '', '生日' => '', '个性签名' => '', '省份' => '', '城市' => '', '详细地址' => '', '6到16个字符' => '', '添加成功' => '', '会员修' => '', '6到16个字符,不修改请留空' => '', '修改成功' => '', '会员列表' => '', '请输入手机号' => '', '余额' => '', '加入时间' => '', '分组管理' => '', '分组修改' => '', '分组名' => '', '折扣类型' => '', '无折扣' => '', '现金折扣' => '', '百分比折扣' => '', '折扣金额' => '', '百分比折扣请填写0.01-1之间的小数(如5折,填0.5),无折扣时,该参数设置无效' => '', '登录状态' => '', '请选择所属单位!' => '', '用户管理' => '', '会员分组' => '', '添加分组' => '', '温馨提示:前台权限已关闭,设置权限不会生效。' => '', '温馨提示:前台权限已开启,权限设置将直接影响前台访问,请谨慎操作!' => '', '留言管理' => '', '查看留言' => '', '问题描述' => '', '用户昵称' => '', '留言栏目' => '', '不指定栏目' => '', '联系电话' => '', '留言IP' => '', '留言内容' => '', '是否审核' => '', '提交时间' => '', '修改保存' => '', '留言列表' => '', '请输入相关内容ID' => '', '内容ID' => '', '模型管理' => '', '新增模型' => '', '模型名称' => '', '必须是英文字母,且不能是已存在的标识,标识即是数据库里的表名' => '', '是否必选栏目' => '', '新增修改内容时必选' => '', '是否显示栏目' => '', '列表展示、录入内容、修改内容三个页面是否展示栏目' => '', '是否受权限控制' => '', '不同角色可以通过控制栏目权限来限制查看内容' => '', '栏目绑定显示' => '', '栏目绑定时是否显示该模型' => '', '前台发布' => '', '前台是否允许发布' => '', '列表模板' => '', '默认列表模板' => '', '详情模板' => '', '默认详情模板' => '', '是否开启' => '', '数值越小越靠前' => '', '已有表' => '', '如果数据库已经有这个表了,就选择"是",否则就选"不是"' => '', '是否可以预览' => '', '如果后台无法预览,则选择 “否” ,列表中将不会出现 [预览]' => '', '修改模型' => '', '模型状态' => '', '模型分类' => '', '允许' => '', '已停用' => '', '已启用' => '', '重构字段' => '', '确认要删除吗?删除的同时将删除对应的表!' => '', '订单列表' => '', '订单详情' => '', '姓名' => '', '是否支付' => '', '已支付' => '', '未支付' => '', '支付时间' => '', '存储内容' => '', '订单内容' => '', '商品' => '', '商品已删除' => '', '收货信息:' => '', '收件人:' => '', '联系手机:' => '', '联系邮箱:' => '', '收货地址:' => '', '订单状态' => '', '订单已删除' => '', '已提交未支付' => '', '超时订单' => '', '订单更改为‘已出货’,点‘确定修改’后,将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '', '发货时间' => '', '确定修改' => '', '订单管理' => '', '选择状态' => '', '支付方式' => '', '线下支付' => '', '钱包支付' => '', '积分兑换' => '', '支付宝支付' => '', '微信支付' => '', '微信H5支付' => '', '微信扫码支付' => '', '支付宝H5支付' => '', '总收入' => '', '付款方式' => '', '是否付款' => '', '付款时间' => '', '图库管理' => '', '筛选上传入口' => '', '前台' => '', '筛选模块' => '', '其他杂项' => '', '系统配置' => '', '筛选栏目' => '', '上传前台' => '', '所属模块' => '', '本地文件' => '', '文件大小' => '', '其他' => '', '插件管理' => '', '插件列表' => '', '全部' => '', '本地' => '', '请输入插件名字' => '', '插件名' => '', '版本' => '', '作者' => '', '平台' => '', '插件文件' => '', '开关' => '', '安装说明' => '', '点击查看' => '', '更新说明' => '', '新' => '', '官方' => '', '第三方' => '', '开|停' => '', '配置' => '', '导出' => '', '卸载' => '', '安装' => '', '下载' => '', '获取文件大小失败,请检查网络!' => '', '正在安装中,请稍等~' => '', '正在删除中,请稍等~' => '', '正在卸载中,请稍等~' => '', '设置接口' => '', '当前版本:' => '', '最新版本:' => '', '作者:' => '', '更新时间:' => '', '更新内容' => '', '正在下载文件' => '', '升级插件' => '', '文件下载完成!正在解压~' => '', '文件解压完成!正在进行安装~' => '', '插件升级成功!' => '', '插件已升级完毕!' => '', '功能' => '', '函数名' => '', '对应的控制器/函数,如果是顶级,则只需要写控制器名' => '', '权限列表' => '', '添加权限' => '', '控制器/方法' => '', '添加子功能' => '', '权限管理' => '', '栏目选择' => '', '权限选择' => '', '不能选择的权限是非独立功能' => '', '请先勾选菜单!' => '', '扩展信息' => '', '回收站' => '', '还原' => '', '批量恢复' => '', '确认要删除吗?删除后就彻底无法恢复了!' => '', '确认要删除吗?删除后不可恢复!' => '', '确认要还原吗?' => '', '重构字段可以快速将外部表引入CMS内,使其兼容CMS模型。' => '', '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '', '温馨提示:外部表必须有个字段为id,且必须是自增主键。如果没有,请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '', '数据类型' => '', '录入类型' => '', '归属' => '', '插件' => '', '独立功能' => '', '桌面管理配置时,将调用独立功能' => '', '手机端已开启,sitemap将包含手机端URL,请注意【手机静态目录' => '', '如果不生成静态文件,请改为' => '', '手机端未开启,sitemap不会包含手机端URL' => '', 'PC端网站地图:' => '', '手机端网站地图:' => '', '网站地图' => '', '模块名称' => '', '更新频率' => '', '站内权重' => '', '输出范围' => '', '栏目模块' => '', '显示的栏目' => '', '所有的栏目' => '', '文章模块' => '', '显示的文章' => '', '所有的文章' => '', '商品模块' => '', '显示的商品' => '', '所有的商品' => '', '显示的' => '', '所有的' => '', '立即生成' => '', '网站设置' => '', '自定义配置' => '', '点击复制' => '', '上传文件' => '', '不选' => '', '删除配置栏' => '', '选择类型' => '', '编辑器' => '', '文件上传' => '', '下拉选项' => '', '栏目选项' => '', '代码' => '', '请填写配置名(中文)' => '', '配置标识(字母或数字)' => '', '配置栏目' => '', '提示信息' => '', '自定义配置可以配置对应配置栏下的自定义内容' => '', '下拉选项配置,如:开启=1,关闭=0' => '', '自定义配置栏' => '', '请填写配置栏名(中文)' => '', '配置标识(必须是字母)' => '', '配置标识用于权限控制,必填且不能与原系统配置栏重复' => '', '失败!' => '', '模板管理' => '', '模板列表' => '', '请输入模板名字' => '', '有更新' => '', '已使用' => '', '备份数据' => '', '安装模板' => '', '如果数据量较大,不建议通过此方法备份数据库,可以从数据库中直接导出。确定要备份数据库吗?' => '', '提示' => '', '安装提示' => '', '该模板用于:' => '', 'PC端' => '', '手机端' => '', '微信端' => '', '升级模板' => '', '模板升级成功!' => '', '模板已升级完毕!' => '', '您已开启【缓存完整页面】,更新静态HTML需要预留足够的空间,如:总内存500M,已用280M(过半),不建议生成HMTL,可能会导致内存不够!' => '', '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '', '请确定空间内存是否足够,如果不够,可以开启【缓存完整页面】,也能达到静态访问打开页面速度!' => '', '指定栏目' => '', '所有栏目' => '', '生成电脑静态' => '', '生成手机静态' => '', '清理电脑静态HTML' => '', '清理手机静态HTML' => '', '批量生成电脑静态' => '', '批量生成手机静态' => '', '批量清理电脑静态' => '', '批量清理手机静态' => '', '正在处理~' => '', '正在准备生成静态,请不要关闭页面~' => '', '正在准备清理电脑端静态HTML,请不要关闭页面~' => '', '正在准备清理手机端静态HTML,请不要关闭页面~' => '', '欢迎管理员:' => '', '当前时间' => '', '站内用户' => '', '人' => '', '站内文章' => '', '篇' => '', '站内产品' => '', '件' => '', '站内留言' => '', '最近更新' => '', '全部文章' => '', '阅读量' => '', '最新评论' => '', '在' => '', '发布了评论' => '', '版本信息' => '', '当前版本' => '', '项目地址' => '', '服务器' => '', '操作系统' => '', '运行环境' => '', 'PHP版本' => '', '运行方式' => '', '上传限制' => '', '用户留言' => '', '回复' => '', '星期天' => '', '星期一' => '', '星期二' => '', '星期三' => '', '星期四' => '', '星期五' => '', '星期六' => '', '评论模块未开启!' => '', '您的操作过于频繁,请十分钟后再试~' => '', '评论内容不能为空!' => '', '请提交栏目ID' => '', '栏目ID不能为空!' => '', '评论奖励' => '', '评价成功!' => '', '您未登录,请重新登录~' => '', '您没有' => '', '的权限!' => '', '您还未登录,请重新登录!' => '', '上传成功!' => '', '已关闭前台上传文件功能' => '', '上传错误!' => '', '对不起,您没有访问权限!' => '', '输入url错误!' => '', '缺少ID!' => '', '未找到相应内容!' => '', '请输入关键词搜索!' => '', '搜索超出设定范围!' => '', '您的搜索超出设定范围!' => '', '系统创建' => '', '目录失败!' => '', '支付成功,但是系统内没有找到相应的订单!' => '', '支付失败' => '', '订单号错误!' => '', '会员中心已关闭!' => '', '您的账户已被冻结!' => '', '未找到您所在分组,请联系管理员处理!' => '', '您所在的分组被限制登录!' => '', '登录奖励' => '', '系统已关闭会员注册!' => '', '您的邀请链接不合法!' => '', '手机号格式不正确!' => '', '您的邮箱已注册!' => '', '您的手机号码已注册!' => '', '邀请奖励' => '', '注册成功,等待审核!' => '', '注册成功!' => '', '注册失败,请重试~' => '', '必须通过邀请链接进行注册!' => '', '请输入账号和邮箱!' => '', '图形验证码错误!' => '', '找回密码' => '', '您的账号正在进行找回密码操作,如果确定是本人操作,请在10分钟内点击' => '', '立即找回密码' => '', '过期失效!' => '', '您操作过于频繁,请10分钟后再尝试!' => '', '找回密码邮件已发送,请到您的邮箱查看!' => '', '邮箱服务器未配置,无法发送邮件,请联系管理员找回密码!' => '', '输入的信息有误!' => '', 'token已失效!' => '', '密码重置成功,请重新登录!' => '', '新密码不能与旧密码相同!' => '', '标题不能为空!' => '', '称呼不能为空!' => '', '您的手机号格式不正确!' => '', '不能为空!' => '', '提交成功!我们会尽快回复您!' => '', '提交失败,请重试!' => '', '链接错误' => '', '留言未找到或者未审核' => '', '匿名' => '', '缺少id参数!' => '', '缺少tid参数!' => '', '未找到商品或者已下架!' => '', '该模块缺少price价格参数!' => '', '您的订单提交成功通知' => '', '我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!' => '', '订单详细信息如下' => '', '折扣' => '', '运费' => '', '合计' => '', '收件地址' => '', '您的订单' => '', '已经提交,我们会尽快给您发货!' => '', '订单已支付!' => '', '已经提交,请尽快支付!' => '', '支付订单' => '', '电脑支付宝支付' => '', '微信内支付' => '', '未开启钱包支付!' => '', '您未登录,无法支付!' => '', '钱包金额不足,请充值!' => '', '未开启积分支付!' => '', '积分不足,请充值!' => '', '支付宝当面付' => '', '其他平台支付' => '', '在线充值' => '', '交易创建,等待买家付款' => '', '未付款交易超时关闭,或支付完成后全额退款' => '', '支付成功' => '', '交易结束,不可退款' => '', '未知状态' => '', '订单号错误或订单被删除!' => '', '订单未支付或订单号错误!' => '', '创建订单失败!' => '', '订单号不存在或已被删除!' => '', '收件人、手机号和收货地址不能为空!' => '', '未开启在线支付!' => '', '获取openid失败' => '', '非法参数!' => '', '标签未找到或已删除!' => '', '手机号码格式错误!' => '', '账户不能为空!' => '', '订单已过期,不可支付!' => '', '订单已支付,请勿重复操作!' => '', '缺少订单号!' => '', '网络错误,请刷新后重试!' => '', '未找到评论!' => '', '已取消点赞!' => '', '点赞成功!' => '', '栏目未绑定模型,无法喜欢!' => '', '取消点赞' => '', '点赞奖励' => '', '已被删除 ' => '', '栏目未绑定模型,无法收藏!' => '', '取消收藏' => '', '收藏奖励' => '', '收藏成功!' => '', '已被删除' => '', '库存不足!' => '', '该模块不允许发布!' => '', '添加失败,存在敏感词' => '', '分类错误!' => '', '该分类不允许发布!' => '', '您没有权限在该分类发布内容!' => '', '内容不能为空!' => '', '库存不能为0!' => '', '未修改内容,不能提交!' => '', '发布失败,请重试!' => '', '发布成功!' => '', '未找到您要的文章!' => '', '您已经关注了该用户!' => '', '您不能关注自己!' => '', '关注奖励' => '', '关注成功!' => '', '您没有关注该用户,无法操作!' => '', '取关成功!' => '', '消息已被删除!' => '', '用户未找到!' => '', '未分类 ' => '', '设置成功' => '', '设置成功!' => '', '记录不存在!' => '', '缺少栏目ID!' => '', '系统未配置微信登录!' => '', '微信已绑定!' => '', '您的微信已被绑定,不能再绑定!' => '', '系统版号' => '', '版本号是系统自带,请勿改动' => '', '网站SEO名称' => '', '控制在25个字、50个字节以内' => '', '网站SEO关键词' => '', '5个左右,8汉字以内,用英文逗号隔开' => '', '网站SEO描述' => '', '控制在80个汉字,160个字符以内' => '', '统计代码' => '', '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '', '底部版权' => '', '如:© 2016 xxx版权' => '', '备案号' => '', '如:京ICP备00000000号' => '', '网站电话' => '', '网站联系电话' => '', '400电话' => '', '网站QQ' => '', '网站邮箱' => '', '公司地址' => '', 'PC网站模板' => '', '将模板名称填写到此处' => '', 'WAP网站模板' => '', '开启了手机端,这个设置才会生效,否则调用电脑端模板' => '', '微信网站模板' => '', '开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板' => '', '是否开启手机端' => '', '如果不开启手机端,则默认调用电脑端模板' => '', '是否开启前台上传' => '', '关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。' => '', '是否开启前台权限' => '', '开启后前台用户权限可以在后台控制' => '', '缓存时间' => '', '单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。此设置与缓存完整页面,模板缓存有关。' => '', '限制上传文件大小' => '', '0代表不限,单位kb' => '', '允许上传文件类型' => '', '请用|分割,如:pdf|jpg|png' => '', '前台UEditor编辑器导航条配置' => '', '允许前台搜索的表' => '', '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product' => '', '上传图片压缩比例' => '', '100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80' => '', 'PNG是否压缩' => '', 'PNG压缩后容易变成背景黑色,关闭后,不会压缩。' => '', '邮件服务器' => '', 'smtp.163.com,smtp.qq.com' => '', '邮件收发端口' => '', '163、126邮件端口(465),QQ邮件端口(587)' => '', '收件人Email地址' => '', '发件人Email地址' => '', '指邮件服务器发件邮箱' => '', '发件人Email秘钥' => '', '这个秘钥不是登录密码' => '', '发件人昵称' => '', '发件邮箱会带一个昵称' => '', '客户订单通知' => '', '购买商品的时候会发送的一条邮件信息' => '', '订单出货通知' => '', '发货的时候发送给客户的通知' => '', '订单运费' => '', '购物下单时会加上这个运费' => '', '在线支付' => '', '0关闭支付,1自主平台支付' => '', '极致平台接口' => '', '极致平台商户' => '', '极致平台应用appid' => '', '极致平台应用秘钥' => '', '支付宝APPID' => '', '账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID' => '', '支付宝key' => '', 'MD5密钥,安全检验码,由数字和字母组成的32位字符串' => '', '支付宝私钥' => '', '支付宝公钥' => '', '微信商户mchid' => '', '支付相关' => '', '微信商户key' => '', '微信公众号appid' => '', '微信公众号appsecret' => '', '微信apiclient_cert' => '', '微信apiclient_key' => '', '公众号appid' => '', '用户登录相关,如果跟支付的一样,那就再填写一遍' => '', '公众号appsecret' => '', '公众号token' => '', '公众号关注欢迎语' => '', '公众号关注时发送的第一句推送' => '', '网站LOGO' => '', '后台模板风格' => '', '内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。' => '', '是否绑定多域名' => '', '开启绑定多域名后,需要到插件中配置' => '', '网站SEO网址' => '', '一般不填,全局网址,最后不带/,如:http://www.xxx.com' => '', '基本信息下扩展' => '', '新增字段是否显示在【基本信息】底部,默认在【扩展信息】下' => '', '订单超时' => '', '按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制' => '', '开启层级URL' => '', '默认关闭层级URL,开启后URL会按照父类层级展现' => '', '缓存完整页面' => '', '前台完整页面缓存,结合缓存时间,可以提高访问速度' => '', '自动生成静态HTML' => '', '前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面' => '', 'PC静态文件目录' => '', '电脑端静态HTML存放目录,默认根目录[ / ]' => '', 'WAP静态文件目录' => '', '手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱' => '', '是否留言自动审核' => '', '开启后,留言自动审核(显示)' => '', '是否评论自动审核' => '', '开启后评论自动审核(显示)' => '', '网站敏感词过滤' => '', '将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容' => '', '是否开启水印' => '', '开启水印需要上传水印图片' => '', '水印图片' => '', '水印图片在250px以内' => '', '水印位置' => '', '参考键盘九宫格1-9' => '', '水印透明度' => '', '透明度越大,越难看清楚水印' => '', '钱包兑换率' => '', '站内钱包与RMB的兑换率,即1元=多少金币' => '', '积分兑换率' => '', '站内积分与RMB的兑换率,即1元=多少积分' => '', '积分支付' => '', '开启积分支付后,商品可以用积分支付' => '', '开启钱包支付后,商品可以用钱包支付' => '', '开启微信支付后,商品可以用微信支付' => '', '开启支付宝支付后,商品可以用支付宝支付' => '', '每次登录奖励' => '', '每天登录奖励积分数,最小为0,每天登录只奖励一次' => '', '开启登录奖励后,登录后就会获得积分奖励' => '', '开启后,发布内容会奖励积分' => '', '每次发布奖励' => '', '每次发布内容奖励积分数' => '', '每天发布最高奖励' => '', '每天奖励不超过积分上限,设置0则无上限' => '', '开启后,发布内容被收藏会奖励积分' => '', '每次收藏奖励' => '', '每次发布内容被收藏奖励积分数' => '', '每天收藏最高奖励' => '', '开启后,发布内容被点赞会奖励积分' => '', '每次点赞奖励' => '', '每次发布内容被点赞奖励积分数' => '', '每天点赞最高奖励' => '', '开启后,发布内容被评论会奖励积分' => '', '每次评论奖励' => '', '每次发布内容被评论奖励积分数' => '', '每天评论最高奖励' => '', '开启后,用户被粉丝关注会奖励积分' => '', '每次关注奖励' => '', '每次被关注奖励积分数' => '', '每天关注最高奖励' => '', '每天关注奖励不超过积分上限,设置0则无上限' => '', '发送邮件' => '', '是否开启邮件发送' => '', '关闭网站' => '', '关闭网站后,前台无法访问,后台可以进入' => '', '关站提示' => '', '后台文件存储路径' => '', '默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]' => '', '前台文件存储路径' => '', '是否开启前台AJAX' => '', '开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据' => '', '自动生成sitemap' => '', '开启后,前台访问每天会自动生成1次sitemap' => '', '是否开启邀请奖励' => '', '开启邀请后则会奖励' => '', '邀请奖励类型' => '', '邀请奖励数量' => '', '网站手机' => '', '站长微信' => '', '开启多图描述' => '', '开启后图集每张图可以添加描述,注意模板输出需要更改输出方式!(附件同理)' => '', '前台用户注册' => '', '关闭前台注册后,前台无法进入注册页面' => '', '仅邀请码注册' => '', '开启后,必须通过邀请链接才能注册!' => '', '允许前台发布模块' => '', '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '', '前台搜索的字段' => '', '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '', '前台验证码' => '', '关闭后,登录注册不需要验证码' => '', '后台验证码' => '', '关闭后,后台管理员登录不需要验证码' => '', 'TAG包含模型' => '', '在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product' => '', '支付配置' => '', '前台多模块搜索的字段' => '', '多个模块直接必须都有相同的字段,否则会报错' => '', '多模块允许搜索的表' => '', '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product' => '', '允许查询显示的字段' => '', '多模块搜索允许查询显示的字段' => '', '前台编辑器设置' => '', '前台的编辑器功能菜单设置' => '', 'PHP调试' => '', '测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。' => '', '前台SESSION' => '', '关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以开启,使用会员支付等必须关闭' => '', '留言验证码' => '', '开启后,前台留言需要填写验证码' => '', '前台发布审核' => '', '开启后需要后台审核,关闭则不需要' => '', '公共权限' => '', '前台网站' => '', '会员登录' => '', '会员评论' => '', '网站筛选' => '', '会员下单' => '', '网站支付' => '', '极致支付' => '', '微信模块' => '', '验证码生成' => '', '检查是否登录' => '', '多附件上传' => '', '单附件上传' => '', '二维码生成' => '', '获取扩展信息' => '', '链接错误提示' => '', '报错提示' => '', '网站内容' => '', '详情内容' => '', '网站搜索' => '', '网站多模块搜索' => '', '开启网站缓存' => '', '输出缓存' => '', '个人中心首页' => '', '会员资料' => '', '订单记录' => '', '订单支付' => '', '删除订单' => '', '上传头像' => '', '删除评论' => '', '点赞文章' => '', '点赞列表' => '', '收藏文章' => '', '收藏列表' => '', '删除收藏' => '', '购物车' => '', '添加购物车' => '', '删除购物车' => '', '发布管理' => '', '会员发布' => '', '删除发布' => '', '会员上传附件' => '', '404提示' => '', '关注用户' => '', '取消关注' => '', '粉丝列表' => '', '消息提醒' => '', '查看消息' => '', '删除消息' => '', '公共主页' => '', '消息提醒设置' => '', '获取栏目列表' => '', '用户钱包' => '', '交易详情' => '', '登录首页' => '', '注册页面' => '', '忘记密码' => '', '未登录页面' => '', '退出登录' => '', '发送留言' => '', '发表评论' => '', '筛选列表' => '', '创建订单' => '', 'TAG标签列表' => '', '会员' => '', '订单' => '', '评论' => '', '留言' => '', '轮播图' => '', '友情链接' => '', 'TAG' => '', '单页' => '', '用户评价' => '', '添加会员' => '', '修改会员' => '', '删除会员' => '', '修改状态' => '', '内容管理' => '', '内容列表' => '', '添加内容' => '', '修改内容' => '', '删除内容' => '', '复制内容' => '', '修改评论' => '', '修改留言' => '', '删除留言' => '', '字段列表' => '', '删除字段' => '', '获取字段' => '', '基本功能' => '', '系统界面' => '', '数据库备份' => '', '数据库还原' => '', '数据库删除' => '', '系统功能' => '', '栏目管理' => '', '栏目列表' => '', '新增栏目' => '', '修改栏目' => '', '删除栏目' => '', '修改排序' => '', '栏目隐藏' => '', '新增角色' => '', '修改角色' => '', '删除角色' => '', '角色状态' => '', '新增管理员' => '', '修改管理员' => '', '管理员状态' => '', '删除管理员' => '', '模型列表' => '', '删除模型' => '', '新增权限' => '', '修改权限' => '', '删除权限' => '', '桌面设置' => '', '新增桌面' => '', '修改桌面' => '', '删除桌面' => '', '图标库' => '', '模块扩展' => '', '删除轮播图' => '', '复制轮播图' => '', '批量删除轮播图' => '', '新增轮播图分类' => '', '修改轮播图分类' => '', '删除轮播图分类' => '', '新增友链' => '', '修改友链' => '', '复制友链' => '', '删除友链' => '', '批量删除友链' => '', '通用模块' => '', '更新cookie' => '', '商品管理' => '', '商品列表' => '', '修改商品' => '', '删除商品' => '', '复制商品' => '', '登录日志' => '', '新增分组' => '', '修改分组' => '', '更改分组状态' => '', '删除分组' => '', '会员权限' => '', '修改分组排序' => '', '上传支付证书' => '', '更改状态' => '', '安装卸载' => '', '删除图库图片' => '', '批量删除图库' => '', '微信公众号' => '', '公众号菜单' => '', '公众号素材' => '', '模板制作' => '', '获取首字母拼音' => '', '批量新增栏目' => '', '自定义配置删除' => '', 'TAG列表' => '', '新增TAG' => '', '修改TAG' => '', '复制TAG' => '', '删除TAG' => '', '批量删除TAG' => '', '生成静态文件' => '', '更新栏目HTML' => '', '更新模块HTML' => '', '批量修改推荐属性' => '', '批量修改友链栏目' => '', '批量修改TAG栏目' => '', '批量复制友链' => '', '批量复制TAG' => '', '批量修改友链排序' => '', '批量修改TAG排序' => '', '高级设置' => '', '邮箱订单' => '', '公众号配置' => '', '批量审核友链' => '', '批量审核TAG' => '', '手动充值' => '', '删除记录' => '', '批量删除记录' => '', '积分配置' => '', '插件更新' => '', '获取栏目模板' => '', '友链分类' => '', '新增友链分类' => '', '修改友链分类' => '', '删除友链分类' => '', '导航设置' => '', '删除导航' => '', '碎片化' => '', '删除碎片' => '', '预览SQL' => '', '搜索配置' => '', '修改字段属性' => '', '新增推荐属性' => '', '删除推荐属性' => '', '列表设置' => '', '获取列表字段' => '', '内链模块' => '', '内链列表' => '', '新增内链' => '', '删除内链' => '', '删除数据' => '', '模板更新' => '', '用户评价列表' => '', '新增用户评价' => '', '修改用户评价' => '', '复制用户评价' => '', '删除用户评价' => '', '批量删除用户评价' => '', '批量修改用户评价栏目' => '', '批量复制用户评价' => '', '批量修改用户评价列表' => '', '批量审核用户评价' => '', '基本设置' => '', '邮件订单' => '', '非超级管理员无法设置!' => '', '你确定要还原吗?' => '', ); ?> ================================================ FILE: app/home/lang/cht.php ================================================ '該角色下存在用戶,請先移除用戶再刪除!', '删除失败,该分组不允许删除!' => '刪除失敗,該分組不允許刪除!', '删除成功!' => '刪除成功!', '删除失败,请重试!' => '刪除失敗,請重試!', '非法操作!' => '非法操作!', '修改失败,您的权限不足!' => '修改失敗,您的權限不足!', '修改成功!' => '修改成功!', '修改失败,请重新提交!' => '修改失敗,請重新提交!', '没有该角色!' => '沒有該角色!', '新增成功!' => '新增成功!', '新增失败,请重新提交!' => '新增失敗,請重新提交!', '修改失败,该分组不允许修改!' => '修改失敗,該分組不允許修改!', '您没有权限操作!' => '您沒有權限操作!', '两次密码不同!' => '兩次密碼不同!', '手机号已被注册!' => '手機號已被註冊!', '昵称已被使用!' => '暱稱已被使用!', '邮箱已被使用!' => '郵箱已被使用!', '修改失败!' => '修改失敗!', '新增失败!' => '新增失敗!', '系统管理员不能删除!' => '系統管理員不能刪除!', '删除失败!' => '刪除失敗!', '批量操作失败!' => '批量操作失敗!', '批量删除成功!' => '批量刪除成功!', '添加失败' => '添加失敗', '存在敏感词' => '存在敏感詞', '已存在相同的自定义URL!' => '已存在相同的自定義URL!', '添加成功,继续添加~' => '添加成功,繼續添加~', '内容配置' => '內容配置', '修改失败' => '修改失敗', '发布奖励' => '發布獎勵', '您未做任何修改,不能提交!' => '您未做任何修改,不能提交!', '复制成功!' => '複製成功!', '复制失败!' => '複製失敗!', '批量复制成功!' => '批量複製成功!', '批量修改成功!' => '批量修改成功!', '批量操作成功!' => '批量操作成功!', 'URL链接命名不能是' => 'URL連結命名不能是', '非法URL' => '非法URL', '添加栏目成功,继续添加~' => '添加欄目成功,繼續添加~', '模型错误!' => '模型錯誤!', '不能选择当前栏目及下级为顶级栏目' => '不能選擇當前欄目及下級為頂級欄目', '该栏目有子栏目,请先删除子栏目!' => '該欄目有子欄目,請先刪除子欄目!', '栏目不能为空!' => '欄目不能為空!', '操作成功!' => '操作成功!', '请选择分类!' => '請選擇分類!', '添加成功!继续添加~' => '添加成功!繼續添加~', '添加失败!' => '添加失敗!', '该分类下存在内容,请先删除该分类下的内容!' => '該分類下存在內容,請先刪除該分類下的內容!', '添加成功!' => '添加成功!', '已审核' => '已審核', '被删除' => '被刪除', '未审核' => '未審核', '已读' => '已讀', '未读' => '未讀', '批量审核成功!' => '批量審核成功!', '批量审核失败!' => '批量審核失敗!', '您没有权限!' => '您沒有權限!', '文件类型不允许上传!' => '文件類型不允許上傳!', '文件大小超过网站内部限制!' => '文件大小超過網站內部限制!', '请检查目录写入权限' => '請檢查目錄寫入權限', '错误信息提示' => '錯誤信息提示', '模块为空,请选择模块!' => '模塊為空,請選擇模塊!', '缺少ID' => '缺少ID', '请选择模块!' => '請選擇模塊!', '显示' => '顯示', '隐藏' => '隱藏', '是' => '是', '否' => '否', '单行文本' => '單行文本', '多行文本' => '多行文本', '文本编辑器' => '文本編輯器', '数字' => '數字', '单图片' => '單圖片', '多图片' => '多圖片', '单选下拉' => '單選下拉', '多选' => '多選', '单附件' => '單附件', '多附件' => '多附件', '时间戳' => '時間戳', '单选按钮' => '單選按鈕', '单选关联' => '單選關聯', '小数' => '小數', '多行录入' => '多行錄入', '多选关联' => '多選關聯', '栏目' => '欄目', '副栏目' => '副欄目', '系统TAG' => '系統TAG', '字段名和字段标识不能为空!' => '欄位名和欄位標識不能為空!', '字段标识已存在!' => '欄位標識已存在!', '系统保护字段,不允许创建!' => '系統保護欄位,不允許創建!', '字段长度不对!' => '欄位長度不對!', '字段长度不对,时间属性必须长度为11' => '欄位長度不對,時間屬性必須長度為11', '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '欄位長度不對,decimal欄位長度格式[整數位數,小數位數]', '字段创建成功,但是字段表记录失败,请反馈官方解决!' => '欄位創建成功,但是欄位表記錄失敗,請反饋官方解決!', '字段创建成功!' => '欄位創建成功!', '字段修改成功!' => '欄位修改成功!', '字段修改失败!' => '欄位修改失敗!', '上传图片' => '上傳圖片', '选择图片' => '選擇圖片', '图片未找到' => '圖片未找到', '删除这张图片' => '刪除這張圖片', '删除' => '刪除', '上传异常!' => '上傳異常!', '文字描述' => '文字描述', '左移' => '左移', '右移' => '右移', '请选择' => '請選擇', '上传附件' => '上傳附件', '字段关联绑定失败,请重新绑定!' => '欄位關聯綁定失敗,請重新綁定!', '请选择关联项' => '請選擇關聯項', 'TAG标签' => 'TAG標籤', '按Enter回车自动添加' => '按Enter回車自動添加', '添加一个标签' => '添加一個標籤', '系统字段不允许删除!' => '系統欄位不允許刪除!', '请选择字段!' => '請選擇欄位!', '请选择栏目!' => '請選擇欄目!', '参数有误!' => '參數有誤!', '请选择桌面配置!' => '請選擇桌面配置!', '系统默认不可删除!' => '系統默認不可刪除!', '网站地图创建成功!' => '網站地圖創建成功!', '网站地图创建失败,请检查根目录权限!' => '網站地圖創建失敗,請檢查根目錄權限!', '清除失败!' => '清除失敗!', '清除成功!' => '清除成功!', '生成失败!' => '生成失敗!', '生成成功!' => '生成成功!', '已清理一部分页面,请不要关闭当前页面,还需要继续清理HTML~' => '已清理一部分頁面,請不要關閉當前頁面,還需要繼續清理HTML~', '已生成一部分页面,请不要关闭当前页面,还需要继续生成HTML~' => '已生成一部分頁面,請不要關閉當前頁面,還需要繼續生成HTML~', '静态HTML页面已全部清理完毕!' => '靜態HTML頁面已全部清理完畢!', '总共清理页面数:' => '總共清理頁面數:', '每次清理页面数:' => '每次清理頁面數:', '停顿时间:' => '停頓時間:', '开始时间:' => '開始時間:', '结束时间:' => '結束時間:', '总共花费时间:' => '總共花費時間:', '总共生成页面数:' => '總共生成頁面數:', '每次生成页面数:' => '每次生成頁面數:', '系统创建目录失败!' => '系統創建目錄失敗!', '模块未绑定栏目,无法生存HTML!' => '模塊未綁定欄目,無法生存HTML!', '链接错误!' => '連結錯誤!', '请输入属性名称!' => '請輸入屬性名稱!', '属性已存在!' => '屬性已存在!', '参数错误!' => '參數錯誤!', '系统属性只允许修改和隐藏,不允许删除!' => '系統屬性只允許修改和隱藏,不允許刪除!', '请输入内链词!' => '請輸入內鏈詞!', '请输入内链!' => '請輸入內鏈!', '内链词已存在!' => '內鏈詞已存在!', '已审' => '已審', '退回' => '退回', '未审' => '未審', '账户密码不能为空!' => '帳戶密碼不能為空!', '验证码错误!' => '驗證碼錯誤!', '该账户已被封禁!' => '該帳戶已被封禁!', '登录成功!' => '登錄成功!', '账户密码错误!' => '帳戶密碼錯誤!', '安全退出~' => '安全退出~', '无' => '無', '不显示' => '不顯示', '邮箱已被注册!' => '郵箱已被註冊!', '添加失败,请重新提交!' => '添加失敗,請重新提交!', '没有找到该用户!' => '沒有找到該用戶!', '该分组下存在用户,请先移除用户再删除!' => '該分組下存在用戶,請先移除用戶再刪除!', '删除失败,该分类有下级功能,请先删除下级功能!' => '刪除失敗,該分類有下級功能,請先刪除下級功能!', '未选择删除对象!' => '未選擇刪除對象!', '模块名和标识不能为空!' => '模塊名和標識不能為空!', '模型已添加不能重复添加!' => '模型已添加不能重複添加!', '该表已存在!' => '該表已存在!', '标题' => '標題', '默认为空' => '默認為空', '所属栏目' => '所屬欄目', '选择栏目' => '選擇欄目', '绑定后可以在当前模型的其他栏目中显示' => '綁定後可以在當前模型的其他欄目中顯示', '关键词' => '關鍵詞', '每个词用英文逗号(,)拼接' => '每個詞用英文逗號(,)拼接', '缩略图' => '縮略圖', '可留空' => '可留空', '简介' => '簡介', '内容' => '內容', '发布会员' => '發布會員', '前台发布会员ID记录' => '前台發布會員ID記錄', '管理员' => '管理員', '后台发布管理员ID记录' => '後台發布管理員ID記錄', '外链URL' => '外鏈URL', '默认为空,系统访问内容则直接跳转到此链接' => '默認為空,系統訪問內容則直接跳轉到此連結', '自定义URL' => '自定義URL', '默认为空,自定义URL' => '默認為空,自定義URL', '点击量' => '點擊量', '系统自动添加' => '系統自動添加', '评论数' => '評論數', '系统自带' => '系統自帶', '点赞数' => '點讚數', '排序' => '排序', '添加时间' => '添加時間', '选择时间' => '選擇時間', '推荐属性' => '推薦屬性', '1置顶2热点3推荐' => '1置頂2熱點3推薦', '置顶=1,热点=2,推荐=3' => '置頂=1,熱點=2,推薦=3', '是否显示' => '是否顯示', '显示隐藏' => '顯示隱藏', '显示=1,未审=0,退回=2' => '顯示=1,未審=0,退回=2', '列表' => '列表', '新增' => '新增', '修改' => '修改', '复制' => '複製', '批量删除' => '批量刪除', '批量修改' => '批量修改', '批量复制' => '批量複製', '批量审核' => '批量審核', '管理' => '管理', '新增模型成功,快去创建对应的栏目吧!' => '新增模型成功,快去創建對應的欄目吧!', '新增模型成功,快去设置表字段吧!' => '新增模型成功,快去設置表欄位吧!', '新增模型失败!' => '新增模型失敗!', '标识不能为空!' => '標識不能為空!', '系统模型标识不允许修改!' => '系統模型標識不允許修改!', '页面有错误,缺少模块ID!' => '頁面有錯誤,缺少模塊ID!', '里面存在数据,请先清空表内数据!' => '裡面存在數據,請先清空表內數據!', '是系统模型,不允许删除!' => '是系統模型,不允許刪除!', '字段表记录未清除,请手动清除!' => '欄位表記錄未清除,請手動清除!', '模型' => '模型', '用户' => '用戶', '栏目链接' => '欄目連結', '外链' => '外鏈', '自定义链接' => '自定義連結', '发布时间' => '發布時間', '字段名称不能为空!' => '欄位名稱不能為空!', '显示=1,隐藏=0' => '顯示=1,隱藏=0', '显示=1,隐藏=0,退回=2' => '顯示=1,隱藏=0,退回=2', '是=1,否=0' => '是=1,否=0', '重构成功!' => '重構成功!', '系统栏目' => '系統欄目', '系统副栏目' => '系統副欄目', '模型标识' => '模型標識', '发布管理员' => '發布管理員', '前台用户' => '前台用戶', '待付款' => '待付款', '已付' => '已付', '超时' => '超時', '待审核待支付' => '待審核待支付', '已发货' => '已發貨', '已废弃' => '已廢棄', '未付' => '未付', '您的订单发货通知' => '您的訂單發貨通知', '尊敬的' => '尊敬的', '您的订单已发货了,这几天请您留意一下快递,谢谢您的惠顾!期待再次为您服务!' => '您的訂單已發貨了,這幾天請您留意一下快遞,謝謝您的惠顧!期待再次為您服務!', '订单详细信息如下:' => '訂單詳細信息如下:', '主图' => '主圖', '价格' => '價格', '购买数量' => '購買數量', '总价' => '總價', '折扣:' => '折扣:', '元' => '元', '运费:' => '運費:', '¥' => '¥', '合计:' => '合計:', '收件地址:' => '收件地址:', '联系电话:' => '聯繫電話:', '钱包' => '錢包', '积分' => '積分', '充值' => '充值', '兑换' => '兌換', '奖励' => '獎勵', '该用户不存在!' => '該用戶不存在!', '充值数量不对!' => '充值數量不對!', '操作失败!' => '操作失敗!', '插件配置' => '插件配置', '未分类' => '未分類', '商品配置' => '商品配置', '批量复制失败!' => '批量複製失敗!', '部分未执行成功!' => '部分未執行成功!', '还原失败,可能是ID已经存在!' => '還原失敗,可能是ID已經存在!', '数据不存在!' => '數據不存在!', '删除失败,系统功能不能删除!' => '刪除失敗,系統功能不能刪除!', '配置栏下有自定义配置,无法删除配置栏' => '配置欄下有自定義配置,無法刪除配置欄', '已存在配置标识,请重新设置!' => '已存在配置標識,請重新設置!', '提交成功!' => '提交成功!', '删除失败!系统字段不允许删除!' => '刪除失敗!系統欄位不允許刪除!', '图片不存在,删除失败!' => '圖片不存在,刪除失敗!', '远程存储图片无法删除!' => '遠程存儲圖片無法刪除!', '图片ID错误!' => '圖片ID錯誤!', '部分删除成功,存在远程链接无法删除!' => '部分刪除成功,存在遠程連結無法刪除!', '非法操作' => '非法操作', '请检查目录' => '請檢查目錄', '写入权限' => '寫入權限', '配置成功!' => '配置成功!', '参数存在安全隐患!' => '參數存在安全隱患!', '参数错误,必须携带插件ID!' => '參數錯誤,必須攜帶插件ID!', '发生错误' => '發生錯誤', '下载缓存文件不存在!' => '下載緩存文件不存在!', '请选择使用场景!' => '請選擇使用場景!', '执行插件安装程序失败!' => '執行插件安裝程序失敗!', '安装成功!' => '安裝成功!', '备份成功!' => '備份成功!', '该插件暂无更新!' => '該插件暫無更新!', '参数错误,请选择对应模板!' => '參數錯誤,請選擇對應模板!', '文件不存在!' => '文件不存在!', '解压失败!' => '解壓失敗!', '数据库中没有表!' => '資料庫中沒有表!', '写入文件失败!' => '寫入文件失敗!', ' 写入文件失败!' => ' 寫入文件失敗!', '解压完毕!本次解压花费' => '解壓完畢!本次解壓花費', '秒' => '秒', '更新成功!' => '更新成功!', '个人中心' => '個人中心', '测试1' => '測試1', '测试2' => '測試2', '测试3' => '測試3', '接口报错' => '接口報錯', '微信配置错误!' => '微信配置錯誤!', '网站首页' => '網站首頁', '首页' => '首頁', '碎片化管理' => '碎片化管理', '新增碎片' => '新增碎片', '刷新' => '刷新', '基本信息' => '基本信息', '使用说明' => '使用說明', '指定几个id或者几个tid的内容输出' => '指定幾個id或者幾個tid的內容輸出', 'SQL中输入' => 'SQL中輸入', '或者' => '或者', '模糊查询,查询标题跟 “网站建设” 相关的内容' => '模糊查詢,查詢標題跟 「網站建設」 相關的內容', '网站建设' => '網站建設', '模糊查询,查询标题/内容跟 “网站建设” 相关的内容' => '模糊查詢,查詢標題/內容跟 「網站建設」 相關的內容', '不支持联表查询' => '不支持聯表查詢', '注意字符串都要使用英文单引号' => '注意字符串都要使用英文單引號', '如' => '如', '碎片名称' => '碎片名稱', '碎片标识' => '碎片標識', '建议英文,不要重复' => '建議英文,不要重複', '不限栏目' => '不限欄目', '子栏目包含' => '子欄目包含', '包含' => '包含', '不包含' => '不包含', '输出条数' => '輸出條數', '0表示输出所有' => '0表示輸出所有', '更新周期' => '更新周期', '单位' => '單位', '分钟' => '分鐘', '保存' => '保存', '返回' => '返回', '确定' => '確定', '导航管理' => '導航管理', '新增导航' => '新增導航', '导航名称' => '導航名稱', '导航菜单' => '導航菜單', '链接' => '連結', '打开' => '打開', '操作' => '操作', '不填默认栏目名称' => '不填默認欄目名稱', '自定义链接则需要填写' => '自定義連結則需要填寫', '本页面' => '本頁面', '新页面' => '新頁面', '管理员管理' => '管理員管理', '新增管理员信息' => '新增管理員信息', '基本' => '基本', '扩展' => '擴展', '登录名' => '登錄名', '将会成为您唯一的登入名' => '將會成為您唯一的登入名', '手机' => '手機', '邮箱' => '郵箱', '角色' => '角色', '选择角色' => '選擇角色', '密码' => '密碼', '6到16个字符,不改请留空' => '6到16個字符,不改請留空', '确认密码' => '確認密碼', '状态' => '狀態', '正常' => '正常', '禁用' => '禁用', '增加成功' => '增加成功', '修改管理员信息' => '修改管理員信息', '管理员列表' => '管理員列表', '搜索' => '搜索', '是否封禁' => '是否封禁', '封禁' => '封禁', '开始日' => '開始日', '截止日' => '截止日', '请输入用户名' => '請輸入用戶名', '编辑' => '編輯', '添加管理员' => '添加管理員', '正常|封禁' => '正常|封禁', '所属角色' => '所屬角色', '登录时间' => '登錄時間', '注册时间' => '註冊時間', '确认要删除吗?' => '確認要刪除嗎?', '请选择对象!' => '請選擇對象!', '批量删除成功' => '批量刪除成功', '个人信息' => '個人信息', '基础' => '基礎', '设置' => '設置', '填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!' => '填寫內容時,請先選擇欄目,否則切換欄目後,數據會丟失!', '恢复数据' => '恢復數據', '此规则配置仅在不填留空的情况下才会触发' => '此規則配置僅在不填留空的情況下才會觸發', 'SEO标题' => 'SEO標題', '等于内容标题' => '等於內容標題', '不填则留空' => '不填則留空', '缩略图规则' => '縮略圖規則', '自动获取内容第一张图片' => '自動獲取內容第一張圖片', '不自动获取' => '不自動獲取', '简介规则' => '簡介規則', '自动获取内容前200字符' => '自動獲取內容前200字符', 'TAG规则' => 'TAG規則', '同步关键词' => '同步關鍵詞', '不同步关键词' => '不同步關鍵詞', '敏感词过滤字段' => '敏感詞過濾欄位', '需要过滤敏感词在系统配置中进行设置' => '需要過濾敏感詞在系統配置中進行設置', '请输入需要过滤的字段' => '請輸入需要過濾的欄位', '返回列表' => '返回列表', '取消' => '取消', '预览' => '預覽', '批量修改栏目' => '批量修改欄目', '修改推荐属性' => '修改推薦屬性', '审核' => '審核', '列表字段设置' => '列表欄位設置', '顶' => '頂', '热' => '熱', '荐' => '薦', '请选择修改栏目!' => '請選擇修改欄目!', '确认要批量修改内容分类吗?' => '確認要批量修改內容分類嗎?', '批量修改成功' => '批量修改成功', '请选择修改属性!' => '請選擇修改屬性!', '请选择修改对象!' => '請選擇修改對象!', '请选择审核选项!' => '請選擇審核選項!', '请选择审核对象!' => '請選擇審核對象!', '确认要批量处理吗?' => '確認要批量處理嗎?', '批量审核成功' => '批量審核成功', '确认要复制吗?' => '確認要複製嗎?', '批量复制成功' => '批量複製成功', '添加属性' => '添加屬性', '名称' => '名稱', '修改属性' => '修改屬性', '新增属性' => '新增屬性', '系统设置' => '系統設置', '数据库管理' => '資料庫管理', '备份数据库' => '備份資料庫', '备份数:' => '備份數:', '数据库备份名' => '資料庫備份名', '大小' => '大小', '备份副本' => '備份副本', '还原数据' => '還原數據', '删除备份' => '刪除備份', '还原数据库将覆盖现有的数据库,您确认要还原数据库吗?' => '還原資料庫將覆蓋現有的資料庫,您確認要還原資料庫嗎?', '您确定要删除备份数据库吗?删除后将不可找回!' => '您確定要刪除備份資料庫嗎?刪除後將不可找回!', '数据缓存' => '數據緩存', '文件夹cache/data,主要是网站内容缓存,栏目,详情页等' => '文件夾cache/data,主要是網站內容緩存,欄目,詳情頁等', '文件夹cache/tmp,主要是服务器session文件缓存,当前session将不会被清空' => '文件夾cache/tmp,主要是伺服器session文件緩存,當前session將不會被清空', '日志缓存' => '日誌緩存', '文件夹cache/log,包括错误日志、支付日志、登录日志等' => '文件夾cache/log,包括錯誤日誌、支付日誌、登錄日誌等', '模板缓存' => '模板緩存', '文件夹cache,主要是程序执行时生成的模板编译文件' => '文件夾cache,主要是程序執行時生成的模板編譯文件', '缩略图缓存' => '縮略圖緩存', '文件夹image,主要是程序执行时生成的自定义缩略图' => '文件夾image,主要是程序執行時生成的自定義縮略圖', '立即清空' => '立即清空', '请选择清空目标!' => '請選擇清空目標!', '清理成功!' => '清理成功!', '内链管理' => '內鏈管理', '添加内链' => '添加內鏈', '内链词' => '內鏈詞', '内链' => '內鏈', '替换词' => '替換詞', '替换次数' => '替換次數', '替换词,可为空!' => '替換詞,可為空!', '请填写内链' => '請填寫內鏈', '替换次数,默认-1,替换全部,可不写。' => '替換次數,默認-1,替換全部,可不寫。', '提交' => '提交', '修改内链' => '修改內鏈', '内链词和内链不能为空!' => '內鏈詞和內鏈不能為空!', '充值类型' => '充值類型', '当前兑换率:' => '當前兌換率:', '兑换率指1元相当于多少钱包/积分' => '兌換率指1元相當於多少錢包/積分', '交易类型' => '交易類型', '赠送' => '贈送', '充值数量' => '充值數量', '用户ID' => '用戶ID', '备注' => '備註', '添加' => '添加', '充值管理' => '充值管理', '充值列表' => '充值列表', '选择交易类型' => '選擇交易類型', '买入' => '買入', '选择交易种类' => '選擇交易種類', '请输入前台用户手机号' => '請輸入前台用戶手機號', '请输入用户昵称' => '請輸入用戶暱稱', '请输入订单号' => '請輸入訂單號', '会员充值' => '會員充值', '总订单' => '總訂單', '已充值' => '已充值', '已兑换' => '已兌換', '总赠送' => '總贈送', '尾页' => '尾頁', '订单号' => '訂單號', '类型' => '類型', '交易' => '交易', '用户名' => '用戶名', '数量' => '數量', '金额' => '金額', '时间' => '時間', '查看' => '查看', '选择模块' => '選擇模塊', '选择上级' => '選擇上級', '顶级栏目' => '頂級欄目', '分类名' => '分類名', '图片 ' => '圖片 ', '择图片' => '擇圖片', '排序规则' => '排序規則', '组合:排序倒序,时间倒序,ID倒序' => '組合:排序倒序,時間倒序,ID倒序', '组合:排序倒序,ID正序' => '組合:排序倒序,ID正序', '排序正序' => '排序正序', '时间倒序' => '時間倒序', 'ID正序' => 'ID正序', '点击量倒序' => '點擊量倒序', '时间正序' => '時間正序', '默认不需要更改' => '默認不需要更改', 'URL命名' => 'URL命名', '请填写文件名,如:index,不填请留空' => '請填寫文件名,如:index,不填請留空', '填写栏目命名后,系统将自动用作该栏目URL链接,如:news,访问该栏目链接:' => '填寫欄目命名後,系統將自動用作該欄目URL連結,如:news,訪問該欄目連結:', '多个相同URL,将覆盖前面的栏目' => '多個相同URL,將覆蓋前面的欄目', '列表显示' => '列表顯示', '设置列表页显示的内容条数' => '設置列表頁顯示的內容條數', '栏目模板' => '欄目模板', '手动填写,不填请留空' => '手動填寫,不填請留空', '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '請將模板文件放到對應的模塊文件夾下面,如文章(article)模塊,那麼就要在當前模板目錄的article文件夾下面。默認欄目首頁', '详情页模板' => '詳情頁模板', '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面,列表内的详情页。' => '請將模板文件放到對應的模塊文件夾下面,如文章(article)模塊,那麼就要在當前模板目錄的article文件夾下面,列表內的詳情頁。', '栏目外链' => '欄目外鏈', '栏目外链,如:htt://xxx.com/abc,不填请留空' => '欄目外鏈,如:htt://xxx.com/abc,不填請留空', '填写栏目外链后,访问栏目链接将会跳到外链,不填请留空!' => '填寫欄目外鏈後,訪問欄目連結將會跳到外鏈,不填請留空!', '发布显示' => '發布顯示', '勾选后,前台会员发布会显示该栏目' => '勾選後,前台會員發布會顯示該欄目', '导航显示' => '導航顯示', '模板覆盖' => '模板覆蓋', '覆盖' => '覆蓋', '不覆盖' => '不覆蓋', '模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。' => '模板覆蓋指:顯示數量及使用模板文件下級一樣,減少同步操作。如果上級勾選了覆蓋下級,那麼下級默認調用上級填寫的模板。', '访问限制' => '訪問限制', '是否关闭' => '是否關閉', '关闭' => '關閉', '开启' => '開啟', '栏目关闭后,前台不显示,也无法访问!' => '欄目關閉後,前台不顯示,也無法訪問!', '增加' => '增加', '请选择模板页面/使用自定义' => '請選擇模板頁面/使用自定義', '批量新增' => '批量新增', '添加栏目' => '添加欄目', '格式:栏目名|栏目URL,一行一个,如:关于我们|about' => '格式:欄目名|欄目URL,一行一個,如:關於我們|about', '格式:栏目名|栏目URL,一行一个' => '格式:欄目名|欄目URL,一行一個', '请选择模板页面' => '請選擇模板頁面', '图片 ' => '圖片 ', '请填写完整文件名,如:index,不填请留空' => '請填寫完整文件名,如:index,不填請留空', ' 模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。' => ' 模板覆蓋指:顯示數量及使用模板文件下級一樣,減少同步操作。如果上級勾選了覆蓋下級,那麼下級默認調用上級填寫的模板。', '请选择栏目' => '請選擇欄目', '顶级' => '頂級', '展开|折叠' => '展開|摺疊', '模块名' => '模塊名', '快捷操作' => '快捷操作', '显示|隐藏' => '顯示|隱藏', '添加下级' => '添加下級', '字段管理' => '欄位管理', '新增文章' => '新增文章', '新增商品' => '新增商品', '新增内容' => '新增內容', '请选择对象' => '請選擇對象', '已删除!' => '已刪除!', '删除成功' => '刪除成功', '扩展管理' => '擴展管理', '新增轮播图' => '新增輪播圖', '所属分类' => '所屬分類', '图片' => '圖片', '图片高' => '圖片高', '0表示不限制' => '0表示不限制', '图片宽' => '圖片寬', '跳转链接' => '跳轉連結', '不填请留空' => '不填請留空', '数字越大越靠前' => '數字越大越靠前', '修改轮播图' => '修改輪播圖', '选择分类' => '選擇分類', '更新时间' => '更新時間', '轮播图列表' => '輪播圖列表', '请选择分类' => '請選擇分類', '请输入标题' => '請輸入標題', '新增图片' => '新增圖片', '分类列表' => '分類列表', '添加分类' => '添加分類', '共有数据:' => '共有數據:', '条' => '條', '长' => '長', '宽' => '寬', '轮播图分类' => '輪播圖分類', '评论管理' => '評論管理', '添加评论' => '添加評論', '评论栏目' => '評論欄目', '文章ID' => '文章ID', '主回复ID' => '主回復ID', '同属于一个评论的ID,如果没有评论中的评论,则为0' => '同屬於一個評論的ID,如果沒有評論中的評論,則為0', '回复帖子ID' => '回覆帖子ID', '评论内容' => '評論內容', '管理员回复' => '管理員回復', '是否提醒回复' => '是否提醒回復', '提醒' => '提醒', '不提醒' => '不提醒', '喜欢/点赞' => '喜歡/點讚', '是否已读' => '是否已讀', '是否删除' => '是否刪除', '已删除' => '已刪除', '未删除' => '未刪除', '只能管理员删除评论,用户只能软删除评论' => '只能管理員刪除評論,用戶只能軟刪除評論', '查看评论' => '查看評論', '评论列表' => '評論列表', '请输入评论内容' => '請輸入評論內容', '查看相关内容' => '查看相關內容', '查看用户' => '查看用戶', '所属文章' => '所屬文章', '评论时间' => '評論時間', '请选择审核选项' => '請選擇審核選項', '批量处理成功' => '批量處理成功', '调用方式' => '調用方式', '这里输出想要的内容,如:' => '這裡輸出想要的內容,如:', '查看SQL' => '查看SQL', '系统扩展' => '系統擴展', '桌面管理' => '桌面管理', '新增配置' => '新增配置', '配置名称' => '配置名稱', '左侧菜单栏' => '左側菜單欄', '没有二级菜单不会生效' => '沒有二級菜單不會生效', '顶部菜单栏' => '頂部菜單欄', '适用角色' => '適用角色', '默认所有' => '默認所有', '系统默认' => '系統默認', '系统默认指没有指定桌面配置的管理员,进入后台后默认的配置' => '系統默認指沒有指定桌面配置的管理員,進入後台後默認的配置', '一个菜单名称' => '一個菜單名稱', '顶级菜单' => '頂級菜單', '菜单图标' => '菜單圖標', '二级菜单' => '二級菜單', '图标' => '圖標', '修改菜单名称' => '修改菜單名稱', '确定要删除吗?' => '確定要刪除嗎?', '最后一个索引不能删除!' => '最後一個索引不能刪除!', '添加菜单名称' => '添加菜單名稱', '菜单选择' => '菜單選擇', '图标选择' => '圖標選擇', '修改配置' => '修改配置', '桌面名称' => '桌面名稱', '系统' => '系統', '是否默认' => '是否默認', '所有角色' => '所有角色', '复制配置' => '複製配置', '修改碎片' => '修改碎片', '指定几个id或者几个tid的内容输出(栏目:不限制栏目)' => '指定幾個id或者幾個tid的內容輸出(欄目:不限制欄目)', 'SQL中输入:' => 'SQL中輸入:', 'SQL中输入: ' => 'SQL中輸入: ', '如: ' => '如: ', '单位:分钟' => '單位:分鐘', '修改导航' => '修改導航', '扩展模型管理' => '擴展模型管理', '模块管理' => '模塊管理', '新增字段' => '新增欄位', '角色绑定' => '角色綁定', '目绑定' => '目綁定', '字段名称' => '欄位名稱', '简短的名称' => '簡短的名稱', '字段标识' => '欄位標識', '只能英文字母[或者后面+数字],必须含有英文字母,小写字母,简短' => '只能英文字母[或者後面+數字],必須含有英文字母,小寫字母,簡短', '字段类型' => '欄位類型', '选择' => '選擇', '长度' => '長度', '说明' => '說明', '不限' => '不限', '带编辑器文本' => '帶編輯器文本', '只能填写数字,长度不能超过11位' => '只能填寫數字,長度不能超過11位', '金钱,小数等,保留2位' => '金錢,小數等,保留2位', '时间日期' => '時間日期', '多图,图集' => '多圖,圖集', '红=1,黄=2' => '紅=1,黃=2', '单项选择,下拉选择,如:红=1,黄=2,蓝=3' => '單項選擇,下拉選擇,如:紅=1,黃=2,藍=3', '单项选择,按钮选择,如:红=1,黄=2,蓝=3' => '單項選擇,按鈕選擇,如:紅=1,黃=2,藍=3', '多项选择,如:红=1,黄=2,蓝=3' => '多項選擇,如:紅=1,黃=2,藍=3', '一个附件,压缩包,Excel,Word文档' => '一個附件,壓縮包,Excel,Word文檔', '多个附件,压缩包,Excel,Word文档' => '多個附件,壓縮包,Excel,Word文檔', '请选择关联模块' => '請選擇關聯模塊', '列表显示字段' => '列表顯示欄位', '单选关联,可以直接调用关联模块内容列表,列表显示对应字段内容' => '單選關聯,可以直接調用關聯模塊內容列表,列表顯示對應欄位內容', '多行录入,可以在页面动态新增内容输入框' => '多行錄入,可以在頁面動態新增內容輸入框', '多选关联,可以直接调用关联模块内容列表,列表显示对应字段内容' => '多選關聯,可以直接調用關聯模塊內容列表,列表顯示對應欄位內容', '系统栏目,不可修改' => '系統欄目,不可修改', '系统副栏目,不可修改' => '系統副欄目,不可修改', '系统TAG,不可修改' => '系統TAG,不可修改', '默认值' => '默認值', '默认字段值,不填默认int类型的值是0,string类型的值是null。多选参数的值是两边带【,】,如【,1,】表示值为1' => '默認欄位值,不填默認int類型的值是0,string類型的值是null。多選參數的值是兩邊帶【,】,如【,1,】表示值為1', '字段提示' => '欄位提示', '用于填写时的提示信息,50字以内' => '用於填寫時的提示信息,50字以內', '表单排序' => '表單排序', '是否必填' => '是否必填', '必填' => '必填', '非必填' => '非必填', '带有文本框编辑器的除外' => '帶有文本框編輯器的除外', '前台显示' => '前台顯示', '前台表单' => '前台表單', '后台显示' => '後台顯示', '后台搜索' => '後台搜索', '仅用于后台列表头部带有该字段搜索' => '僅用於後台列表頭部帶有該欄位搜索', '列表中显示' => '列表中顯示', '仅用于后台列表显示该字段' => '僅用於後台列表顯示該欄位', '显示格式化' => '顯示格式化', '不做处理' => '不做處理', '仅用于后台列表显示该字段内容处理' => '僅用於後台列表顯示該欄位內容處理', 'ajax可访问' => 'ajax可訪問', '不能' => '不能', '能' => '能', '由于本系统对json数据封装,限制访问可以提高安全性' => '由於本系統對json數據封裝,限制訪問可以提高安全性', '角色名' => '角色名', '栏目名' => '欄目名', '修改字段' => '修改欄位', '栏目绑定' => '欄目綁定', '红=1,黄=2,蓝=3' => '紅=1,黃=2,藍=3', '关联模块内容ID' => '關聯模塊內容ID', '可以在页面动态新增内容输入框' => '可以在頁面動態新增內容輸入框', '温馨提示:排序和宽度在列表点击也可以更改。' => '溫馨提示:排序和寬度在列表點擊也可以更改。', '排序:当前列表显示排序,不会影响录入排序,越大越靠前。' => '排序:當前列表顯示排序,不會影響錄入排序,越大越靠前。', '搜索:在列表顶部的搜索中,可以搜索该字段。' => '搜索:在列表頂部的搜索中,可以搜索該欄位。', '宽度:列表显示的宽度。由于屏幕宽度问题,可以根据自己关注的字段在列表中显示更清晰,默认100。' => '寬度:列表顯示的寬度。由於屏幕寬度問題,可以根據自己關注的欄位在列表中顯示更清晰,默認100。', '宽度' => '寬度', '批量绑定栏目' => '批量綁定欄目', '字段' => '欄位', '后台' => '後台', '确认要删除吗?删除的同时将删除对应的表内容!' => '確認要刪除嗎?刪除的同時將刪除對應的表內容!', '角色管理' => '角色管理', '角色修改' => '角色修改', '是否超管' => '是否超管', '不是' => '不是', '超级管理员拥有无上权利,无视下面权限限制' => '超級管理員擁有無上權利,無視下面權限限制', '发布审核' => '發布審核', '超级管理员除外,发布的内容是否需要审核' => '超級管理員除外,發布的內容是否需要審核', '栏目权限' => '欄目權限', '是否设置栏目权限,默认不设置。开启后下面的栏目权限设置才有效' => '是否設置欄目權限,默認不設置。開啟後下面的欄目權限設置才有效', '选中顶级栏目,则默认子栏目也选中。如果只需要子栏目权限,请不要选中顶级栏目' => '選中頂級欄目,則默認子欄目也選中。如果只需要子欄目權限,請不要選中頂級欄目', '子栏目' => '子欄目', '拥有权限' => '擁有權限', '选中主模块,则默认子模块也选中。如果只需要子模块权限,请不要选中主模块' => '選中主模塊,則默認子模塊也選中。如果只需要子模塊權限,請不要選中主模塊', '主模块' => '主模塊', '子模块' => '子模塊', '描述' => '描述', '请输入内容' => '請輸入內容', '关闭后,该分组管理员将不能登录' => '關閉後,該分組管理員將不能登錄', '添加角色' => '添加角色', '后台管理' => '後台管理', '展开左侧栏' => '展開左側欄', '清理缓存' => '清理緩存', '退出' => '退出', '前台首页' => '前台首頁', '后台首页' => '後台首頁', '我的桌面' => '我的桌面', '关闭当前' => '關閉當前', '关闭其他' => '關閉其他', '关闭所有' => '關閉所有', '扩展模块管理' => '擴展模塊管理', '批量修改分类' => '批量修改分類', '批量处理' => '批量處理', '友情链接分类' => '友情連結分類', '分类' => '分類', '后台管理登录' => '後台管理登錄', '验证码' => '驗證碼', '登录' => '登錄', '登录ID' => '登錄ID', '登录用户' => '登錄用戶', '模块' => '模塊', '方法' => '方法', '操作时间' => '操作時間', '会员管理' => '會員管理', '新增会员' => '新增會員', '用于找回密码' => '用於找回密碼', '手机号' => '手機號', '必须唯一' => '必須唯一', '昵称' => '暱稱', '分组' => '分組', '头像' => '頭像', '生日' => '生日', '个性签名' => '個性簽名', '省份' => '省份', '城市' => '城市', '详细地址' => '詳細地址', '6到16个字符' => '6到16個字符', '添加成功' => '添加成功', '会员修' => '會員修', '6到16个字符,不修改请留空' => '6到16個字符,不修改請留空', '修改成功' => '修改成功', '会员列表' => '會員列表', '请输入手机号' => '請輸入手機號', '余额' => '餘額', '加入时间' => '加入時間', '分组管理' => '分組管理', '分组修改' => '分組修改', '分组名' => '分組名', '折扣类型' => '折扣類型', '无折扣' => '無折扣', '现金折扣' => '現金折扣', '百分比折扣' => '百分比折扣', '折扣金额' => '折扣金額', '百分比折扣请填写0.01-1之间的小数(如5折,填0.5),无折扣时,该参数设置无效' => '百分比折扣請填寫0.01-1之間的小數(如5折,填0.5),無折扣時,該參數設置無效', '登录状态' => '登錄狀態', '请选择所属单位!' => '請選擇所屬單位!', '用户管理' => '用戶管理', '会员分组' => '會員分組', '添加分组' => '添加分組', '温馨提示:前台权限已关闭,设置权限不会生效。' => '溫馨提示:前台權限已關閉,設置權限不會生效。', '温馨提示:前台权限已开启,权限设置将直接影响前台访问,请谨慎操作!' => '溫馨提示:前台權限已開啟,權限設置將直接影響前台訪問,請謹慎操作!', '留言管理' => '留言管理', '查看留言' => '查看留言', '问题描述' => '問題描述', '用户昵称' => '用戶暱稱', '留言栏目' => '留言欄目', '不指定栏目' => '不指定欄目', '联系电话' => '聯繫電話', '留言IP' => '留言IP', '留言内容' => '留言內容', '是否审核' => '是否審核', '提交时间' => '提交時間', '修改保存' => '修改保存', '留言列表' => '留言列表', '请输入相关内容ID' => '請輸入相關內容ID', '内容ID' => '內容ID', '模型管理' => '模型管理', '新增模型' => '新增模型', '模型名称' => '模型名稱', '必须是英文字母,且不能是已存在的标识,标识即是数据库里的表名' => '必須是英文字母,且不能是已存在的標識,標識即是資料庫里的表名', '是否必选栏目' => '是否必選欄目', '新增修改内容时必选' => '新增修改內容時必選', '是否显示栏目' => '是否顯示欄目', '列表展示、录入内容、修改内容三个页面是否展示栏目' => '列表展示、錄入內容、修改內容三個頁面是否展示欄目', '是否受权限控制' => '是否受權限控制', '不同角色可以通过控制栏目权限来限制查看内容' => '不同角色可以通過控制欄目權限來限制查看內容', '栏目绑定显示' => '欄目綁定顯示', '栏目绑定时是否显示该模型' => '欄目綁定時是否顯示該模型', '前台发布' => '前台發布', '前台是否允许发布' => '前台是否允許發布', '列表模板' => '列表模板', '默认列表模板' => '默認列表模板', '详情模板' => '詳情模板', '默认详情模板' => '默認詳情模板', '是否开启' => '是否開啟', '数值越小越靠前' => '數值越小越靠前', '已有表' => '已有表', '如果数据库已经有这个表了,就选择"是",否则就选"不是"' => '如果資料庫已經有這個表了,就選擇"是",否則就選"不是"', '是否可以预览' => '是否可以預覽', '如果后台无法预览,则选择 “否” ,列表中将不会出现 [预览]' => '如果後台無法預覽,則選擇 「否」 ,列表中將不會出現 [預覽]', '修改模型' => '修改模型', '模型状态' => '模型狀態', '模型分类' => '模型分類', '允许' => '允許', '已停用' => '已停用', '已启用' => '已啟用', '重构字段' => '重構欄位', '确认要删除吗?删除的同时将删除对应的表!' => '確認要刪除嗎?刪除的同時將刪除對應的表!', '订单列表' => '訂單列表', '订单详情' => '訂單詳情', '姓名' => '姓名', '是否支付' => '是否支付', '已支付' => '已支付', '未支付' => '未支付', '支付时间' => '支付時間', '存储内容' => '存儲內容', '订单内容' => '訂單內容', '商品' => '商品', '商品已删除' => '商品已刪除', '收货信息:' => '收貨信息:', '收件人:' => '收件人:', '联系手机:' => '聯繫手機:', '联系邮箱:' => '聯繫郵箱:', '收货地址:' => '收貨地址:', '订单状态' => '訂單狀態', '订单已删除' => '訂單已刪除', '已提交未支付' => '已提交未支付', '超时订单' => '超時訂單', '订单更改为‘已出货’,点‘确定修改’后,将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '訂單更改為『已出貨』,點『確定修改』後,將發送一封郵件通知客戶。訂單未變化狀態則不會發送郵件', '发货时间' => '發貨時間', '确定修改' => '確定修改', '订单管理' => '訂單管理', '选择状态' => '選擇狀態', '支付方式' => '支付方式', '线下支付' => '線下支付', '钱包支付' => '錢包支付', '积分兑换' => '積分兌換', '支付宝支付' => '支付寶支付', '微信支付' => '微信支付', '微信H5支付' => '微信H5支付', '微信扫码支付' => '微信掃碼支付', '支付宝H5支付' => '支付寶H5支付', '总收入' => '總收入', '付款方式' => '付款方式', '是否付款' => '是否付款', '付款时间' => '付款時間', '图库管理' => '圖庫管理', '筛选上传入口' => '篩選上傳入口', '前台' => '前台', '筛选模块' => '篩選模塊', '其他杂项' => '其他雜項', '系统配置' => '系統配置', '筛选栏目' => '篩選欄目', '上传前台' => '上傳前台', '所属模块' => '所屬模塊', '本地文件' => '本地文件', '文件大小' => '文件大小', '其他' => '其他', '插件管理' => '插件管理', '插件列表' => '插件列表', '全部' => '全部', '本地' => '本地', '请输入插件名字' => '請輸入插件名字', '插件名' => '插件名', '版本' => '版本', '作者' => '作者', '平台' => '平台', '插件文件' => '插件文件', '开关' => '開關', '安装说明' => '安裝說明', '点击查看' => '點擊查看', '更新说明' => '更新說明', '新' => '新', '官方' => '官方', '第三方' => '第三方', '开|停' => '開|停', '配置' => '配置', '导出' => '導出', '卸载' => '卸載', '安装' => '安裝', '下载' => '下載', '获取文件大小失败,请检查网络!' => '獲取文件大小失敗,請檢查網絡!', '正在安装中,请稍等~' => '正在安裝中,請稍等~', '正在删除中,请稍等~' => '正在刪除中,請稍等~', '正在卸载中,请稍等~' => '正在卸載中,請稍等~', '设置接口' => '設置接口', '当前版本:' => '當前版本:', '最新版本:' => '最新版本:', '作者:' => '作者:', '更新时间:' => '更新時間:', '更新内容' => '更新內容', '正在下载文件' => '正在下載文件', '升级插件' => '升級插件', '文件下载完成!正在解压~' => '文件下載完成!正在解壓~', '文件解压完成!正在进行安装~' => '文件解壓完成!正在進行安裝~', '插件升级成功!' => '插件升級成功!', '插件已升级完毕!' => '插件已升級完畢!', '功能' => '功能', '函数名' => '函數名', '对应的控制器/函数,如果是顶级,则只需要写控制器名' => '對應的控制器/函數,如果是頂級,則只需要寫控制器名', '权限列表' => '權限列表', '添加权限' => '添加權限', '控制器/方法' => '控制器/方法', '添加子功能' => '添加子功能', '权限管理' => '權限管理', '栏目选择' => '欄目選擇', '权限选择' => '權限選擇', '不能选择的权限是非独立功能' => '不能選擇的權限是非獨立功能', '请先勾选菜单!' => '請先勾選菜單!', '扩展信息' => '擴展信息', '回收站' => '回收站', '还原' => '還原', '批量恢复' => '批量恢復', '确认要删除吗?删除后就彻底无法恢复了!' => '確認要刪除嗎?刪除後就徹底無法恢復了!', '确认要删除吗?删除后不可恢复!' => '確認要刪除嗎?刪除後不可恢復!', '确认要还原吗?' => '確認要還原嗎?', '重构字段可以快速将外部表引入CMS内,使其兼容CMS模型。' => '重構欄位可以快速將外部表引入CMS內,使其兼容CMS模型。', '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '重構欄位 => 簡單選擇錄入類型 => 欄位列表 => 詳細欄位修改', '温馨提示:外部表必须有个字段为id,且必须是自增主键。如果没有,请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '溫馨提示:外部表必須有個欄位為id,且必須是自增主鍵。如果沒有,請先在資料庫手動增加這個欄位或者把已有的自增欄位改成id。', '数据类型' => '數據類型', '录入类型' => '錄入類型', '归属' => '歸屬', '插件' => '插件', '独立功能' => '獨立功能', '桌面管理配置时,将调用独立功能' => '桌面管理配置時,將調用獨立功能', '手机端已开启,sitemap将包含手机端URL,请注意【手机静态目录' => '手機端已開啟,sitemap將包含手機端URL,請注意【手機靜態目錄', '如果不生成静态文件,请改为' => '如果不生成靜態文件,請改為', '手机端未开启,sitemap不会包含手机端URL' => '手機端未開啟,sitemap不會包含手機端URL', 'PC端网站地图:' => 'PC端網站地圖:', '手机端网站地图:' => '手機端網站地圖:', '网站地图' => '網站地圖', '模块名称' => '模塊名稱', '更新频率' => '更新頻率', '站内权重' => '站內權重', '输出范围' => '輸出範圍', '栏目模块' => '欄目模塊', '显示的栏目' => '顯示的欄目', '所有的栏目' => '所有的欄目', '文章模块' => '文章模塊', '显示的文章' => '顯示的文章', '所有的文章' => '所有的文章', '商品模块' => '商品模塊', '显示的商品' => '顯示的商品', '所有的商品' => '所有的商品', '显示的' => '顯示的', '所有的' => '所有的', '立即生成' => '立即生成', '网站设置' => '網站設置', '自定义配置' => '自定義配置', '点击复制' => '點擊複製', '上传文件' => '上傳文件', '不选' => '不選', '删除配置栏' => '刪除配置欄', '选择类型' => '選擇類型', '编辑器' => '編輯器', '文件上传' => '文件上傳', '下拉选项' => '下拉選項', '栏目选项' => '欄目選項', '代码' => '代碼', '请填写配置名(中文)' => '請填寫配置名(中文)', '配置标识(字母或数字)' => '配置標識(字母或數字)', '配置栏目' => '配置欄目', '提示信息' => '提示信息', '自定义配置可以配置对应配置栏下的自定义内容' => '自定義配置可以配置對應配置欄下的自定義內容', '下拉选项配置,如:开启=1,关闭=0' => '下拉選項配置,如:開啟=1,關閉=0', '自定义配置栏' => '自定義配置欄', '请填写配置栏名(中文)' => '請填寫配置欄名(中文)', '配置标识(必须是字母)' => '配置標識(必須是字母)', '配置标识用于权限控制,必填且不能与原系统配置栏重复' => '配置標識用於權限控制,必填且不能與原系統配置欄重複', '失败!' => '失敗!', '模板管理' => '模板管理', '模板列表' => '模板列表', '请输入模板名字' => '請輸入模板名字', '有更新' => '有更新', '已使用' => '已使用', '备份数据' => '備份數據', '安装模板' => '安裝模板', '如果数据量较大,不建议通过此方法备份数据库,可以从数据库中直接导出。确定要备份数据库吗?' => '如果數據量較大,不建議通過此方法備份資料庫,可以從資料庫中直接導出。確定要備份資料庫嗎?', '提示' => '提示', '安装提示' => '安裝提示', '该模板用于:' => '該模板用於:', 'PC端' => 'PC端', '手机端' => '手機端', '微信端' => '微信端', '升级模板' => '升級模板', '模板升级成功!' => '模板升級成功!', '模板已升级完毕!' => '模板已升級完畢!', '您已开启【缓存完整页面】,更新静态HTML需要预留足够的空间,如:总内存500M,已用280M(过半),不建议生成HMTL,可能会导致内存不够!' => '您已開啟【緩存完整頁面】,更新靜態HTML需要預留足夠的空間,如:總內存500M,已用280M(過半),不建議生成HMTL,可能會導致內存不夠!', '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '可以去【系統設置】-【高級設置】-【緩存完整頁面】進行關閉', '请确定空间内存是否足够,如果不够,可以开启【缓存完整页面】,也能达到静态访问打开页面速度!' => '請確定空間內存是否足夠,如果不夠,可以開啟【緩存完整頁面】,也能達到靜態訪問打開頁面速度!', '指定栏目' => '指定欄目', '所有栏目' => '所有欄目', '生成电脑静态' => '生成電腦靜態', '生成手机静态' => '生成手機靜態', '清理电脑静态HTML' => '清理電腦靜態HTML', '清理手机静态HTML' => '清理手機靜態HTML', '批量生成电脑静态' => '批量生成電腦靜態', '批量生成手机静态' => '批量生成手機靜態', '批量清理电脑静态' => '批量清理電腦靜態', '批量清理手机静态' => '批量清理手機靜態', '正在处理~' => '正在處理~', '正在准备生成静态,请不要关闭页面~' => '正在準備生成靜態,請不要關閉頁面~', '正在准备清理电脑端静态HTML,请不要关闭页面~' => '正在準備清理電腦端靜態HTML,請不要關閉頁面~', '正在准备清理手机端静态HTML,请不要关闭页面~' => '正在準備清理手機端靜態HTML,請不要關閉頁面~', '欢迎管理员:' => '歡迎管理員:', '当前时间' => '當前時間', '站内用户' => '站內用戶', '人' => '人', '站内文章' => '站內文章', '篇' => '篇', '站内产品' => '站內產品', '件' => '件', '站内留言' => '站內留言', '最近更新' => '最近更新', '全部文章' => '全部文章', '阅读量' => '閱讀量', '最新评论' => '最新評論', '在' => '在', '发布了评论' => '發布了評論', '版本信息' => '版本信息', '当前版本' => '當前版本', '项目地址' => '項目地址', '服务器' => '伺服器', '操作系统' => '作業系統', '运行环境' => '運行環境', 'PHP版本' => 'PHP版本', '运行方式' => '運行方式', '上传限制' => '上傳限制', '用户留言' => '用戶留言', '回复' => '回復', '星期天' => '星期天', '星期一' => '星期一', '星期二' => '星期二', '星期三' => '星期三', '星期四' => '星期四', '星期五' => '星期五', '星期六' => '星期六', '评论模块未开启!' => '評論模塊未開啟!', '您的操作过于频繁,请十分钟后再试~' => '您的操作過於頻繁,請十分鐘後再試~', '评论内容不能为空!' => '評論內容不能為空!', '请提交栏目ID' => '請提交欄目ID', '栏目ID不能为空!' => '欄目ID不能為空!', '评论奖励' => '評論獎勵', '评价成功!' => '評價成功!', '您未登录,请重新登录~' => '您未登錄,請重新登錄~', '您没有' => '您沒有', '的权限!' => '的權限!', '您还未登录,请重新登录!' => '您還未登錄,請重新登錄!', '上传成功!' => '上傳成功!', '已关闭前台上传文件功能' => '已關閉前台上傳文件功能', '上传错误!' => '上傳錯誤!', '对不起,您没有访问权限!' => '對不起,您沒有訪問權限!', '输入url错误!' => '輸入url錯誤!', '缺少ID!' => '缺少ID!', '未找到相应内容!' => '未找到相應內容!', '请输入关键词搜索!' => '請輸入關鍵詞搜索!', '搜索超出设定范围!' => '搜索超出設定範圍!', '您的搜索超出设定范围!' => '您的搜索超出設定範圍!', '系统创建' => '系統創建', '目录失败!' => '目錄失敗!', '支付成功,但是系统内没有找到相应的订单!' => '支付成功,但是系統內沒有找到相應的訂單!', '支付失败' => '支付失敗', '订单号错误!' => '訂單號錯誤!', '会员中心已关闭!' => '會員中心已關閉!', '您的账户已被冻结!' => '您的帳戶已被凍結!', '未找到您所在分组,请联系管理员处理!' => '未找到您所在分組,請聯繫管理員處理!', '您所在的分组被限制登录!' => '您所在的分組被限制登錄!', '登录奖励' => '登錄獎勵', '系统已关闭会员注册!' => '系統已關閉會員註冊!', '您的邀请链接不合法!' => '您的邀請連結不合法!', '手机号格式不正确!' => '手機號格式不正確!', '您的邮箱已注册!' => '您的郵箱已註冊!', '您的手机号码已注册!' => '您的手機號碼已註冊!', '邀请奖励' => '邀請獎勵', '注册成功,等待审核!' => '註冊成功,等待審核!', '注册成功!' => '註冊成功!', '注册失败,请重试~' => '註冊失敗,請重試~', '必须通过邀请链接进行注册!' => '必須通過邀請連結進行註冊!', '请输入账号和邮箱!' => '請輸入帳號和郵箱!', '图形验证码错误!' => '圖形驗證碼錯誤!', '找回密码' => '找回密碼', '您的账号正在进行找回密码操作,如果确定是本人操作,请在10分钟内点击' => '您的帳號正在進行找回密碼操作,如果確定是本人操作,請在10分鐘內點擊', '立即找回密码' => '立即找回密碼', '过期失效!' => '過期失效!', '您操作过于频繁,请10分钟后再尝试!' => '您操作過於頻繁,請10分鐘後再嘗試!', '找回密码邮件已发送,请到您的邮箱查看!' => '找回密碼郵件已發送,請到您的郵箱查看!', '邮箱服务器未配置,无法发送邮件,请联系管理员找回密码!' => '郵箱伺服器未配置,無法發送郵件,請聯繫管理員找回密碼!', '输入的信息有误!' => '輸入的信息有誤!', 'token已失效!' => 'token已失效!', '密码重置成功,请重新登录!' => '密碼重置成功,請重新登錄!', '新密码不能与旧密码相同!' => '新密碼不能與舊密碼相同!', '标题不能为空!' => '標題不能為空!', '称呼不能为空!' => '稱呼不能為空!', '您的手机号格式不正确!' => '您的手機號格式不正確!', '不能为空!' => '不能為空!', '提交成功!我们会尽快回复您!' => '提交成功!我們會儘快回復您!', '提交失败,请重试!' => '提交失敗,請重試!', '链接错误' => '連結錯誤', '留言未找到或者未审核' => '留言未找到或者未審核', '匿名' => '匿名', '缺少id参数!' => '缺少id參數!', '缺少tid参数!' => '缺少tid參數!', '未找到商品或者已下架!' => '未找到商品或者已下架!', '该模块缺少price价格参数!' => '該模塊缺少price價格參數!', '您的订单提交成功通知' => '您的訂單提交成功通知', '我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!' => '我們已經收到您的訂單,我們會儘快給你發貨,請密切關注您的郵箱以獲得訂單的最新消息,謝謝合作!', '订单详细信息如下' => '訂單詳細信息如下', '折扣' => '折扣', '运费' => '運費', '合计' => '合計', '收件地址' => '收件地址', '您的订单' => '您的訂單', '已经提交,我们会尽快给您发货!' => '已經提交,我們會儘快給您發貨!', '订单已支付!' => '訂單已支付!', '已经提交,请尽快支付!' => '已經提交,請儘快支付!', '支付订单' => '支付訂單', '电脑支付宝支付' => '電腦支付寶支付', '微信内支付' => '微信內支付', '未开启钱包支付!' => '未開啟錢包支付!', '您未登录,无法支付!' => '您未登錄,無法支付!', '钱包金额不足,请充值!' => '錢包金額不足,請充值!', '未开启积分支付!' => '未開啟積分支付!', '积分不足,请充值!' => '積分不足,請充值!', '支付宝当面付' => '支付寶當面付', '其他平台支付' => '其他平台支付', '在线充值' => '在線充值', '交易创建,等待买家付款' => '交易創建,等待買家付款', '未付款交易超时关闭,或支付完成后全额退款' => '未付款交易超時關閉,或支付完成後全額退款', '支付成功' => '支付成功', '交易结束,不可退款' => '交易結束,不可退款', '未知状态' => '未知狀態', '订单号错误或订单被删除!' => '訂單號錯誤或訂單被刪除!', '订单未支付或订单号错误!' => '訂單未支付或訂單號錯誤!', '创建订单失败!' => '創建訂單失敗!', '订单号不存在或已被删除!' => '訂單號不存在或已被刪除!', '收件人、手机号和收货地址不能为空!' => '收件人、手機號和收貨地址不能為空!', '未开启在线支付!' => '未開啟在線支付!', '获取openid失败' => '獲取openid失敗', '非法参数!' => '非法參數!', '标签未找到或已删除!' => '標籤未找到或已刪除!', '手机号码格式错误!' => '手機號碼格式錯誤!', '账户不能为空!' => '帳戶不能為空!', '订单已过期,不可支付!' => '訂單已過期,不可支付!', '订单已支付,请勿重复操作!' => '訂單已支付,請勿重複操作!', '缺少订单号!' => '缺少訂單號!', '网络错误,请刷新后重试!' => '網絡錯誤,請刷新後重試!', '未找到评论!' => '未找到評論!', '已取消点赞!' => '已取消點讚!', '点赞成功!' => '點讚成功!', '栏目未绑定模型,无法喜欢!' => '欄目未綁定模型,無法喜歡!', '取消点赞' => '取消點讚', '点赞奖励' => '點讚獎勵', '已被删除 ' => '已被刪除 ', '栏目未绑定模型,无法收藏!' => '欄目未綁定模型,無法收藏!', '取消收藏' => '取消收藏', '收藏奖励' => '收藏獎勵', '收藏成功!' => '收藏成功!', '已被删除' => '已被刪除', '库存不足!' => '庫存不足!', '该模块不允许发布!' => '該模塊不允許發布!', '添加失败,存在敏感词' => '添加失敗,存在敏感詞', '分类错误!' => '分類錯誤!', '该分类不允许发布!' => '該分類不允許發布!', '您没有权限在该分类发布内容!' => '您沒有權限在該分類發布內容!', '内容不能为空!' => '內容不能為空!', '库存不能为0!' => '庫存不能為0!', '未修改内容,不能提交!' => '未修改內容,不能提交!', '发布失败,请重试!' => '發布失敗,請重試!', '发布成功!' => '發布成功!', '未找到您要的文章!' => '未找到您要的文章!', '您已经关注了该用户!' => '您已經關注了該用戶!', '您不能关注自己!' => '您不能關注自己!', '关注奖励' => '關注獎勵', '关注成功!' => '關注成功!', '您没有关注该用户,无法操作!' => '您沒有關注該用戶,無法操作!', '取关成功!' => '取關成功!', '消息已被删除!' => '消息已被刪除!', '用户未找到!' => '用戶未找到!', '未分类 ' => '未分類 ', '设置成功' => '設置成功', '设置成功!' => '設置成功!', '记录不存在!' => '記錄不存在!', '缺少栏目ID!' => '缺少欄目ID!', '系统未配置微信登录!' => '系統未配置微信登錄!', '微信已绑定!' => '微信已綁定!', '您的微信已被绑定,不能再绑定!' => '您的微信已被綁定,不能再綁定!', '系统版号' => '系統版號', '版本号是系统自带,请勿改动' => '版本號是系統自帶,請勿改動', '网站SEO名称' => '網站SEO名稱', '控制在25个字、50个字节以内' => '控制在25個字、50個字節以內', '网站SEO关键词' => '網站SEO關鍵詞', '5个左右,8汉字以内,用英文逗号隔开' => '5個左右,8漢字以內,用英文逗號隔開', '网站SEO描述' => '網站SEO描述', '控制在80个汉字,160个字符以内' => '控制在80個漢字,160個字符以內', '统计代码' => '統計代碼', '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '將百度統計、cnzz等平台的流量統計JS代碼放到這裡', '底部版权' => '底部版權', '如:© 2016 xxx版权' => '如:© 2016 xxx版權', '备案号' => '備案號', '如:京ICP备00000000号' => '如:京ICP備00000000號', '网站电话' => '網站電話', '网站联系电话' => '網站聯繫電話', '400电话' => '400電話', '网站QQ' => '網站QQ', '网站邮箱' => '網站郵箱', '公司地址' => '公司地址', 'PC网站模板' => 'PC網站模板', '将模板名称填写到此处' => '將模板名稱填寫到此處', 'WAP网站模板' => 'WAP網站模板', '开启了手机端,这个设置才会生效,否则调用电脑端模板' => '開啟了手機端,這個設置才會生效,否則調用電腦端模板', '微信网站模板' => '微信網站模板', '开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板' => '開啟了手機端,這個設置才會生效,否則調用電腦端模板。由於微信內有一些特殊的js,所以可以在這裡單獨設置微信模板', '是否开启手机端' => '是否開啟手機端', '如果不开启手机端,则默认调用电脑端模板' => '如果不開啟手機端,則默認調用電腦端模板', '是否开启前台上传' => '是否開啟前台上傳', '关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。' => '關閉後,前台無法上傳文件。如果網站沒有使用會員,建議關閉前台上傳。', '是否开启前台权限' => '是否開啟前台權限', '开启后前台用户权限可以在后台控制' => '開啟後前台用戶權限可以在後台控制', '缓存时间' => '緩存時間', '单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。此设置与缓存完整页面,模板缓存有关。' => '單位:分鐘,留空或0則不設置緩存。如果生成靜態文件,靜態文件清空後才生效。此設置與緩存完整頁面,模板緩存有關。', '限制上传文件大小' => '限制上傳文件大小', '0代表不限,单位kb' => '0代表不限,單位kb', '允许上传文件类型' => '允許上傳文件類型', '请用|分割,如:pdf|jpg|png' => '請用|分割,如:pdf|jpg|png', '前台UEditor编辑器导航条配置' => '前台UEditor編輯器導航條配置', '允许前台搜索的表' => '允許前台搜索的表', '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product' => '防止數據泄露,填寫允許發布模塊標識,留空表示不允許發布,多個表可用|分割,如:article|product', '上传图片压缩比例' => '上傳圖片壓縮比例', '100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80' => '100%則不壓縮,如果PNG是透明圖,壓縮後背景變黑色。格式如:80', 'PNG是否压缩' => 'PNG是否壓縮', 'PNG压缩后容易变成背景黑色,关闭后,不会压缩。' => 'PNG壓縮後容易變成背景黑色,關閉後,不會壓縮。', '邮件服务器' => '郵件伺服器', 'smtp.163.com,smtp.qq.com' => 'smtp.163.com,smtp.qq.com', '邮件收发端口' => '郵件收發埠', '163、126邮件端口(465),QQ邮件端口(587)' => '163、126郵件埠(465),QQ郵件埠(587)', '收件人Email地址' => '收件人Email地址', '发件人Email地址' => '發件人Email地址', '指邮件服务器发件邮箱' => '指郵件伺服器發件郵箱', '发件人Email秘钥' => '發件人Email秘鑰', '这个秘钥不是登录密码' => '這個秘鑰不是登錄密碼', '发件人昵称' => '發件人暱稱', '发件邮箱会带一个昵称' => '發件郵箱會帶一個暱稱', '客户订单通知' => '客戶訂單通知', '购买商品的时候会发送的一条邮件信息' => '購買商品的時候會發送的一條郵件信息', '订单出货通知' => '訂單出貨通知', '发货的时候发送给客户的通知' => '發貨的時候發送給客戶的通知', '订单运费' => '訂單運費', '购物下单时会加上这个运费' => '購物下單時會加上這個運費', '在线支付' => '在線支付', '0关闭支付,1自主平台支付' => '0關閉支付,1自主平台支付', '极致平台接口' => '極致平台接口', '极致平台商户' => '極致平台商戶', '极致平台应用appid' => '極致平台應用appid', '极致平台应用秘钥' => '極致平台應用秘鑰', '支付宝APPID' => '支付寶APPID', '账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID' => '帳戶中心->密鑰管理->開放平台密鑰,填寫添加了電腦網站支付的應用的APPID', '支付宝key' => '支付寶key', 'MD5密钥,安全检验码,由数字和字母组成的32位字符串' => 'MD5密鑰,安全檢驗碼,由數字和字母組成的32位字符串', '支付宝私钥' => '支付寶私鑰', '支付宝公钥' => '支付寶公鑰', '微信商户mchid' => '微信商戶mchid', '支付相关' => '支付相關', '微信商户key' => '微信商戶key', '微信公众号appid' => '微信公眾號appid', '微信公众号appsecret' => '微信公眾號appsecret', '微信apiclient_cert' => '微信apiclient_cert', '微信apiclient_key' => '微信apiclient_key', '公众号appid' => '公眾號appid', '用户登录相关,如果跟支付的一样,那就再填写一遍' => '用戶登錄相關,如果跟支付的一樣,那就再填寫一遍', '公众号appsecret' => '公眾號appsecret', '公众号token' => '公眾號token', '公众号关注欢迎语' => '公眾號關注歡迎語', '公众号关注时发送的第一句推送' => '公眾號關注時發送的第一句推送', '网站LOGO' => '網站LOGO', '后台模板风格' => '後台模板風格', '内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。' => '內頁彈窗:點擊新增/修改等操作,頁面是一個彈出層,更美觀。內嵌頁面:點擊新增/修改等操作,頁面直接進入新頁面,不會彈出層。', '是否绑定多域名' => '是否綁定多域名', '开启绑定多域名后,需要到插件中配置' => '開啟綁定多域名後,需要到插件中配置', '网站SEO网址' => '網站SEO網址', '一般不填,全局网址,最后不带/,如:http://www.xxx.com' => '一般不填,全局網址,最後不帶/,如:http://www.xxx.com', '基本信息下扩展' => '基本信息下擴展', '新增字段是否显示在【基本信息】底部,默认在【扩展信息】下' => '新增欄位是否顯示在【基本信息】底部,默認在【擴展信息】下', '订单超时' => '訂單超時', '按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制' => '按小時計算,超過該小時訂單過期,僅限於開啟支付後,0代表不限制', '开启层级URL' => '開啟層級URL', '默认关闭层级URL,开启后URL会按照父类层级展现' => '默認關閉層級URL,開啟後URL會按照父類層級展現', '缓存完整页面' => '緩存完整頁面', '前台完整页面缓存,结合缓存时间,可以提高访问速度' => '前台完整頁面緩存,結合緩存時間,可以提高訪問速度', '自动生成静态HTML' => '自動生成靜態HTML', '前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面' => '前台訪問網站頁面,將自動生成靜態HTML,下次訪問直接進入靜態HTML頁面', 'PC静态文件目录' => 'PC靜態文件目錄', '电脑端静态HTML存放目录,默认根目录[ / ]' => '電腦端靜態HTML存放目錄,默認根目錄[ / ]', 'WAP静态文件目录' => 'WAP靜態文件目錄', '手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱' => '手機端靜態HTML存放目錄,默認[ m ],PC和WAP靜態目錄不能相同,否則文件會混亂', '是否留言自动审核' => '是否留言自動審核', '开启后,留言自动审核(显示)' => '開啟後,留言自動審核(顯示)', '是否评论自动审核' => '是否評論自動審核', '开启后评论自动审核(显示)' => '開啟後評論自動審核(顯示)', '网站敏感词过滤' => '網站敏感詞過濾', '将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容' => '將敏感詞放到裡面,用「,」分隔,用{xxx}代替通配內容', '是否开启水印' => '是否開啟水印', '开启水印需要上传水印图片' => '開啟水印需要上傳水印圖片', '水印图片' => '水印圖片', '水印图片在250px以内' => '水印圖片在250px以內', '水印位置' => '水印位置', '参考键盘九宫格1-9' => '參考鍵盤九宮格1-9', '水印透明度' => '水印透明度', '透明度越大,越难看清楚水印' => '透明度越大,越難看清楚水印', '钱包兑换率' => '錢包兌換率', '站内钱包与RMB的兑换率,即1元=多少金币' => '站內錢包與RMB的兌換率,即1元=多少金幣', '积分兑换率' => '積分兌換率', '站内积分与RMB的兑换率,即1元=多少积分' => '站內積分與RMB的兌換率,即1元=多少積分', '积分支付' => '積分支付', '开启积分支付后,商品可以用积分支付' => '開啟積分支付後,商品可以用積分支付', '开启钱包支付后,商品可以用钱包支付' => '開啟錢包支付後,商品可以用錢包支付', '开启微信支付后,商品可以用微信支付' => '開啟微信支付後,商品可以用微信支付', '开启支付宝支付后,商品可以用支付宝支付' => '開啟支付寶支付後,商品可以用支付寶支付', '每次登录奖励' => '每次登錄獎勵', '每天登录奖励积分数,最小为0,每天登录只奖励一次' => '每天登錄獎勵積分數,最小為0,每天登錄只獎勵一次', '开启登录奖励后,登录后就会获得积分奖励' => '開啟登錄獎勵後,登錄後就會獲得積分獎勵', '开启后,发布内容会奖励积分' => '開啟後,發布內容會獎勵積分', '每次发布奖励' => '每次發布獎勵', '每次发布内容奖励积分数' => '每次發布內容獎勵積分數', '每天发布最高奖励' => '每天發布最高獎勵', '每天奖励不超过积分上限,设置0则无上限' => '每天獎勵不超過積分上限,設置0則無上限', '开启后,发布内容被收藏会奖励积分' => '開啟後,發布內容被收藏會獎勵積分', '每次收藏奖励' => '每次收藏獎勵', '每次发布内容被收藏奖励积分数' => '每次發布內容被收藏獎勵積分數', '每天收藏最高奖励' => '每天收藏最高獎勵', '开启后,发布内容被点赞会奖励积分' => '開啟後,發布內容被點讚會獎勵積分', '每次点赞奖励' => '每次點讚獎勵', '每次发布内容被点赞奖励积分数' => '每次發布內容被點讚獎勵積分數', '每天点赞最高奖励' => '每天點讚最高獎勵', '开启后,发布内容被评论会奖励积分' => '開啟後,發布內容被評論會獎勵積分', '每次评论奖励' => '每次評論獎勵', '每次发布内容被评论奖励积分数' => '每次發布內容被評論獎勵積分數', '每天评论最高奖励' => '每天評論最高獎勵', '开启后,用户被粉丝关注会奖励积分' => '開啟後,用戶被粉絲關注會獎勵積分', '每次关注奖励' => '每次關注獎勵', '每次被关注奖励积分数' => '每次被關注獎勵積分數', '每天关注最高奖励' => '每天關注最高獎勵', '每天关注奖励不超过积分上限,设置0则无上限' => '每天關注獎勵不超過積分上限,設置0則無上限', '发送邮件' => '發送郵件', '是否开启邮件发送' => '是否開啟郵件發送', '关闭网站' => '關閉網站', '关闭网站后,前台无法访问,后台可以进入' => '關閉網站後,前台無法訪問,後台可以進入', '关站提示' => '關站提示', '后台文件存储路径' => '後台文件存儲路徑', '默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]' => '默認static/upload/{yyyy}/{mm}/{dd},存儲路徑相對於根目錄,最後不能帶斜槓[ / ]', '前台文件存储路径' => '前台文件存儲路徑', '是否开启前台AJAX' => '是否開啟前台AJAX', '开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据' => '開啟後AJAX,前台可以通過欄目連結+ajax=1獲取JSON數據', '自动生成sitemap' => '自動生成sitemap', '开启后,前台访问每天会自动生成1次sitemap' => '開啟後,前台訪問每天會自動生成1次sitemap', '是否开启邀请奖励' => '是否開啟邀請獎勵', '开启邀请后则会奖励' => '開啟邀請後則會獎勵', '邀请奖励类型' => '邀請獎勵類型', '邀请奖励数量' => '邀請獎勵數量', '网站手机' => '網站手機', '站长微信' => '站長微信', '开启多图描述' => '開啟多圖描述', '开启后图集每张图可以添加描述,注意模板输出需要更改输出方式!(附件同理)' => '開啟後圖集每張圖可以添加描述,注意模板輸出需要更改輸出方式!(附件同理)', '前台用户注册' => '前台用戶註冊', '关闭前台注册后,前台无法进入注册页面' => '關閉前台註冊後,前台無法進入註冊頁面', '仅邀请码注册' => '僅邀請碼註冊', '开启后,必须通过邀请链接才能注册!' => '開啟後,必須通過邀請連結才能註冊!', '允许前台发布模块' => '允許前台發布模塊', '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '防止數據泄露,填寫允許發布模塊標識,留空表示不允許發布,多個表可用|分割', '前台搜索的字段' => '前台搜索的欄位', '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '可以設置搜索表中的相關欄位進行模糊查詢,多個欄位可用|分割', '前台验证码' => '前台驗證碼', '关闭后,登录注册不需要验证码' => '關閉後,登錄註冊不需要驗證碼', '后台验证码' => '後台驗證碼', '关闭后,后台管理员登录不需要验证码' => '關閉後,後台管理員登錄不需要驗證碼', 'TAG包含模型' => 'TAG包含模型', '在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product' => '在tag列表上查詢的相關模型,多個模型標識可用|分割,如:article|product', '支付配置' => '支付配置', '前台多模块搜索的字段' => '前台多模塊搜索的欄位', '多个模块直接必须都有相同的字段,否则会报错' => '多個模塊直接必須都有相同的欄位,否則會報錯', '多模块允许搜索的表' => '多模塊允許搜索的表', '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product' => '防止數據泄露,填寫允許搜索的表名,留空表示不允許搜索,多個表可用|分割,如:article|product', '允许查询显示的字段' => '允許查詢顯示的欄位', '多模块搜索允许查询显示的字段' => '多模塊搜索允許查詢顯示的欄位', '前台编辑器设置' => '前台編輯器設置', '前台的编辑器功能菜单设置' => '前台的編輯器功能菜單設置', 'PHP调试' => 'PHP調試', '测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。' => '測試環境,開啟調試,提示錯誤,實時更新模板。正式上線,請關閉調試,打開頁面更快。', '前台SESSION' => '前台SESSION', '关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以开启,使用会员支付等必须关闭' => '關閉前台SESSION後,前台會員模塊無法使用,但是可以減少session緩存文件。純內容網站可以開啟,使用會員支付等必須關閉', '留言验证码' => '留言驗證碼', '开启后,前台留言需要填写验证码' => '開啟後,前台留言需要填寫驗證碼', '前台发布审核' => '前台發布審核', '开启后需要后台审核,关闭则不需要' => '開啟後需要後台審核,關閉則不需要', '公共权限' => '公共權限', '前台网站' => '前台網站', '会员登录' => '會員登錄', '会员评论' => '會員評論', '网站筛选' => '網站篩選', '会员下单' => '會員下單', '网站支付' => '網站支付', '极致支付' => '極致支付', '微信模块' => '微信模塊', '验证码生成' => '驗證碼生成', '检查是否登录' => '檢查是否登錄', '多附件上传' => '多附件上傳', '单附件上传' => '單附件上傳', '二维码生成' => '二維碼生成', '获取扩展信息' => '獲取擴展信息', '链接错误提示' => '連結錯誤提示', '报错提示' => '報錯提示', '网站内容' => '網站內容', '详情内容' => '詳情內容', '网站搜索' => '網站搜索', '网站多模块搜索' => '網站多模塊搜索', '开启网站缓存' => '開啟網站緩存', '输出缓存' => '輸出緩存', '个人中心首页' => '個人中心首頁', '会员资料' => '會員資料', '订单记录' => '訂單記錄', '订单支付' => '訂單支付', '删除订单' => '刪除訂單', '上传头像' => '上傳頭像', '删除评论' => '刪除評論', '点赞文章' => '點讚文章', '点赞列表' => '點讚列表', '收藏文章' => '收藏文章', '收藏列表' => '收藏列表', '删除收藏' => '刪除收藏', '购物车' => '購物車', '添加购物车' => '添加購物車', '删除购物车' => '刪除購物車', '发布管理' => '發布管理', '会员发布' => '會員發布', '删除发布' => '刪除發布', '会员上传附件' => '會員上傳附件', '404提示' => '404提示', '关注用户' => '關注用戶', '取消关注' => '取消關注', '粉丝列表' => '粉絲列表', '消息提醒' => '消息提醒', '查看消息' => '查看消息', '删除消息' => '刪除消息', '公共主页' => '公共主頁', '消息提醒设置' => '消息提醒設置', '获取栏目列表' => '獲取欄目列表', '用户钱包' => '用戶錢包', '交易详情' => '交易詳情', '登录首页' => '登錄首頁', '注册页面' => '註冊頁面', '忘记密码' => '忘記密碼', '未登录页面' => '未登錄頁面', '退出登录' => '退出登錄', '发送留言' => '發送留言', '发表评论' => '發表評論', '筛选列表' => '篩選列表', '创建订单' => '創建訂單', 'TAG标签列表' => 'TAG標籤列表', '会员' => '會員', '订单' => '訂單', '评论' => '評論', '留言' => '留言', '轮播图' => '輪播圖', '友情链接' => '友情連結', 'TAG' => 'TAG', '单页' => '單頁', '用户评价' => '用戶評價', '添加会员' => '添加會員', '修改会员' => '修改會員', '删除会员' => '刪除會員', '修改状态' => '修改狀態', '内容管理' => '內容管理', '内容列表' => '內容列表', '添加内容' => '添加內容', '修改内容' => '修改內容', '删除内容' => '刪除內容', '复制内容' => '複製內容', '修改评论' => '修改評論', '修改留言' => '修改留言', '删除留言' => '刪除留言', '字段列表' => '欄位列表', '删除字段' => '刪除欄位', '获取字段' => '獲取欄位', '基本功能' => '基本功能', '系统界面' => '系統界面', '数据库备份' => '資料庫備份', '数据库还原' => '資料庫還原', '数据库删除' => '資料庫刪除', '系统功能' => '系統功能', '栏目管理' => '欄目管理', '栏目列表' => '欄目列表', '新增栏目' => '新增欄目', '修改栏目' => '修改欄目', '删除栏目' => '刪除欄目', '修改排序' => '修改排序', '栏目隐藏' => '欄目隱藏', '新增角色' => '新增角色', '修改角色' => '修改角色', '删除角色' => '刪除角色', '角色状态' => '角色狀態', '新增管理员' => '新增管理員', '修改管理员' => '修改管理員', '管理员状态' => '管理員狀態', '删除管理员' => '刪除管理員', '模型列表' => '模型列表', '删除模型' => '刪除模型', '新增权限' => '新增權限', '修改权限' => '修改權限', '删除权限' => '刪除權限', '桌面设置' => '桌面設置', '新增桌面' => '新增桌面', '修改桌面' => '修改桌面', '删除桌面' => '刪除桌面', '图标库' => '圖標庫', '模块扩展' => '模塊擴展', '删除轮播图' => '刪除輪播圖', '复制轮播图' => '複製輪播圖', '批量删除轮播图' => '批量刪除輪播圖', '新增轮播图分类' => '新增輪播圖分類', '修改轮播图分类' => '修改輪播圖分類', '删除轮播图分类' => '刪除輪播圖分類', '新增友链' => '新增友鏈', '修改友链' => '修改友鏈', '复制友链' => '複製友鏈', '删除友链' => '刪除友鏈', '批量删除友链' => '批量刪除友鏈', '通用模块' => '通用模塊', '更新cookie' => '更新cookie', '商品管理' => '商品管理', '商品列表' => '商品列表', '修改商品' => '修改商品', '删除商品' => '刪除商品', '复制商品' => '複製商品', '登录日志' => '登錄日誌', '新增分组' => '新增分組', '修改分组' => '修改分組', '更改分组状态' => '更改分組狀態', '删除分组' => '刪除分組', '会员权限' => '會員權限', '修改分组排序' => '修改分組排序', '上传支付证书' => '上傳支付證書', '更改状态' => '更改狀態', '安装卸载' => '安裝卸載', '删除图库图片' => '刪除圖庫圖片', '批量删除图库' => '批量刪除圖庫', '微信公众号' => '微信公眾號', '公众号菜单' => '公眾號菜單', '公众号素材' => '公眾號素材', '模板制作' => '模板製作', '获取首字母拼音' => '獲取首字母拼音', '批量新增栏目' => '批量新增欄目', '自定义配置删除' => '自定義配置刪除', 'TAG列表' => 'TAG列表', '新增TAG' => '新增TAG', '修改TAG' => '修改TAG', '复制TAG' => '複製TAG', '删除TAG' => '刪除TAG', '批量删除TAG' => '批量刪除TAG', '生成静态文件' => '生成靜態文件', '更新栏目HTML' => '更新欄目HTML', '更新模块HTML' => '更新模塊HTML', '批量修改推荐属性' => '批量修改推薦屬性', '批量修改友链栏目' => '批量修改友鏈欄目', '批量修改TAG栏目' => '批量修改TAG欄目', '批量复制友链' => '批量複製友鏈', '批量复制TAG' => '批量複製TAG', '批量修改友链排序' => '批量修改友鏈排序', '批量修改TAG排序' => '批量修改TAG排序', '高级设置' => '高級設置', '邮箱订单' => '郵箱訂單', '公众号配置' => '公眾號配置', '批量审核友链' => '批量審核友鏈', '批量审核TAG' => '批量審核TAG', '手动充值' => '手動充值', '删除记录' => '刪除記錄', '批量删除记录' => '批量刪除記錄', '积分配置' => '積分配置', '插件更新' => '插件更新', '获取栏目模板' => '獲取欄目模板', '友链分类' => '友鏈分類', '新增友链分类' => '新增友鏈分類', '修改友链分类' => '修改友鏈分類', '删除友链分类' => '刪除友鏈分類', '导航设置' => '導航設置', '删除导航' => '刪除導航', '碎片化' => '碎片化', '删除碎片' => '刪除碎片', '预览SQL' => '預覽SQL', '搜索配置' => '搜索配置', '修改字段属性' => '修改欄位屬性', '新增推荐属性' => '新增推薦屬性', '删除推荐属性' => '刪除推薦屬性', '列表设置' => '列表設置', '获取列表字段' => '獲取列表欄位', '内链模块' => '內鏈模塊', '内链列表' => '內鏈列表', '新增内链' => '新增內鏈', '删除内链' => '刪除內鏈', '删除数据' => '刪除數據', '模板更新' => '模板更新', '用户评价列表' => '用戶評價列表', '新增用户评价' => '新增用戶評價', '修改用户评价' => '修改用戶評價', '复制用户评价' => '複製用戶評價', '删除用户评价' => '刪除用戶評價', '批量删除用户评价' => '批量刪除用戶評價', '批量修改用户评价栏目' => '批量修改用戶評價欄目', '批量复制用户评价' => '批量複製用戶評價', '批量修改用户评价列表' => '批量修改用戶評價列表', '批量审核用户评价' => '批量審核用戶評價', '基本设置' => '基本設置', '邮件订单' => '郵件訂單', '非超级管理员无法设置!' => '非超級管理員無法設定!', '你确定要还原吗?' => '你確定要還原嗎?', ); ?> ================================================ FILE: app/home/lang/common.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/09/10 // +---------------------------------------------------------------------- /** 公共语言包 如果系统有多个语言包,但是有些部分是一样的、重复的,可以放到这里存放,减少重复内容 如果当前语言包里有同个字符,但是内容不同,公共语言包里的内容将被覆盖 **/ return [ 'JIZHI' => '极致CMS', ]; ================================================ FILE: app/home/lang/zh.php ================================================ '该角色下存在用户,请先移除用户再删除!', '删除失败,该分组不允许删除!' => '删除失败,该分组不允许删除!', '删除成功!' => '删除成功!', '删除失败,请重试!' => '删除失败,请重试!', '非法操作!' => '非法操作!', '修改失败,您的权限不足!' => '修改失败,您的权限不足!', '修改成功!' => '修改成功!', '修改失败,请重新提交!' => '修改失败,请重新提交!', '没有该角色!' => '没有该角色!', '新增成功!' => '新增成功!', '新增失败,请重新提交!' => '新增失败,请重新提交!', '修改失败,该分组不允许修改!' => '修改失败,该分组不允许修改!', '您没有权限操作!' => '您没有权限操作!', '两次密码不同!' => '两次密码不同!', '手机号已被注册!' => '手机号已被注册!', '昵称已被使用!' => '昵称已被使用!', '邮箱已被使用!' => '邮箱已被使用!', '修改失败!' => '修改失败!', '新增失败!' => '新增失败!', '系统管理员不能删除!' => '系统管理员不能删除!', '删除失败!' => '删除失败!', '批量操作失败!' => '批量操作失败!', '批量删除成功!' => '批量删除成功!', '添加失败' => '添加失败', '存在敏感词' => '存在敏感词', '已存在相同的自定义URL!' => '已存在相同的自定义URL!', '添加成功,继续添加~' => '添加成功,继续添加~', '内容配置' => '内容配置', '修改失败' => '修改失败', '发布奖励' => '发布奖励', '您未做任何修改,不能提交!' => '您未做任何修改,不能提交!', '复制成功!' => '复制成功!', '复制失败!' => '复制失败!', '批量复制成功!' => '批量复制成功!', '批量修改成功!' => '批量修改成功!', '批量操作成功!' => '批量操作成功!', 'URL链接命名不能是' => 'URL链接命名不能是', '非法URL' => '非法URL', '添加栏目成功,继续添加~' => '添加栏目成功,继续添加~', '模型错误!' => '模型错误!', '不能选择当前栏目及下级为顶级栏目' => '不能选择当前栏目及下级为顶级栏目', '该栏目有子栏目,请先删除子栏目!' => '该栏目有子栏目,请先删除子栏目!', '栏目不能为空!' => '栏目不能为空!', '操作成功!' => '操作成功!', '请选择分类!' => '请选择分类!', '添加成功!继续添加~' => '添加成功!继续添加~', '添加失败!' => '添加失败!', '该分类下存在内容,请先删除该分类下的内容!' => '该分类下存在内容,请先删除该分类下的内容!', '添加成功!' => '添加成功!', '已审核' => '已审核', '被删除' => '被删除', '未审核' => '未审核', '已读' => '已读', '未读' => '未读', '批量审核成功!' => '批量审核成功!', '批量审核失败!' => '批量审核失败!', '您没有权限!' => '您没有权限!', '文件类型不允许上传!' => '文件类型不允许上传!', '文件大小超过网站内部限制!' => '文件大小超过网站内部限制!', '请检查目录写入权限' => '请检查目录写入权限', '错误信息提示' => '错误信息提示', '模块为空,请选择模块!' => '模块为空,请选择模块!', '缺少ID' => '缺少ID', '请选择模块!' => '请选择模块!', '显示' => '显示', '隐藏' => '隐藏', '是' => '是', '否' => '否', '单行文本' => '单行文本', '多行文本' => '多行文本', '文本编辑器' => '文本编辑器', '数字' => '数字', '单图片' => '单图片', '多图片' => '多图片', '单选下拉' => '单选下拉', '多选' => '多选', '单附件' => '单附件', '多附件' => '多附件', '时间戳' => '时间戳', '单选按钮' => '单选按钮', '单选关联' => '单选关联', '小数' => '小数', '多行录入' => '多行录入', '多选关联' => '多选关联', '栏目' => '栏目', '副栏目' => '副栏目', '系统TAG' => '系统TAG', '字段名和字段标识不能为空!' => '字段名和字段标识不能为空!', '字段标识已存在!' => '字段标识已存在!', '系统保护字段,不允许创建!' => '系统保护字段,不允许创建!', '字段长度不对!' => '字段长度不对!', '字段长度不对,时间属性必须长度为11' => '字段长度不对,时间属性必须长度为11', '字段长度不对,decimal字段长度格式[整数位数,小数位数]' => '字段长度不对,decimal字段长度格式[整数位数,小数位数]', '字段创建成功,但是字段表记录失败,请反馈官方解决!' => '字段创建成功,但是字段表记录失败,请反馈官方解决!', '字段创建成功!' => '字段创建成功!', '字段修改成功!' => '字段修改成功!', '字段修改失败!' => '字段修改失败!', '上传图片' => '上传图片', '选择图片' => '选择图片', '图片未找到' => '图片未找到', '删除这张图片' => '删除这张图片', '删除' => '删除', '上传异常!' => '上传异常!', '文字描述' => '文字描述', '左移' => '左移', '右移' => '右移', '请选择' => '请选择', '上传附件' => '上传附件', '字段关联绑定失败,请重新绑定!' => '字段关联绑定失败,请重新绑定!', '请选择关联项' => '请选择关联项', 'TAG标签' => 'TAG标签', '按Enter回车自动添加' => '按Enter回车自动添加', '添加一个标签' => '添加一个标签', '系统字段不允许删除!' => '系统字段不允许删除!', '请选择字段!' => '请选择字段!', '请选择栏目!' => '请选择栏目!', '参数有误!' => '参数有误!', '请选择桌面配置!' => '请选择桌面配置!', '系统默认不可删除!' => '系统默认不可删除!', '网站地图创建成功!' => '网站地图创建成功!', '网站地图创建失败,请检查根目录权限!' => '网站地图创建失败,请检查根目录权限!', '清除失败!' => '清除失败!', '清除成功!' => '清除成功!', '生成失败!' => '生成失败!', '生成成功!' => '生成成功!', '已清理一部分页面,请不要关闭当前页面,还需要继续清理HTML~' => '已清理一部分页面,请不要关闭当前页面,还需要继续清理HTML~', '已生成一部分页面,请不要关闭当前页面,还需要继续生成HTML~' => '已生成一部分页面,请不要关闭当前页面,还需要继续生成HTML~', '静态HTML页面已全部清理完毕!' => '静态HTML页面已全部清理完毕!', '总共清理页面数:' => '总共清理页面数:', '每次清理页面数:' => '每次清理页面数:', '停顿时间:' => '停顿时间:', '开始时间:' => '开始时间:', '结束时间:' => '结束时间:', '总共花费时间:' => '总共花费时间:', '总共生成页面数:' => '总共生成页面数:', '每次生成页面数:' => '每次生成页面数:', '系统创建目录失败!' => '系统创建目录失败!', '模块未绑定栏目,无法生存HTML!' => '模块未绑定栏目,无法生存HTML!', '链接错误!' => '链接错误!', '请输入属性名称!' => '请输入属性名称!', '属性已存在!' => '属性已存在!', '参数错误!' => '参数错误!', '系统属性只允许修改和隐藏,不允许删除!' => '系统属性只允许修改和隐藏,不允许删除!', '请输入内链词!' => '请输入内链词!', '请输入内链!' => '请输入内链!', '内链词已存在!' => '内链词已存在!', '已审' => '已审', '退回' => '退回', '未审' => '未审', '账户密码不能为空!' => '账户密码不能为空!', '验证码错误!' => '验证码错误!', '该账户已被封禁!' => '该账户已被封禁!', '登录成功!' => '登录成功!', '账户密码错误!' => '账户密码错误!', '安全退出~' => '安全退出~', '无' => '无', '不显示' => '不显示', '邮箱已被注册!' => '邮箱已被注册!', '添加失败,请重新提交!' => '添加失败,请重新提交!', '没有找到该用户!' => '没有找到该用户!', '该分组下存在用户,请先移除用户再删除!' => '该分组下存在用户,请先移除用户再删除!', '删除失败,该分类有下级功能,请先删除下级功能!' => '删除失败,该分类有下级功能,请先删除下级功能!', '未选择删除对象!' => '未选择删除对象!', '模块名和标识不能为空!' => '模块名和标识不能为空!', '模型已添加不能重复添加!' => '模型已添加不能重复添加!', '该表已存在!' => '该表已存在!', '标题' => '标题', '默认为空' => '默认为空', '所属栏目' => '所属栏目', '选择栏目' => '选择栏目', '绑定后可以在当前模型的其他栏目中显示' => '绑定后可以在当前模型的其他栏目中显示', '关键词' => '关键词', '每个词用英文逗号(,)拼接' => '每个词用英文逗号(,)拼接', '缩略图' => '缩略图', '可留空' => '可留空', '简介' => '简介', '内容' => '内容', '发布会员' => '发布会员', '前台发布会员ID记录' => '前台发布会员ID记录', '管理员' => '管理员', '后台发布管理员ID记录' => '后台发布管理员ID记录', '外链URL' => '外链URL', '默认为空,系统访问内容则直接跳转到此链接' => '默认为空,系统访问内容则直接跳转到此链接', '自定义URL' => '自定义URL', '默认为空,自定义URL' => '默认为空,自定义URL', '点击量' => '点击量', '系统自动添加' => '系统自动添加', '评论数' => '评论数', '系统自带' => '系统自带', '点赞数' => '点赞数', '排序' => '排序', '添加时间' => '添加时间', '选择时间' => '选择时间', '推荐属性' => '推荐属性', '1置顶2热点3推荐' => '1置顶2热点3推荐', '置顶=1,热点=2,推荐=3' => '置顶=1,热点=2,推荐=3', '是否显示' => '是否显示', '显示隐藏' => '显示隐藏', '显示=1,未审=0,退回=2' => '显示=1,未审=0,退回=2', '列表' => '列表', '新增' => '新增', '修改' => '修改', '复制' => '复制', '批量删除' => '批量删除', '批量修改' => '批量修改', '批量复制' => '批量复制', '批量审核' => '批量审核', '管理' => '管理', '新增模型成功,快去创建对应的栏目吧!' => '新增模型成功,快去创建对应的栏目吧!', '新增模型成功,快去设置表字段吧!' => '新增模型成功,快去设置表字段吧!', '新增模型失败!' => '新增模型失败!', '标识不能为空!' => '标识不能为空!', '系统模型标识不允许修改!' => '系统模型标识不允许修改!', '页面有错误,缺少模块ID!' => '页面有错误,缺少模块ID!', '里面存在数据,请先清空表内数据!' => '里面存在数据,请先清空表内数据!', '是系统模型,不允许删除!' => '是系统模型,不允许删除!', '字段表记录未清除,请手动清除!' => '字段表记录未清除,请手动清除!', '模型' => '模型', '用户' => '用户', '栏目链接' => '栏目链接', '外链' => '外链', '自定义链接' => '自定义链接', '发布时间' => '发布时间', '字段名称不能为空!' => '字段名称不能为空!', '显示=1,隐藏=0' => '显示=1,隐藏=0', '显示=1,隐藏=0,退回=2' => '显示=1,隐藏=0,退回=2', '是=1,否=0' => '是=1,否=0', '重构成功!' => '重构成功!', '系统栏目' => '系统栏目', '系统副栏目' => '系统副栏目', '模型标识' => '模型标识', '发布管理员' => '发布管理员', '前台用户' => '前台用户', '待付款' => '待付款', '已付' => '已付', '超时' => '超时', '待审核待支付' => '待审核待支付', '已发货' => '已发货', '已废弃' => '已废弃', '未付' => '未付', '您的订单发货通知' => '您的订单发货通知', '尊敬的' => '尊敬的', '您的订单已发货了,这几天请您留意一下快递,谢谢您的惠顾!期待再次为您服务!' => '您的订单已发货了,这几天请您留意一下快递,谢谢您的惠顾!期待再次为您服务!', '订单详细信息如下:' => '订单详细信息如下:', '主图' => '主图', '价格' => '价格', '购买数量' => '购买数量', '总价' => '总价', '折扣:' => '折扣:', '元' => '元', '运费:' => '运费:', '¥' => '¥', '合计:' => '合计:', '收件地址:' => '收件地址:', '联系电话:' => '联系电话:', '钱包' => '钱包', '积分' => '积分', '充值' => '充值', '兑换' => '兑换', '奖励' => '奖励', '该用户不存在!' => '该用户不存在!', '充值数量不对!' => '充值数量不对!', '操作失败!' => '操作失败!', '插件配置' => '插件配置', '未分类' => '未分类', '商品配置' => '商品配置', '批量复制失败!' => '批量复制失败!', '部分未执行成功!' => '部分未执行成功!', '还原失败,可能是ID已经存在!' => '还原失败,可能是ID已经存在!', '数据不存在!' => '数据不存在!', '删除失败,系统功能不能删除!' => '删除失败,系统功能不能删除!', '配置栏下有自定义配置,无法删除配置栏' => '配置栏下有自定义配置,无法删除配置栏', '已存在配置标识,请重新设置!' => '已存在配置标识,请重新设置!', '提交成功!' => '提交成功!', '删除失败!系统字段不允许删除!' => '删除失败!系统字段不允许删除!', '图片不存在,删除失败!' => '图片不存在,删除失败!', '远程存储图片无法删除!' => '远程存储图片无法删除!', '图片ID错误!' => '图片ID错误!', '部分删除成功,存在远程链接无法删除!' => '部分删除成功,存在远程链接无法删除!', '非法操作' => '非法操作', '请检查目录' => '请检查目录', '写入权限' => '写入权限', '配置成功!' => '配置成功!', '参数存在安全隐患!' => '参数存在安全隐患!', '参数错误,必须携带插件ID!' => '参数错误,必须携带插件ID!', '发生错误' => '发生错误', '下载缓存文件不存在!' => '下载缓存文件不存在!', '请选择使用场景!' => '请选择使用场景!', '执行插件安装程序失败!' => '执行插件安装程序失败!', '安装成功!' => '安装成功!', '备份成功!' => '备份成功!', '该插件暂无更新!' => '该插件暂无更新!', '参数错误,请选择对应模板!' => '参数错误,请选择对应模板!', '文件不存在!' => '文件不存在!', '解压失败!' => '解压失败!', '数据库中没有表!' => '数据库中没有表!', '写入文件失败!' => '写入文件失败!', ' 写入文件失败!' => ' 写入文件失败!', '解压完毕!本次解压花费' => '解压完毕!本次解压花费', '秒' => '秒', '更新成功!' => '更新成功!', '个人中心' => '个人中心', '测试1' => '测试1', '测试2' => '测试2', '测试3' => '测试3', '接口报错' => '接口报错', '微信配置错误!' => '微信配置错误!', '网站首页' => '网站首页', '首页' => '首页', '碎片化管理' => '碎片化管理', '新增碎片' => '新增碎片', '刷新' => '刷新', '基本信息' => '基本信息', '使用说明' => '使用说明', '指定几个id或者几个tid的内容输出' => '指定几个id或者几个tid的内容输出', 'SQL中输入' => 'SQL中输入', '或者' => '或者', '模糊查询,查询标题跟 “网站建设” 相关的内容' => '模糊查询,查询标题跟 “网站建设” 相关的内容', '网站建设' => '网站建设', '模糊查询,查询标题/内容跟 “网站建设” 相关的内容' => '模糊查询,查询标题/内容跟 “网站建设” 相关的内容', '不支持联表查询' => '不支持联表查询', '注意字符串都要使用英文单引号' => '注意字符串都要使用英文单引号', '如' => '如', '碎片名称' => '碎片名称', '碎片标识' => '碎片标识', '建议英文,不要重复' => '建议英文,不要重复', '不限栏目' => '不限栏目', '子栏目包含' => '子栏目包含', '包含' => '包含', '不包含' => '不包含', '输出条数' => '输出条数', '0表示输出所有' => '0表示输出所有', '更新周期' => '更新周期', '单位' => '单位', '分钟' => '分钟', '保存' => '保存', '返回' => '返回', '确定' => '确定', '导航管理' => '导航管理', '新增导航' => '新增导航', '导航名称' => '导航名称', '导航菜单' => '导航菜单', '链接' => '链接', '打开' => '打开', '操作' => '操作', '不填默认栏目名称' => '不填默认栏目名称', '自定义链接则需要填写' => '自定义链接则需要填写', '本页面' => '本页面', '新页面' => '新页面', '管理员管理' => '管理员管理', '新增管理员信息' => '新增管理员信息', '基本' => '基本', '扩展' => '扩展', '登录名' => '登录名', '将会成为您唯一的登入名' => '将会成为您唯一的登入名', '手机' => '手机', '邮箱' => '邮箱', '角色' => '角色', '选择角色' => '选择角色', '密码' => '密码', '6到16个字符,不改请留空' => '6到16个字符,不改请留空', '确认密码' => '确认密码', '状态' => '状态', '正常' => '正常', '禁用' => '禁用', '增加成功' => '增加成功', '修改管理员信息' => '修改管理员信息', '管理员列表' => '管理员列表', '搜索' => '搜索', '是否封禁' => '是否封禁', '封禁' => '封禁', '开始日' => '开始日', '截止日' => '截止日', '请输入用户名' => '请输入用户名', '编辑' => '编辑', '添加管理员' => '添加管理员', '正常|封禁' => '正常|封禁', '所属角色' => '所属角色', '登录时间' => '登录时间', '注册时间' => '注册时间', '确认要删除吗?' => '确认要删除吗?', '请选择对象!' => '请选择对象!', '批量删除成功' => '批量删除成功', '个人信息' => '个人信息', '基础' => '基础', '设置' => '设置', '填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!' => '填写内容时,请先选择栏目,否则切换栏目后,数据会丢失!', '恢复数据' => '恢复数据', '此规则配置仅在不填留空的情况下才会触发' => '此规则配置仅在不填留空的情况下才会触发', 'SEO标题' => 'SEO标题', '等于内容标题' => '等于内容标题', '不填则留空' => '不填则留空', '缩略图规则' => '缩略图规则', '自动获取内容第一张图片' => '自动获取内容第一张图片', '不自动获取' => '不自动获取', '简介规则' => '简介规则', '自动获取内容前200字符' => '自动获取内容前200字符', 'TAG规则' => 'TAG规则', '同步关键词' => '同步关键词', '不同步关键词' => '不同步关键词', '敏感词过滤字段' => '敏感词过滤字段', '需要过滤敏感词在系统配置中进行设置' => '需要过滤敏感词在系统配置中进行设置', '请输入需要过滤的字段' => '请输入需要过滤的字段', '返回列表' => '返回列表', '取消' => '取消', '预览' => '预览', '批量修改栏目' => '批量修改栏目', '修改推荐属性' => '修改推荐属性', '审核' => '审核', '列表字段设置' => '列表字段设置', '顶' => '顶', '热' => '热', '荐' => '荐', '请选择修改栏目!' => '请选择修改栏目!', '确认要批量修改内容分类吗?' => '确认要批量修改内容分类吗?', '批量修改成功' => '批量修改成功', '请选择修改属性!' => '请选择修改属性!', '请选择修改对象!' => '请选择修改对象!', '请选择审核选项!' => '请选择审核选项!', '请选择审核对象!' => '请选择审核对象!', '确认要批量处理吗?' => '确认要批量处理吗?', '批量审核成功' => '批量审核成功', '确认要复制吗?' => '确认要复制吗?', '批量复制成功' => '批量复制成功', '添加属性' => '添加属性', '名称' => '名称', '修改属性' => '修改属性', '新增属性' => '新增属性', '系统设置' => '系统设置', '数据库管理' => '数据库管理', '备份数据库' => '备份数据库', '备份数:' => '备份数:', '数据库备份名' => '数据库备份名', '大小' => '大小', '备份副本' => '备份副本', '还原数据' => '还原数据', '删除备份' => '删除备份', '还原数据库将覆盖现有的数据库,您确认要还原数据库吗?' => '还原数据库将覆盖现有的数据库,您确认要还原数据库吗?', '您确定要删除备份数据库吗?删除后将不可找回!' => '您确定要删除备份数据库吗?删除后将不可找回!', '数据缓存' => '数据缓存', '文件夹cache/data,主要是网站内容缓存,栏目,详情页等' => '文件夹cache/data,主要是网站内容缓存,栏目,详情页等', '文件夹cache/tmp,主要是服务器session文件缓存,当前session将不会被清空' => '文件夹cache/tmp,主要是服务器session文件缓存,当前session将不会被清空', '日志缓存' => '日志缓存', '文件夹cache/log,包括错误日志、支付日志、登录日志等' => '文件夹cache/log,包括错误日志、支付日志、登录日志等', '模板缓存' => '模板缓存', '文件夹cache,主要是程序执行时生成的模板编译文件' => '文件夹cache,主要是程序执行时生成的模板编译文件', '缩略图缓存' => '缩略图缓存', '文件夹image,主要是程序执行时生成的自定义缩略图' => '文件夹image,主要是程序执行时生成的自定义缩略图', '立即清空' => '立即清空', '请选择清空目标!' => '请选择清空目标!', '清理成功!' => '清理成功!', '内链管理' => '内链管理', '添加内链' => '添加内链', '内链词' => '内链词', '内链' => '内链', '替换词' => '替换词', '替换次数' => '替换次数', '替换词,可为空!' => '替换词,可为空!', '请填写内链' => '请填写内链', '替换次数,默认-1,替换全部,可不写。' => '替换次数,默认-1,替换全部,可不写。', '提交' => '提交', '修改内链' => '修改内链', '内链词和内链不能为空!' => '内链词和内链不能为空!', '充值类型' => '充值类型', '当前兑换率:' => '当前兑换率:', '兑换率指1元相当于多少钱包/积分' => '兑换率指1元相当于多少钱包/积分', '交易类型' => '交易类型', '赠送' => '赠送', '充值数量' => '充值数量', '用户ID' => '用户ID', '备注' => '备注', '添加' => '添加', '充值管理' => '充值管理', '充值列表' => '充值列表', '选择交易类型' => '选择交易类型', '买入' => '买入', '选择交易种类' => '选择交易种类', '请输入前台用户手机号' => '请输入前台用户手机号', '请输入用户昵称' => '请输入用户昵称', '请输入订单号' => '请输入订单号', '会员充值' => '会员充值', '总订单' => '总订单', '已充值' => '已充值', '已兑换' => '已兑换', '总赠送' => '总赠送', '尾页' => '尾页', '订单号' => '订单号', '类型' => '类型', '交易' => '交易', '用户名' => '用户名', '数量' => '数量', '金额' => '金额', '时间' => '时间', '查看' => '查看', '选择模块' => '选择模块', '选择上级' => '选择上级', '顶级栏目' => '顶级栏目', '分类名' => '分类名', '图片 ' => '图片 ', '择图片' => '择图片', '排序规则' => '排序规则', '组合:排序倒序,时间倒序,ID倒序' => '组合:排序倒序,时间倒序,ID倒序', '组合:排序倒序,ID正序' => '组合:排序倒序,ID正序', '排序正序' => '排序正序', '时间倒序' => '时间倒序', 'ID正序' => 'ID正序', '点击量倒序' => '点击量倒序', '时间正序' => '时间正序', '默认不需要更改' => '默认不需要更改', 'URL命名' => 'URL命名', '请填写文件名,如:index,不填请留空' => '请填写文件名,如:index,不填请留空', '填写栏目命名后,系统将自动用作该栏目URL链接,如:news,访问该栏目链接:' => '填写栏目命名后,系统将自动用作该栏目URL链接,如:news,访问该栏目链接:', '多个相同URL,将覆盖前面的栏目' => '多个相同URL,将覆盖前面的栏目', '列表显示' => '列表显示', '设置列表页显示的内容条数' => '设置列表页显示的内容条数', '栏目模板' => '栏目模板', '手动填写,不填请留空' => '手动填写,不填请留空', '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面。默认栏目首页' => '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面。默认栏目首页', '详情页模板' => '详情页模板', '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面,列表内的详情页。' => '请将模板文件放到对应的模块文件夹下面,如文章(article)模块,那么就要在当前模板目录的article文件夹下面,列表内的详情页。', '栏目外链' => '栏目外链', '栏目外链,如:htt://xxx.com/abc,不填请留空' => '栏目外链,如:htt://xxx.com/abc,不填请留空', '填写栏目外链后,访问栏目链接将会跳到外链,不填请留空!' => '填写栏目外链后,访问栏目链接将会跳到外链,不填请留空!', '发布显示' => '发布显示', '勾选后,前台会员发布会显示该栏目' => '勾选后,前台会员发布会显示该栏目', '导航显示' => '导航显示', '模板覆盖' => '模板覆盖', '覆盖' => '覆盖', '不覆盖' => '不覆盖', '模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。' => '模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。', '访问限制' => '访问限制', '是否关闭' => '是否关闭', '关闭' => '关闭', '开启' => '开启', '栏目关闭后,前台不显示,也无法访问!' => '栏目关闭后,前台不显示,也无法访问!', '增加' => '增加', '请选择模板页面/使用自定义' => '请选择模板页面/使用自定义', '批量新增' => '批量新增', '添加栏目' => '添加栏目', '格式:栏目名|栏目URL,一行一个,如:关于我们|about' => '格式:栏目名|栏目URL,一行一个,如:关于我们|about', '格式:栏目名|栏目URL,一行一个' => '格式:栏目名|栏目URL,一行一个', '请选择模板页面' => '请选择模板页面', '图片 ' => '图片 ', '请填写完整文件名,如:index,不填请留空' => '请填写完整文件名,如:index,不填请留空', ' 模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。' => ' 模板覆盖指:显示数量及使用模板文件下级一样,减少同步操作。如果上级勾选了覆盖下级,那么下级默认调用上级填写的模板。', '请选择栏目' => '请选择栏目', '顶级' => '顶级', '展开|折叠' => '展开|折叠', '模块名' => '模块名', '快捷操作' => '快捷操作', '显示|隐藏' => '显示|隐藏', '添加下级' => '添加下级', '字段管理' => '字段管理', '新增文章' => '新增文章', '新增商品' => '新增商品', '新增内容' => '新增内容', '请选择对象' => '请选择对象', '已删除!' => '已删除!', '删除成功' => '删除成功', '扩展管理' => '扩展管理', '新增轮播图' => '新增轮播图', '所属分类' => '所属分类', '图片' => '图片', '图片高' => '图片高', '0表示不限制' => '0表示不限制', '图片宽' => '图片宽', '跳转链接' => '跳转链接', '不填请留空' => '不填请留空', '数字越大越靠前' => '数字越大越靠前', '修改轮播图' => '修改轮播图', '选择分类' => '选择分类', '更新时间' => '更新时间', '轮播图列表' => '轮播图列表', '请选择分类' => '请选择分类', '请输入标题' => '请输入标题', '新增图片' => '新增图片', '分类列表' => '分类列表', '添加分类' => '添加分类', '共有数据:' => '共有数据:', '条' => '条', '长' => '长', '宽' => '宽', '轮播图分类' => '轮播图分类', '评论管理' => '评论管理', '添加评论' => '添加评论', '评论栏目' => '评论栏目', '文章ID' => '文章ID', '主回复ID' => '主回复ID', '同属于一个评论的ID,如果没有评论中的评论,则为0' => '同属于一个评论的ID,如果没有评论中的评论,则为0', '回复帖子ID' => '回复帖子ID', '评论内容' => '评论内容', '管理员回复' => '管理员回复', '是否提醒回复' => '是否提醒回复', '提醒' => '提醒', '不提醒' => '不提醒', '喜欢/点赞' => '喜欢/点赞', '是否已读' => '是否已读', '是否删除' => '是否删除', '已删除' => '已删除', '未删除' => '未删除', '只能管理员删除评论,用户只能软删除评论' => '只能管理员删除评论,用户只能软删除评论', '查看评论' => '查看评论', '评论列表' => '评论列表', '请输入评论内容' => '请输入评论内容', '查看相关内容' => '查看相关内容', '查看用户' => '查看用户', '所属文章' => '所属文章', '评论时间' => '评论时间', '请选择审核选项' => '请选择审核选项', '批量处理成功' => '批量处理成功', '调用方式' => '调用方式', '这里输出想要的内容,如:' => '这里输出想要的内容,如:', '查看SQL' => '查看SQL', '系统扩展' => '系统扩展', '桌面管理' => '桌面管理', '新增配置' => '新增配置', '配置名称' => '配置名称', '左侧菜单栏' => '左侧菜单栏', '没有二级菜单不会生效' => '没有二级菜单不会生效', '顶部菜单栏' => '顶部菜单栏', '适用角色' => '适用角色', '默认所有' => '默认所有', '系统默认' => '系统默认', '系统默认指没有指定桌面配置的管理员,进入后台后默认的配置' => '系统默认指没有指定桌面配置的管理员,进入后台后默认的配置', '一个菜单名称' => '一个菜单名称', '顶级菜单' => '顶级菜单', '菜单图标' => '菜单图标', '二级菜单' => '二级菜单', '图标' => '图标', '修改菜单名称' => '修改菜单名称', '确定要删除吗?' => '确定要删除吗?', '最后一个索引不能删除!' => '最后一个索引不能删除!', '添加菜单名称' => '添加菜单名称', '菜单选择' => '菜单选择', '图标选择' => '图标选择', '修改配置' => '修改配置', '桌面名称' => '桌面名称', '系统' => '系统', '是否默认' => '是否默认', '所有角色' => '所有角色', '复制配置' => '复制配置', '修改碎片' => '修改碎片', '指定几个id或者几个tid的内容输出(栏目:不限制栏目)' => '指定几个id或者几个tid的内容输出(栏目:不限制栏目)', 'SQL中输入:' => 'SQL中输入:', 'SQL中输入: ' => 'SQL中输入: ', '如: ' => '如: ', '单位:分钟' => '单位:分钟', '修改导航' => '修改导航', '扩展模型管理' => '扩展模型管理', '模块管理' => '模块管理', '新增字段' => '新增字段', '角色绑定' => '角色绑定', '目绑定' => '目绑定', '字段名称' => '字段名称', '简短的名称' => '简短的名称', '字段标识' => '字段标识', '只能英文字母[或者后面+数字],必须含有英文字母,小写字母,简短' => '只能英文字母[或者后面+数字],必须含有英文字母,小写字母,简短', '字段类型' => '字段类型', '选择' => '选择', '长度' => '长度', '说明' => '说明', '不限' => '不限', '带编辑器文本' => '带编辑器文本', '只能填写数字,长度不能超过11位' => '只能填写数字,长度不能超过11位', '金钱,小数等,保留2位' => '金钱,小数等,保留2位', '时间日期' => '时间日期', '多图,图集' => '多图,图集', '红=1,黄=2' => '红=1,黄=2', '单项选择,下拉选择,如:红=1,黄=2,蓝=3' => '单项选择,下拉选择,如:红=1,黄=2,蓝=3', '单项选择,按钮选择,如:红=1,黄=2,蓝=3' => '单项选择,按钮选择,如:红=1,黄=2,蓝=3', '多项选择,如:红=1,黄=2,蓝=3' => '多项选择,如:红=1,黄=2,蓝=3', '一个附件,压缩包,Excel,Word文档' => '一个附件,压缩包,Excel,Word文档', '多个附件,压缩包,Excel,Word文档' => '多个附件,压缩包,Excel,Word文档', '请选择关联模块' => '请选择关联模块', '列表显示字段' => '列表显示字段', '单选关联,可以直接调用关联模块内容列表,列表显示对应字段内容' => '单选关联,可以直接调用关联模块内容列表,列表显示对应字段内容', '多行录入,可以在页面动态新增内容输入框' => '多行录入,可以在页面动态新增内容输入框', '多选关联,可以直接调用关联模块内容列表,列表显示对应字段内容' => '多选关联,可以直接调用关联模块内容列表,列表显示对应字段内容', '系统栏目,不可修改' => '系统栏目,不可修改', '系统副栏目,不可修改' => '系统副栏目,不可修改', '系统TAG,不可修改' => '系统TAG,不可修改', '默认值' => '默认值', '默认字段值,不填默认int类型的值是0,string类型的值是null。多选参数的值是两边带【,】,如【,1,】表示值为1' => '默认字段值,不填默认int类型的值是0,string类型的值是null。多选参数的值是两边带【,】,如【,1,】表示值为1', '字段提示' => '字段提示', '用于填写时的提示信息,50字以内' => '用于填写时的提示信息,50字以内', '表单排序' => '表单排序', '是否必填' => '是否必填', '必填' => '必填', '非必填' => '非必填', '带有文本框编辑器的除外' => '带有文本框编辑器的除外', '前台显示' => '前台显示', '前台表单' => '前台表单', '后台显示' => '后台显示', '后台搜索' => '后台搜索', '仅用于后台列表头部带有该字段搜索' => '仅用于后台列表头部带有该字段搜索', '列表中显示' => '列表中显示', '仅用于后台列表显示该字段' => '仅用于后台列表显示该字段', '显示格式化' => '显示格式化', '不做处理' => '不做处理', '仅用于后台列表显示该字段内容处理' => '仅用于后台列表显示该字段内容处理', 'ajax可访问' => 'ajax可访问', '不能' => '不能', '能' => '能', '由于本系统对json数据封装,限制访问可以提高安全性' => '由于本系统对json数据封装,限制访问可以提高安全性', '角色名' => '角色名', '栏目名' => '栏目名', '修改字段' => '修改字段', '栏目绑定' => '栏目绑定', '红=1,黄=2,蓝=3' => '红=1,黄=2,蓝=3', '关联模块内容ID' => '关联模块内容ID', '可以在页面动态新增内容输入框' => '可以在页面动态新增内容输入框', '温馨提示:排序和宽度在列表点击也可以更改。' => '温馨提示:排序和宽度在列表点击也可以更改。', '排序:当前列表显示排序,不会影响录入排序,越大越靠前。' => '排序:当前列表显示排序,不会影响录入排序,越大越靠前。', '搜索:在列表顶部的搜索中,可以搜索该字段。' => '搜索:在列表顶部的搜索中,可以搜索该字段。', '宽度:列表显示的宽度。由于屏幕宽度问题,可以根据自己关注的字段在列表中显示更清晰,默认100。' => '宽度:列表显示的宽度。由于屏幕宽度问题,可以根据自己关注的字段在列表中显示更清晰,默认100。', '宽度' => '宽度', '批量绑定栏目' => '批量绑定栏目', '字段' => '字段', '后台' => '后台', '确认要删除吗?删除的同时将删除对应的表内容!' => '确认要删除吗?删除的同时将删除对应的表内容!', '角色管理' => '角色管理', '角色修改' => '角色修改', '是否超管' => '是否超管', '不是' => '不是', '超级管理员拥有无上权利,无视下面权限限制' => '超级管理员拥有无上权利,无视下面权限限制', '发布审核' => '发布审核', '超级管理员除外,发布的内容是否需要审核' => '超级管理员除外,发布的内容是否需要审核', '栏目权限' => '栏目权限', '是否设置栏目权限,默认不设置。开启后下面的栏目权限设置才有效' => '是否设置栏目权限,默认不设置。开启后下面的栏目权限设置才有效', '选中顶级栏目,则默认子栏目也选中。如果只需要子栏目权限,请不要选中顶级栏目' => '选中顶级栏目,则默认子栏目也选中。如果只需要子栏目权限,请不要选中顶级栏目', '子栏目' => '子栏目', '拥有权限' => '拥有权限', '选中主模块,则默认子模块也选中。如果只需要子模块权限,请不要选中主模块' => '选中主模块,则默认子模块也选中。如果只需要子模块权限,请不要选中主模块', '主模块' => '主模块', '子模块' => '子模块', '描述' => '描述', '请输入内容' => '请输入内容', '关闭后,该分组管理员将不能登录' => '关闭后,该分组管理员将不能登录', '添加角色' => '添加角色', '后台管理' => '后台管理', '展开左侧栏' => '展开左侧栏', '清理缓存' => '清理缓存', '退出' => '退出', '前台首页' => '前台首页', '后台首页' => '后台首页', '我的桌面' => '我的桌面', '关闭当前' => '关闭当前', '关闭其他' => '关闭其他', '关闭所有' => '关闭所有', '扩展模块管理' => '扩展模块管理', '批量修改分类' => '批量修改分类', '批量处理' => '批量处理', '友情链接分类' => '友情链接分类', '分类' => '分类', '后台管理登录' => '后台管理登录', '验证码' => '验证码', '登录' => '登录', '登录ID' => '登录ID', '登录用户' => '登录用户', '模块' => '模块', '方法' => '方法', '操作时间' => '操作时间', '会员管理' => '会员管理', '新增会员' => '新增会员', '用于找回密码' => '用于找回密码', '手机号' => '手机号', '必须唯一' => '必须唯一', '昵称' => '昵称', '分组' => '分组', '头像' => '头像', '生日' => '生日', '个性签名' => '个性签名', '省份' => '省份', '城市' => '城市', '详细地址' => '详细地址', '6到16个字符' => '6到16个字符', '添加成功' => '添加成功', '会员修' => '会员修', '6到16个字符,不修改请留空' => '6到16个字符,不修改请留空', '修改成功' => '修改成功', '会员列表' => '会员列表', '请输入手机号' => '请输入手机号', '余额' => '余额', '加入时间' => '加入时间', '分组管理' => '分组管理', '分组修改' => '分组修改', '分组名' => '分组名', '折扣类型' => '折扣类型', '无折扣' => '无折扣', '现金折扣' => '现金折扣', '百分比折扣' => '百分比折扣', '折扣金额' => '折扣金额', '百分比折扣请填写0.01-1之间的小数(如5折,填0.5),无折扣时,该参数设置无效' => '百分比折扣请填写0.01-1之间的小数(如5折,填0.5),无折扣时,该参数设置无效', '登录状态' => '登录状态', '请选择所属单位!' => '请选择所属单位!', '用户管理' => '用户管理', '会员分组' => '会员分组', '添加分组' => '添加分组', '温馨提示:前台权限已关闭,设置权限不会生效。' => '温馨提示:前台权限已关闭,设置权限不会生效。', '温馨提示:前台权限已开启,权限设置将直接影响前台访问,请谨慎操作!' => '温馨提示:前台权限已开启,权限设置将直接影响前台访问,请谨慎操作!', '留言管理' => '留言管理', '查看留言' => '查看留言', '问题描述' => '问题描述', '用户昵称' => '用户昵称', '留言栏目' => '留言栏目', '不指定栏目' => '不指定栏目', '联系电话' => '联系电话', '留言IP' => '留言IP', '留言内容' => '留言内容', '是否审核' => '是否审核', '提交时间' => '提交时间', '修改保存' => '修改保存', '留言列表' => '留言列表', '请输入相关内容ID' => '请输入相关内容ID', '内容ID' => '内容ID', '模型管理' => '模型管理', '新增模型' => '新增模型', '模型名称' => '模型名称', '必须是英文字母,且不能是已存在的标识,标识即是数据库里的表名' => '必须是英文字母,且不能是已存在的标识,标识即是数据库里的表名', '是否必选栏目' => '是否必选栏目', '新增修改内容时必选' => '新增修改内容时必选', '是否显示栏目' => '是否显示栏目', '列表展示、录入内容、修改内容三个页面是否展示栏目' => '列表展示、录入内容、修改内容三个页面是否展示栏目', '是否受权限控制' => '是否受权限控制', '不同角色可以通过控制栏目权限来限制查看内容' => '不同角色可以通过控制栏目权限来限制查看内容', '栏目绑定显示' => '栏目绑定显示', '栏目绑定时是否显示该模型' => '栏目绑定时是否显示该模型', '前台发布' => '前台发布', '前台是否允许发布' => '前台是否允许发布', '列表模板' => '列表模板', '默认列表模板' => '默认列表模板', '详情模板' => '详情模板', '默认详情模板' => '默认详情模板', '是否开启' => '是否开启', '数值越小越靠前' => '数值越小越靠前', '已有表' => '已有表', '如果数据库已经有这个表了,就选择"是",否则就选"不是"' => '如果数据库已经有这个表了,就选择"是",否则就选"不是"', '是否可以预览' => '是否可以预览', '如果后台无法预览,则选择 “否” ,列表中将不会出现 [预览]' => '如果后台无法预览,则选择 “否” ,列表中将不会出现 [预览]', '修改模型' => '修改模型', '模型状态' => '模型状态', '模型分类' => '模型分类', '允许' => '允许', '已停用' => '已停用', '已启用' => '已启用', '重构字段' => '重构字段', '确认要删除吗?删除的同时将删除对应的表!' => '确认要删除吗?删除的同时将删除对应的表!', '订单列表' => '订单列表', '订单详情' => '订单详情', '姓名' => '姓名', '是否支付' => '是否支付', '已支付' => '已支付', '未支付' => '未支付', '支付时间' => '支付时间', '存储内容' => '存储内容', '订单内容' => '订单内容', '商品' => '商品', '商品已删除' => '商品已删除', '收货信息:' => '收货信息:', '收件人:' => '收件人:', '联系手机:' => '联系手机:', '联系邮箱:' => '联系邮箱:', '收货地址:' => '收货地址:', '订单状态' => '订单状态', '订单已删除' => '订单已删除', '已提交未支付' => '已提交未支付', '超时订单' => '超时订单', '订单更改为‘已出货’,点‘确定修改’后,将发送一封邮件通知客户。订单未变化状态则不会发送邮件' => '订单更改为‘已出货’,点‘确定修改’后,将发送一封邮件通知客户。订单未变化状态则不会发送邮件', '发货时间' => '发货时间', '确定修改' => '确定修改', '订单管理' => '订单管理', '选择状态' => '选择状态', '支付方式' => '支付方式', '线下支付' => '线下支付', '钱包支付' => '钱包支付', '积分兑换' => '积分兑换', '支付宝支付' => '支付宝支付', '微信支付' => '微信支付', '微信H5支付' => '微信H5支付', '微信扫码支付' => '微信扫码支付', '支付宝H5支付' => '支付宝H5支付', '总收入' => '总收入', '付款方式' => '付款方式', '是否付款' => '是否付款', '付款时间' => '付款时间', '图库管理' => '图库管理', '筛选上传入口' => '筛选上传入口', '前台' => '前台', '筛选模块' => '筛选模块', '其他杂项' => '其他杂项', '系统配置' => '系统配置', '筛选栏目' => '筛选栏目', '上传前台' => '上传前台', '所属模块' => '所属模块', '本地文件' => '本地文件', '文件大小' => '文件大小', '其他' => '其他', '插件管理' => '插件管理', '插件列表' => '插件列表', '全部' => '全部', '本地' => '本地', '请输入插件名字' => '请输入插件名字', '插件名' => '插件名', '版本' => '版本', '作者' => '作者', '平台' => '平台', '插件文件' => '插件文件', '开关' => '开关', '安装说明' => '安装说明', '点击查看' => '点击查看', '更新说明' => '更新说明', '新' => '新', '官方' => '官方', '第三方' => '第三方', '开|停' => '开|停', '配置' => '配置', '导出' => '导出', '卸载' => '卸载', '安装' => '安装', '下载' => '下载', '获取文件大小失败,请检查网络!' => '获取文件大小失败,请检查网络!', '正在安装中,请稍等~' => '正在安装中,请稍等~', '正在删除中,请稍等~' => '正在删除中,请稍等~', '正在卸载中,请稍等~' => '正在卸载中,请稍等~', '设置接口' => '设置接口', '当前版本:' => '当前版本:', '最新版本:' => '最新版本:', '作者:' => '作者:', '更新时间:' => '更新时间:', '更新内容' => '更新内容', '正在下载文件' => '正在下载文件', '升级插件' => '升级插件', '文件下载完成!正在解压~' => '文件下载完成!正在解压~', '文件解压完成!正在进行安装~' => '文件解压完成!正在进行安装~', '插件升级成功!' => '插件升级成功!', '插件已升级完毕!' => '插件已升级完毕!', '功能' => '功能', '函数名' => '函数名', '对应的控制器/函数,如果是顶级,则只需要写控制器名' => '对应的控制器/函数,如果是顶级,则只需要写控制器名', '权限列表' => '权限列表', '添加权限' => '添加权限', '控制器/方法' => '控制器/方法', '添加子功能' => '添加子功能', '权限管理' => '权限管理', '栏目选择' => '栏目选择', '权限选择' => '权限选择', '不能选择的权限是非独立功能' => '不能选择的权限是非独立功能', '请先勾选菜单!' => '请先勾选菜单!', '扩展信息' => '扩展信息', '回收站' => '回收站', '还原' => '还原', '批量恢复' => '批量恢复', '确认要删除吗?删除后就彻底无法恢复了!' => '确认要删除吗?删除后就彻底无法恢复了!', '确认要删除吗?删除后不可恢复!' => '确认要删除吗?删除后不可恢复!', '确认要还原吗?' => '确认要还原吗?', '重构字段可以快速将外部表引入CMS内,使其兼容CMS模型。' => '重构字段可以快速将外部表引入CMS内,使其兼容CMS模型。', '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改' => '重构字段 => 简单选择录入类型 => 字段列表 => 详细字段修改', '温馨提示:外部表必须有个字段为id,且必须是自增主键。如果没有,请先在数据库手动增加这个字段或者把已有的自增字段改成id。' => '温馨提示:外部表必须有个字段为id,且必须是自增主键。如果没有,请先在数据库手动增加这个字段或者把已有的自增字段改成id。', '数据类型' => '数据类型', '录入类型' => '录入类型', '归属' => '归属', '插件' => '插件', '独立功能' => '独立功能', '桌面管理配置时,将调用独立功能' => '桌面管理配置时,将调用独立功能', '手机端已开启,sitemap将包含手机端URL,请注意【手机静态目录' => '手机端已开启,sitemap将包含手机端URL,请注意【手机静态目录', '如果不生成静态文件,请改为' => '如果不生成静态文件,请改为', '手机端未开启,sitemap不会包含手机端URL' => '手机端未开启,sitemap不会包含手机端URL', 'PC端网站地图:' => 'PC端网站地图:', '手机端网站地图:' => '手机端网站地图:', '网站地图' => '网站地图', '模块名称' => '模块名称', '更新频率' => '更新频率', '站内权重' => '站内权重', '输出范围' => '输出范围', '栏目模块' => '栏目模块', '显示的栏目' => '显示的栏目', '所有的栏目' => '所有的栏目', '文章模块' => '文章模块', '显示的文章' => '显示的文章', '所有的文章' => '所有的文章', '商品模块' => '商品模块', '显示的商品' => '显示的商品', '所有的商品' => '所有的商品', '显示的' => '显示的', '所有的' => '所有的', '立即生成' => '立即生成', '网站设置' => '网站设置', '自定义配置' => '自定义配置', '点击复制' => '点击复制', '上传文件' => '上传文件', '不选' => '不选', '删除配置栏' => '删除配置栏', '选择类型' => '选择类型', '编辑器' => '编辑器', '文件上传' => '文件上传', '下拉选项' => '下拉选项', '栏目选项' => '栏目选项', '代码' => '代码', '请填写配置名(中文)' => '请填写配置名(中文)', '配置标识(字母或数字)' => '配置标识(字母或数字)', '配置栏目' => '配置栏目', '提示信息' => '提示信息', '自定义配置可以配置对应配置栏下的自定义内容' => '自定义配置可以配置对应配置栏下的自定义内容', '下拉选项配置,如:开启=1,关闭=0' => '下拉选项配置,如:开启=1,关闭=0', '自定义配置栏' => '自定义配置栏', '请填写配置栏名(中文)' => '请填写配置栏名(中文)', '配置标识(必须是字母)' => '配置标识(必须是字母)', '配置标识用于权限控制,必填且不能与原系统配置栏重复' => '配置标识用于权限控制,必填且不能与原系统配置栏重复', '失败!' => '失败!', '模板管理' => '模板管理', '模板列表' => '模板列表', '请输入模板名字' => '请输入模板名字', '有更新' => '有更新', '已使用' => '已使用', '备份数据' => '备份数据', '安装模板' => '安装模板', '如果数据量较大,不建议通过此方法备份数据库,可以从数据库中直接导出。确定要备份数据库吗?' => '如果数据量较大,不建议通过此方法备份数据库,可以从数据库中直接导出。确定要备份数据库吗?', '提示' => '提示', '安装提示' => '安装提示', '该模板用于:' => '该模板用于:', 'PC端' => 'PC端', '手机端' => '手机端', '微信端' => '微信端', '升级模板' => '升级模板', '模板升级成功!' => '模板升级成功!', '模板已升级完毕!' => '模板已升级完毕!', '您已开启【缓存完整页面】,更新静态HTML需要预留足够的空间,如:总内存500M,已用280M(过半),不建议生成HMTL,可能会导致内存不够!' => '您已开启【缓存完整页面】,更新静态HTML需要预留足够的空间,如:总内存500M,已用280M(过半),不建议生成HMTL,可能会导致内存不够!', '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭' => '可以去【系统设置】-【高级设置】-【缓存完整页面】进行关闭', '请确定空间内存是否足够,如果不够,可以开启【缓存完整页面】,也能达到静态访问打开页面速度!' => '请确定空间内存是否足够,如果不够,可以开启【缓存完整页面】,也能达到静态访问打开页面速度!', '指定栏目' => '指定栏目', '所有栏目' => '所有栏目', '生成电脑静态' => '生成电脑静态', '生成手机静态' => '生成手机静态', '清理电脑静态HTML' => '清理电脑静态HTML', '清理手机静态HTML' => '清理手机静态HTML', '批量生成电脑静态' => '批量生成电脑静态', '批量生成手机静态' => '批量生成手机静态', '批量清理电脑静态' => '批量清理电脑静态', '批量清理手机静态' => '批量清理手机静态', '正在处理~' => '正在处理~', '正在准备生成静态,请不要关闭页面~' => '正在准备生成静态,请不要关闭页面~', '正在准备清理电脑端静态HTML,请不要关闭页面~' => '正在准备清理电脑端静态HTML,请不要关闭页面~', '正在准备清理手机端静态HTML,请不要关闭页面~' => '正在准备清理手机端静态HTML,请不要关闭页面~', '欢迎管理员:' => '欢迎管理员:', '当前时间' => '当前时间', '站内用户' => '站内用户', '人' => '人', '站内文章' => '站内文章', '篇' => '篇', '站内产品' => '站内产品', '件' => '件', '站内留言' => '站内留言', '最近更新' => '最近更新', '全部文章' => '全部文章', '阅读量' => '阅读量', '最新评论' => '最新评论', '在' => '在', '发布了评论' => '发布了评论', '版本信息' => '版本信息', '当前版本' => '当前版本', '项目地址' => '项目地址', '服务器' => '服务器', '操作系统' => '操作系统', '运行环境' => '运行环境', 'PHP版本' => 'PHP版本', '运行方式' => '运行方式', '上传限制' => '上传限制', '用户留言' => '用户留言', '回复' => '回复', '星期天' => '星期天', '星期一' => '星期一', '星期二' => '星期二', '星期三' => '星期三', '星期四' => '星期四', '星期五' => '星期五', '星期六' => '星期六', '评论模块未开启!' => '评论模块未开启!', '您的操作过于频繁,请十分钟后再试~' => '您的操作过于频繁,请十分钟后再试~', '评论内容不能为空!' => '评论内容不能为空!', '请提交栏目ID' => '请提交栏目ID', '栏目ID不能为空!' => '栏目ID不能为空!', '评论奖励' => '评论奖励', '评价成功!' => '评价成功!', '您未登录,请重新登录~' => '您未登录,请重新登录~', '您没有' => '您没有', '的权限!' => '的权限!', '您还未登录,请重新登录!' => '您还未登录,请重新登录!', '上传成功!' => '上传成功!', '已关闭前台上传文件功能' => '已关闭前台上传文件功能', '上传错误!' => '上传错误!', '对不起,您没有访问权限!' => '对不起,您没有访问权限!', '输入url错误!' => '输入url错误!', '缺少ID!' => '缺少ID!', '未找到相应内容!' => '未找到相应内容!', '请输入关键词搜索!' => '请输入关键词搜索!', '搜索超出设定范围!' => '搜索超出设定范围!', '您的搜索超出设定范围!' => '您的搜索超出设定范围!', '系统创建' => '系统创建', '目录失败!' => '目录失败!', '支付成功,但是系统内没有找到相应的订单!' => '支付成功,但是系统内没有找到相应的订单!', '支付失败' => '支付失败', '订单号错误!' => '订单号错误!', '会员中心已关闭!' => '会员中心已关闭!', '您的账户已被冻结!' => '您的账户已被冻结!', '未找到您所在分组,请联系管理员处理!' => '未找到您所在分组,请联系管理员处理!', '您所在的分组被限制登录!' => '您所在的分组被限制登录!', '登录奖励' => '登录奖励', '系统已关闭会员注册!' => '系统已关闭会员注册!', '您的邀请链接不合法!' => '您的邀请链接不合法!', '手机号格式不正确!' => '手机号格式不正确!', '您的邮箱已注册!' => '您的邮箱已注册!', '您的手机号码已注册!' => '您的手机号码已注册!', '邀请奖励' => '邀请奖励', '注册成功,等待审核!' => '注册成功,等待审核!', '注册成功!' => '注册成功!', '注册失败,请重试~' => '注册失败,请重试~', '必须通过邀请链接进行注册!' => '必须通过邀请链接进行注册!', '请输入账号和邮箱!' => '请输入账号和邮箱!', '图形验证码错误!' => '图形验证码错误!', '找回密码' => '找回密码', '您的账号正在进行找回密码操作,如果确定是本人操作,请在10分钟内点击' => '您的账号正在进行找回密码操作,如果确定是本人操作,请在10分钟内点击', '立即找回密码' => '立即找回密码', '过期失效!' => '过期失效!', '您操作过于频繁,请10分钟后再尝试!' => '您操作过于频繁,请10分钟后再尝试!', '找回密码邮件已发送,请到您的邮箱查看!' => '找回密码邮件已发送,请到您的邮箱查看!', '邮箱服务器未配置,无法发送邮件,请联系管理员找回密码!' => '邮箱服务器未配置,无法发送邮件,请联系管理员找回密码!', '输入的信息有误!' => '输入的信息有误!', 'token已失效!' => 'token已失效!', '密码重置成功,请重新登录!' => '密码重置成功,请重新登录!', '新密码不能与旧密码相同!' => '新密码不能与旧密码相同!', '标题不能为空!' => '标题不能为空!', '称呼不能为空!' => '称呼不能为空!', '您的手机号格式不正确!' => '您的手机号格式不正确!', '不能为空!' => '不能为空!', '提交成功!我们会尽快回复您!' => '提交成功!我们会尽快回复您!', '提交失败,请重试!' => '提交失败,请重试!', '链接错误' => '链接错误', '留言未找到或者未审核' => '留言未找到或者未审核', '匿名' => '匿名', '缺少id参数!' => '缺少id参数!', '缺少tid参数!' => '缺少tid参数!', '未找到商品或者已下架!' => '未找到商品或者已下架!', '该模块缺少price价格参数!' => '该模块缺少price价格参数!', '您的订单提交成功通知' => '您的订单提交成功通知', '我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!' => '我们已经收到您的订单,我们会尽快给你发货,请密切关注您的邮箱以获得订单的最新消息,谢谢合作!', '订单详细信息如下' => '订单详细信息如下', '折扣' => '折扣', '运费' => '运费', '合计' => '合计', '收件地址' => '收件地址', '您的订单' => '您的订单', '已经提交,我们会尽快给您发货!' => '已经提交,我们会尽快给您发货!', '订单已支付!' => '订单已支付!', '已经提交,请尽快支付!' => '已经提交,请尽快支付!', '支付订单' => '支付订单', '电脑支付宝支付' => '电脑支付宝支付', '微信内支付' => '微信内支付', '未开启钱包支付!' => '未开启钱包支付!', '您未登录,无法支付!' => '您未登录,无法支付!', '钱包金额不足,请充值!' => '钱包金额不足,请充值!', '未开启积分支付!' => '未开启积分支付!', '积分不足,请充值!' => '积分不足,请充值!', '支付宝当面付' => '支付宝当面付', '其他平台支付' => '其他平台支付', '在线充值' => '在线充值', '交易创建,等待买家付款' => '交易创建,等待买家付款', '未付款交易超时关闭,或支付完成后全额退款' => '未付款交易超时关闭,或支付完成后全额退款', '支付成功' => '支付成功', '交易结束,不可退款' => '交易结束,不可退款', '未知状态' => '未知状态', '订单号错误或订单被删除!' => '订单号错误或订单被删除!', '订单未支付或订单号错误!' => '订单未支付或订单号错误!', '创建订单失败!' => '创建订单失败!', '订单号不存在或已被删除!' => '订单号不存在或已被删除!', '收件人、手机号和收货地址不能为空!' => '收件人、手机号和收货地址不能为空!', '未开启在线支付!' => '未开启在线支付!', '获取openid失败' => '获取openid失败', '非法参数!' => '非法参数!', '标签未找到或已删除!' => '标签未找到或已删除!', '手机号码格式错误!' => '手机号码格式错误!', '账户不能为空!' => '账户不能为空!', '订单已过期,不可支付!' => '订单已过期,不可支付!', '订单已支付,请勿重复操作!' => '订单已支付,请勿重复操作!', '缺少订单号!' => '缺少订单号!', '网络错误,请刷新后重试!' => '网络错误,请刷新后重试!', '未找到评论!' => '未找到评论!', '已取消点赞!' => '已取消点赞!', '点赞成功!' => '点赞成功!', '栏目未绑定模型,无法喜欢!' => '栏目未绑定模型,无法喜欢!', '取消点赞' => '取消点赞', '点赞奖励' => '点赞奖励', '已被删除 ' => '已被删除 ', '栏目未绑定模型,无法收藏!' => '栏目未绑定模型,无法收藏!', '取消收藏' => '取消收藏', '收藏奖励' => '收藏奖励', '收藏成功!' => '收藏成功!', '已被删除' => '已被删除', '库存不足!' => '库存不足!', '该模块不允许发布!' => '该模块不允许发布!', '添加失败,存在敏感词' => '添加失败,存在敏感词', '分类错误!' => '分类错误!', '该分类不允许发布!' => '该分类不允许发布!', '您没有权限在该分类发布内容!' => '您没有权限在该分类发布内容!', '内容不能为空!' => '内容不能为空!', '库存不能为0!' => '库存不能为0!', '未修改内容,不能提交!' => '未修改内容,不能提交!', '发布失败,请重试!' => '发布失败,请重试!', '发布成功!' => '发布成功!', '未找到您要的文章!' => '未找到您要的文章!', '您已经关注了该用户!' => '您已经关注了该用户!', '您不能关注自己!' => '您不能关注自己!', '关注奖励' => '关注奖励', '关注成功!' => '关注成功!', '您没有关注该用户,无法操作!' => '您没有关注该用户,无法操作!', '取关成功!' => '取关成功!', '消息已被删除!' => '消息已被删除!', '用户未找到!' => '用户未找到!', '未分类 ' => '未分类 ', '设置成功' => '设置成功', '设置成功!' => '设置成功!', '记录不存在!' => '记录不存在!', '缺少栏目ID!' => '缺少栏目ID!', '系统未配置微信登录!' => '系统未配置微信登录!', '微信已绑定!' => '微信已绑定!', '您的微信已被绑定,不能再绑定!' => '您的微信已被绑定,不能再绑定!', '系统版号' => '系统版号', '版本号是系统自带,请勿改动' => '版本号是系统自带,请勿改动', '网站SEO名称' => '网站SEO名称', '控制在25个字、50个字节以内' => '控制在25个字、50个字节以内', '网站SEO关键词' => '网站SEO关键词', '5个左右,8汉字以内,用英文逗号隔开' => '5个左右,8汉字以内,用英文逗号隔开', '网站SEO描述' => '网站SEO描述', '控制在80个汉字,160个字符以内' => '控制在80个汉字,160个字符以内', '统计代码' => '统计代码', '将百度统计、cnzz等平台的流量统计JS代码放到这里' => '将百度统计、cnzz等平台的流量统计JS代码放到这里', '底部版权' => '底部版权', '如:© 2016 xxx版权' => '如:© 2016 xxx版权', '备案号' => '备案号', '如:京ICP备00000000号' => '如:京ICP备00000000号', '网站电话' => '网站电话', '网站联系电话' => '网站联系电话', '400电话' => '400电话', '网站QQ' => '网站QQ', '网站邮箱' => '网站邮箱', '公司地址' => '公司地址', 'PC网站模板' => 'PC网站模板', '将模板名称填写到此处' => '将模板名称填写到此处', 'WAP网站模板' => 'WAP网站模板', '开启了手机端,这个设置才会生效,否则调用电脑端模板' => '开启了手机端,这个设置才会生效,否则调用电脑端模板', '微信网站模板' => '微信网站模板', '开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板' => '开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板', '是否开启手机端' => '是否开启手机端', '如果不开启手机端,则默认调用电脑端模板' => '如果不开启手机端,则默认调用电脑端模板', '是否开启前台上传' => '是否开启前台上传', '关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。' => '关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。', '是否开启前台权限' => '是否开启前台权限', '开启后前台用户权限可以在后台控制' => '开启后前台用户权限可以在后台控制', '缓存时间' => '缓存时间', '单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。此设置与缓存完整页面,模板缓存有关。' => '单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。此设置与缓存完整页面,模板缓存有关。', '限制上传文件大小' => '限制上传文件大小', '0代表不限,单位kb' => '0代表不限,单位kb', '允许上传文件类型' => '允许上传文件类型', '请用|分割,如:pdf|jpg|png' => '请用|分割,如:pdf|jpg|png', '前台UEditor编辑器导航条配置' => '前台UEditor编辑器导航条配置', '允许前台搜索的表' => '允许前台搜索的表', '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product' => '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product', '上传图片压缩比例' => '上传图片压缩比例', '100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80' => '100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80', 'PNG是否压缩' => 'PNG是否压缩', 'PNG压缩后容易变成背景黑色,关闭后,不会压缩。' => 'PNG压缩后容易变成背景黑色,关闭后,不会压缩。', '邮件服务器' => '邮件服务器', 'smtp.163.com,smtp.qq.com' => 'smtp.163.com,smtp.qq.com', '邮件收发端口' => '邮件收发端口', '163、126邮件端口(465),QQ邮件端口(587)' => '163、126邮件端口(465),QQ邮件端口(587)', '收件人Email地址' => '收件人Email地址', '发件人Email地址' => '发件人Email地址', '指邮件服务器发件邮箱' => '指邮件服务器发件邮箱', '发件人Email秘钥' => '发件人Email秘钥', '这个秘钥不是登录密码' => '这个秘钥不是登录密码', '发件人昵称' => '发件人昵称', '发件邮箱会带一个昵称' => '发件邮箱会带一个昵称', '客户订单通知' => '客户订单通知', '购买商品的时候会发送的一条邮件信息' => '购买商品的时候会发送的一条邮件信息', '订单出货通知' => '订单出货通知', '发货的时候发送给客户的通知' => '发货的时候发送给客户的通知', '订单运费' => '订单运费', '购物下单时会加上这个运费' => '购物下单时会加上这个运费', '在线支付' => '在线支付', '0关闭支付,1自主平台支付' => '0关闭支付,1自主平台支付', '极致平台接口' => '极致平台接口', '极致平台商户' => '极致平台商户', '极致平台应用appid' => '极致平台应用appid', '极致平台应用秘钥' => '极致平台应用秘钥', '支付宝APPID' => '支付宝APPID', '账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID' => '账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID', '支付宝key' => '支付宝key', 'MD5密钥,安全检验码,由数字和字母组成的32位字符串' => 'MD5密钥,安全检验码,由数字和字母组成的32位字符串', '支付宝私钥' => '支付宝私钥', '支付宝公钥' => '支付宝公钥', '微信商户mchid' => '微信商户mchid', '支付相关' => '支付相关', '微信商户key' => '微信商户key', '微信公众号appid' => '微信公众号appid', '微信公众号appsecret' => '微信公众号appsecret', '微信apiclient_cert' => '微信apiclient_cert', '微信apiclient_key' => '微信apiclient_key', '公众号appid' => '公众号appid', '用户登录相关,如果跟支付的一样,那就再填写一遍' => '用户登录相关,如果跟支付的一样,那就再填写一遍', '公众号appsecret' => '公众号appsecret', '公众号token' => '公众号token', '公众号关注欢迎语' => '公众号关注欢迎语', '公众号关注时发送的第一句推送' => '公众号关注时发送的第一句推送', '网站LOGO' => '网站LOGO', '后台模板风格' => '后台模板风格', '内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。' => '内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。', '是否绑定多域名' => '是否绑定多域名', '开启绑定多域名后,需要到插件中配置' => '开启绑定多域名后,需要到插件中配置', '网站SEO网址' => '网站SEO网址', '一般不填,全局网址,最后不带/,如:http://www.xxx.com' => '一般不填,全局网址,最后不带/,如:http://www.xxx.com', '基本信息下扩展' => '基本信息下扩展', '新增字段是否显示在【基本信息】底部,默认在【扩展信息】下' => '新增字段是否显示在【基本信息】底部,默认在【扩展信息】下', '订单超时' => '订单超时', '按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制' => '按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制', '开启层级URL' => '开启层级URL', '默认关闭层级URL,开启后URL会按照父类层级展现' => '默认关闭层级URL,开启后URL会按照父类层级展现', '缓存完整页面' => '缓存完整页面', '前台完整页面缓存,结合缓存时间,可以提高访问速度' => '前台完整页面缓存,结合缓存时间,可以提高访问速度', '自动生成静态HTML' => '自动生成静态HTML', '前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面' => '前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面', 'PC静态文件目录' => 'PC静态文件目录', '电脑端静态HTML存放目录,默认根目录[ / ]' => '电脑端静态HTML存放目录,默认根目录[ / ]', 'WAP静态文件目录' => 'WAP静态文件目录', '手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱' => '手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱', '是否留言自动审核' => '是否留言自动审核', '开启后,留言自动审核(显示)' => '开启后,留言自动审核(显示)', '是否评论自动审核' => '是否评论自动审核', '开启后评论自动审核(显示)' => '开启后评论自动审核(显示)', '网站敏感词过滤' => '网站敏感词过滤', '将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容' => '将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容', '是否开启水印' => '是否开启水印', '开启水印需要上传水印图片' => '开启水印需要上传水印图片', '水印图片' => '水印图片', '水印图片在250px以内' => '水印图片在250px以内', '水印位置' => '水印位置', '参考键盘九宫格1-9' => '参考键盘九宫格1-9', '水印透明度' => '水印透明度', '透明度越大,越难看清楚水印' => '透明度越大,越难看清楚水印', '钱包兑换率' => '钱包兑换率', '站内钱包与RMB的兑换率,即1元=多少金币' => '站内钱包与RMB的兑换率,即1元=多少金币', '积分兑换率' => '积分兑换率', '站内积分与RMB的兑换率,即1元=多少积分' => '站内积分与RMB的兑换率,即1元=多少积分', '积分支付' => '积分支付', '开启积分支付后,商品可以用积分支付' => '开启积分支付后,商品可以用积分支付', '开启钱包支付后,商品可以用钱包支付' => '开启钱包支付后,商品可以用钱包支付', '开启微信支付后,商品可以用微信支付' => '开启微信支付后,商品可以用微信支付', '开启支付宝支付后,商品可以用支付宝支付' => '开启支付宝支付后,商品可以用支付宝支付', '每次登录奖励' => '每次登录奖励', '每天登录奖励积分数,最小为0,每天登录只奖励一次' => '每天登录奖励积分数,最小为0,每天登录只奖励一次', '开启登录奖励后,登录后就会获得积分奖励' => '开启登录奖励后,登录后就会获得积分奖励', '开启后,发布内容会奖励积分' => '开启后,发布内容会奖励积分', '每次发布奖励' => '每次发布奖励', '每次发布内容奖励积分数' => '每次发布内容奖励积分数', '每天发布最高奖励' => '每天发布最高奖励', '每天奖励不超过积分上限,设置0则无上限' => '每天奖励不超过积分上限,设置0则无上限', '开启后,发布内容被收藏会奖励积分' => '开启后,发布内容被收藏会奖励积分', '每次收藏奖励' => '每次收藏奖励', '每次发布内容被收藏奖励积分数' => '每次发布内容被收藏奖励积分数', '每天收藏最高奖励' => '每天收藏最高奖励', '开启后,发布内容被点赞会奖励积分' => '开启后,发布内容被点赞会奖励积分', '每次点赞奖励' => '每次点赞奖励', '每次发布内容被点赞奖励积分数' => '每次发布内容被点赞奖励积分数', '每天点赞最高奖励' => '每天点赞最高奖励', '开启后,发布内容被评论会奖励积分' => '开启后,发布内容被评论会奖励积分', '每次评论奖励' => '每次评论奖励', '每次发布内容被评论奖励积分数' => '每次发布内容被评论奖励积分数', '每天评论最高奖励' => '每天评论最高奖励', '开启后,用户被粉丝关注会奖励积分' => '开启后,用户被粉丝关注会奖励积分', '每次关注奖励' => '每次关注奖励', '每次被关注奖励积分数' => '每次被关注奖励积分数', '每天关注最高奖励' => '每天关注最高奖励', '每天关注奖励不超过积分上限,设置0则无上限' => '每天关注奖励不超过积分上限,设置0则无上限', '发送邮件' => '发送邮件', '是否开启邮件发送' => '是否开启邮件发送', '关闭网站' => '关闭网站', '关闭网站后,前台无法访问,后台可以进入' => '关闭网站后,前台无法访问,后台可以进入', '关站提示' => '关站提示', '后台文件存储路径' => '后台文件存储路径', '默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]' => '默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]', '前台文件存储路径' => '前台文件存储路径', '是否开启前台AJAX' => '是否开启前台AJAX', '开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据' => '开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据', '自动生成sitemap' => '自动生成sitemap', '开启后,前台访问每天会自动生成1次sitemap' => '开启后,前台访问每天会自动生成1次sitemap', '是否开启邀请奖励' => '是否开启邀请奖励', '开启邀请后则会奖励' => '开启邀请后则会奖励', '邀请奖励类型' => '邀请奖励类型', '邀请奖励数量' => '邀请奖励数量', '网站手机' => '网站手机', '站长微信' => '站长微信', '开启多图描述' => '开启多图描述', '开启后图集每张图可以添加描述,注意模板输出需要更改输出方式!(附件同理)' => '开启后图集每张图可以添加描述,注意模板输出需要更改输出方式!(附件同理)', '前台用户注册' => '前台用户注册', '关闭前台注册后,前台无法进入注册页面' => '关闭前台注册后,前台无法进入注册页面', '仅邀请码注册' => '仅邀请码注册', '开启后,必须通过邀请链接才能注册!' => '开启后,必须通过邀请链接才能注册!', '允许前台发布模块' => '允许前台发布模块', '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割' => '防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割', '前台搜索的字段' => '前台搜索的字段', '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割' => '可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割', '前台验证码' => '前台验证码', '关闭后,登录注册不需要验证码' => '关闭后,登录注册不需要验证码', '后台验证码' => '后台验证码', '关闭后,后台管理员登录不需要验证码' => '关闭后,后台管理员登录不需要验证码', 'TAG包含模型' => 'TAG包含模型', '在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product' => '在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product', '支付配置' => '支付配置', '前台多模块搜索的字段' => '前台多模块搜索的字段', '多个模块直接必须都有相同的字段,否则会报错' => '多个模块直接必须都有相同的字段,否则会报错', '多模块允许搜索的表' => '多模块允许搜索的表', '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product' => '防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product', '允许查询显示的字段' => '允许查询显示的字段', '多模块搜索允许查询显示的字段' => '多模块搜索允许查询显示的字段', '前台编辑器设置' => '前台编辑器设置', '前台的编辑器功能菜单设置' => '前台的编辑器功能菜单设置', 'PHP调试' => 'PHP调试', '测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。' => '测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。', '前台SESSION' => '前台SESSION', '关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以开启,使用会员支付等必须关闭' => '关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以开启,使用会员支付等必须关闭', '留言验证码' => '留言验证码', '开启后,前台留言需要填写验证码' => '开启后,前台留言需要填写验证码', '前台发布审核' => '前台发布审核', '开启后需要后台审核,关闭则不需要' => '开启后需要后台审核,关闭则不需要', '公共权限' => '公共权限', '前台网站' => '前台网站', '会员登录' => '会员登录', '会员评论' => '会员评论', '网站筛选' => '网站筛选', '会员下单' => '会员下单', '网站支付' => '网站支付', '极致支付' => '极致支付', '微信模块' => '微信模块', '验证码生成' => '验证码生成', '检查是否登录' => '检查是否登录', '多附件上传' => '多附件上传', '单附件上传' => '单附件上传', '二维码生成' => '二维码生成', '获取扩展信息' => '获取扩展信息', '链接错误提示' => '链接错误提示', '报错提示' => '报错提示', '网站内容' => '网站内容', '详情内容' => '详情内容', '网站搜索' => '网站搜索', '网站多模块搜索' => '网站多模块搜索', '开启网站缓存' => '开启网站缓存', '输出缓存' => '输出缓存', '个人中心首页' => '个人中心首页', '会员资料' => '会员资料', '订单记录' => '订单记录', '订单支付' => '订单支付', '删除订单' => '删除订单', '上传头像' => '上传头像', '删除评论' => '删除评论', '点赞文章' => '点赞文章', '点赞列表' => '点赞列表', '收藏文章' => '收藏文章', '收藏列表' => '收藏列表', '删除收藏' => '删除收藏', '购物车' => '购物车', '添加购物车' => '添加购物车', '删除购物车' => '删除购物车', '发布管理' => '发布管理', '会员发布' => '会员发布', '删除发布' => '删除发布', '会员上传附件' => '会员上传附件', '404提示' => '404提示', '关注用户' => '关注用户', '取消关注' => '取消关注', '粉丝列表' => '粉丝列表', '消息提醒' => '消息提醒', '查看消息' => '查看消息', '删除消息' => '删除消息', '公共主页' => '公共主页', '消息提醒设置' => '消息提醒设置', '获取栏目列表' => '获取栏目列表', '用户钱包' => '用户钱包', '交易详情' => '交易详情', '登录首页' => '登录首页', '注册页面' => '注册页面', '忘记密码' => '忘记密码', '未登录页面' => '未登录页面', '退出登录' => '退出登录', '发送留言' => '发送留言', '发表评论' => '发表评论', '筛选列表' => '筛选列表', '创建订单' => '创建订单', 'TAG标签列表' => 'TAG标签列表', '会员' => '会员', '订单' => '订单', '评论' => '评论', '留言' => '留言', '轮播图' => '轮播图', '友情链接' => '友情链接', 'TAG' => 'TAG', '单页' => '单页', '用户评价' => '用户评价', '添加会员' => '添加会员', '修改会员' => '修改会员', '删除会员' => '删除会员', '修改状态' => '修改状态', '内容管理' => '内容管理', '内容列表' => '内容列表', '添加内容' => '添加内容', '修改内容' => '修改内容', '删除内容' => '删除内容', '复制内容' => '复制内容', '修改评论' => '修改评论', '修改留言' => '修改留言', '删除留言' => '删除留言', '字段列表' => '字段列表', '删除字段' => '删除字段', '获取字段' => '获取字段', '基本功能' => '基本功能', '系统界面' => '系统界面', '数据库备份' => '数据库备份', '数据库还原' => '数据库还原', '数据库删除' => '数据库删除', '系统功能' => '系统功能', '栏目管理' => '栏目管理', '栏目列表' => '栏目列表', '新增栏目' => '新增栏目', '修改栏目' => '修改栏目', '删除栏目' => '删除栏目', '修改排序' => '修改排序', '栏目隐藏' => '栏目隐藏', '新增角色' => '新增角色', '修改角色' => '修改角色', '删除角色' => '删除角色', '角色状态' => '角色状态', '新增管理员' => '新增管理员', '修改管理员' => '修改管理员', '管理员状态' => '管理员状态', '删除管理员' => '删除管理员', '模型列表' => '模型列表', '删除模型' => '删除模型', '新增权限' => '新增权限', '修改权限' => '修改权限', '删除权限' => '删除权限', '桌面设置' => '桌面设置', '新增桌面' => '新增桌面', '修改桌面' => '修改桌面', '删除桌面' => '删除桌面', '图标库' => '图标库', '模块扩展' => '模块扩展', '删除轮播图' => '删除轮播图', '复制轮播图' => '复制轮播图', '批量删除轮播图' => '批量删除轮播图', '新增轮播图分类' => '新增轮播图分类', '修改轮播图分类' => '修改轮播图分类', '删除轮播图分类' => '删除轮播图分类', '新增友链' => '新增友链', '修改友链' => '修改友链', '复制友链' => '复制友链', '删除友链' => '删除友链', '批量删除友链' => '批量删除友链', '通用模块' => '通用模块', '更新cookie' => '更新cookie', '商品管理' => '商品管理', '商品列表' => '商品列表', '修改商品' => '修改商品', '删除商品' => '删除商品', '复制商品' => '复制商品', '登录日志' => '登录日志', '新增分组' => '新增分组', '修改分组' => '修改分组', '更改分组状态' => '更改分组状态', '删除分组' => '删除分组', '会员权限' => '会员权限', '修改分组排序' => '修改分组排序', '上传支付证书' => '上传支付证书', '更改状态' => '更改状态', '安装卸载' => '安装卸载', '删除图库图片' => '删除图库图片', '批量删除图库' => '批量删除图库', '微信公众号' => '微信公众号', '公众号菜单' => '公众号菜单', '公众号素材' => '公众号素材', '模板制作' => '模板制作', '获取首字母拼音' => '获取首字母拼音', '批量新增栏目' => '批量新增栏目', '自定义配置删除' => '自定义配置删除', 'TAG列表' => 'TAG列表', '新增TAG' => '新增TAG', '修改TAG' => '修改TAG', '复制TAG' => '复制TAG', '删除TAG' => '删除TAG', '批量删除TAG' => '批量删除TAG', '生成静态文件' => '生成静态文件', '更新栏目HTML' => '更新栏目HTML', '更新模块HTML' => '更新模块HTML', '批量修改推荐属性' => '批量修改推荐属性', '批量修改友链栏目' => '批量修改友链栏目', '批量修改TAG栏目' => '批量修改TAG栏目', '批量复制友链' => '批量复制友链', '批量复制TAG' => '批量复制TAG', '批量修改友链排序' => '批量修改友链排序', '批量修改TAG排序' => '批量修改TAG排序', '高级设置' => '高级设置', '邮箱订单' => '邮箱订单', '公众号配置' => '公众号配置', '批量审核友链' => '批量审核友链', '批量审核TAG' => '批量审核TAG', '手动充值' => '手动充值', '删除记录' => '删除记录', '批量删除记录' => '批量删除记录', '积分配置' => '积分配置', '插件更新' => '插件更新', '获取栏目模板' => '获取栏目模板', '友链分类' => '友链分类', '新增友链分类' => '新增友链分类', '修改友链分类' => '修改友链分类', '删除友链分类' => '删除友链分类', '导航设置' => '导航设置', '删除导航' => '删除导航', '碎片化' => '碎片化', '删除碎片' => '删除碎片', '预览SQL' => '预览SQL', '搜索配置' => '搜索配置', '修改字段属性' => '修改字段属性', '新增推荐属性' => '新增推荐属性', '删除推荐属性' => '删除推荐属性', '列表设置' => '列表设置', '获取列表字段' => '获取列表字段', '内链模块' => '内链模块', '内链列表' => '内链列表', '新增内链' => '新增内链', '删除内链' => '删除内链', '删除数据' => '删除数据', '模板更新' => '模板更新', '用户评价列表' => '用户评价列表', '新增用户评价' => '新增用户评价', '修改用户评价' => '修改用户评价', '复制用户评价' => '复制用户评价', '删除用户评价' => '删除用户评价', '批量删除用户评价' => '批量删除用户评价', '批量修改用户评价栏目' => '批量修改用户评价栏目', '批量复制用户评价' => '批量复制用户评价', '批量修改用户评价列表' => '批量修改用户评价列表', '批量审核用户评价' => '批量审核用户评价', '基本设置' => '基本设置', '邮件订单' => '邮件订单', '非超级管理员无法设置!' => '非超级管理员无法设置!', '你确定要还原吗?' => '你确定要还原吗?', ); ?> ================================================ FILE: app/home/plugins/.gitkeep ================================================ ================================================ FILE: app/home/template/.gitkeep ================================================ ================================================ FILE: backup/.gitkeep ================================================ ================================================ FILE: conf/Functions.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/02 // +---------------------------------------------------------------------- /***************** * 项目公共函数 * *****************/ include(APP_PATH.'conf/FunctionsExt.php'); // 获取系统配置 if(!function_exists('webConf')){ function webConf($str=null){ //v1.3 取消文件存储 //$web_config = include(APP_PATH.'Conf/webconf.php'); $webconfig = getCache('webconfig'); if(!$webconfig){ $wcf = M('sysconfig')->findAll(); $webconfig = array(); foreach($wcf as $k=>$v){ if($v['field']=='web_js' || $v['field']=='ueditor_config'){ $v['data'] = html_decode($v['data']); } $webconfig[$v['field']] = $v['data']; } setCache('webconfig',$webconfig); } if($str!=null){ if(!array_key_exists($str,$webconfig)){ return false; } return $webconfig[$str]; }else{ return $webconfig; } } } // 获取系统扩展配置--历史方法暂无作用 if(!function_exists('get_custom')) { function get_custom($str = null) { return webConf($str); } } // 获取前台模板 if(!function_exists('get_template')) { function get_template() { $hometpl = isMobile() ? (isWeixin() ? getCache('wxhometpl') : getCache('mobilehometpl')) : getCache('hometpl'); if ($hometpl) { return $hometpl; } $webconf = webConf(); $isgo = true; //检测是否安装插件 $res = M('plugins')->find(['filepath' => 'website', 'isopen' => 1]); if ($res && $res['config']) { $website = $_SERVER['HTTP_HOST']; $config = json_decode($res['config'], 1); $pc = $webconf['pc_template']; $wap = $webconf['wap_template']; $wechat = $webconf['weixin_template']; foreach ($config as $v) { if ($v['website'] == $website) { $isgo = false; $v['model'] = (int)$v['model']; switch ($v['model']) { case 0: $pc = $wap = $wechat = $v['tpl']; break; case 1: $pc = $v['tpl']; break; case 2: $wap = $v['tpl']; break; case 3: $wechat = $v['tpl']; break; } } } //当前端口检测 if ($webconf['iswap'] == 1 && isMobile()) { $template = $wap; //wap if (isWeixin()) { //wechat $template = $wechat; } } else { //pc $template = $pc; } if ($template == '') { //全局 $isgo = true;//直接跳转下面进行默认设置 } } if ($isgo) { if ($webconf['iswap'] == 1 && isMobile()) { if (isWeixin()) { $template = ($webconf['weixin_template'] != '') ? $webconf['weixin_template'] : $webconf['wap_template']; } else { $template = $webconf['wap_template']; } } else { $template = $webconf['pc_template']; } } if (isMobile()) { if (isWeixin()) { setCache('wxhometpl', $template); } else { setCache('mobilehometpl', $template); } } else { setCache('hometpl', $template); } return $template; } } // 发送http请求 if(!function_exists('curl_http')) { function curl_http($url, $data = null, $method = 'GET') { if (is_array($data)) { $data = http_build_query($data); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, false); if ($method != 'GET') { curl_setopt($ch, CURLOPT_POST, 1); } if ($data != null) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //结果是否显示出来,1不显示,0显示 //判断是否https if (strpos($url, 'https://') !== false) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'; curl_setopt($ch, CURLOPT_USERAGENT, $UserAgent); } $data = curl_exec($ch); curl_close($ch); if ($data === FALSE) { $data = "curl Error:" . curl_error($ch); } return $data; } } // 分页处理 if(!function_exists('get_all_page')) { function get_all_page($url, $start = 5, $end = 0, $match = '{$}') { $urls = array(); if ($end == 0) { for ($i = 1; $i <= $start; $i++) { $urls[] = str_ireplace($match, $i, $url); } } else { for ($i = $start; $i <= $end; $i++) { $urls[] = str_ireplace($match, $i, $url); } } return $urls; } } // 获取管理员信息 if(!function_exists('adminInfo')) { function adminInfo($id, $str = null) { $user = M('level')->find('id=' . $id); if ($str != null) { return $user[$str]; } return $user; } } // 检查是否有路由权限 if(!function_exists('checkAction')) { function checkAction($action) { if (!isset($_SESSION['admin'])) { Error('登录超时,请重新登录!'); } $action = ucfirst($action); $paction = $_SESSION['admin']['paction']; if ($_SESSION['admin']['isadmin'] != 1) { if (strpos($action, '/') !== false) { if (strpos($paction, ',' . $action . ',') !== false) { return true; } else { $d = explode('/', $action); if (strpos($paction, ',' . $d[0] . ',') !== false) { return true; } else { return false; } } } else { if (strpos($paction, ',' . $action . ',') !== false) { return true; } else { return false; } } } else { return true; } } } /** * 递归实现无限极分类 * @param $array 分类数据 * @param $pid 父ID * @param $level 分类级别 * @return $list 分好类的数组 直接遍历即可 $level可以用来遍历缩进 */ if(!function_exists('getTree')) { function getTree($array, $pid = 0, $level = 0) { //声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $list = []; if ($level == 0) { $list = []; } foreach ($array as $key => $value) { //判断是否有下级---存在多次处理的bug v1.3已解决 //$value['haschild'] = haschild($array,$value['id']); //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ($value['pid'] == $pid) { //父节点为根节点的节点,级别为0,也就是第一级 $value['level'] = $level; //把数组放到list中 $list[] = $value; //把这个节点从数组中移除,减少后续递归消耗 unset($array[$key]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 getTree($array, $value['id'], $level + 1); } } return $list; } } // 栏目是否有下级 if(!function_exists('haschild')) { function haschild($array, $pid) { $n = false; foreach ($array as $v) { if ($v['pid'] == $pid) { $n = true; break; } } return $n; } } // 栏目格式化树状结构 if(!function_exists('show_tree')) { function show_tree($array) { foreach ($array as $value) { echo str_repeat('--', $value['level']), $value['classname'] . '
    '; } } } // 子栏目处理 if(!function_exists('set_class_haschild')) { function set_class_haschild($classtype = null) { $newarray = [];//组建新栏目数组 foreach ($classtype as $k => $v) { $v['haschild'] = false;//默认所有都没有下级 $newarray[$v['id']] = $v; } foreach ($newarray as $k => $v) { if ($v['pid'] != 0) { //找到有上级的栏目,那么上级栏目就有下级了。。。。 $newarray[$v['pid']]['haschild'] = true; } } return $newarray; } } // 获取栏目树状结构 if(!function_exists('get_classtype_tree')) { function get_classtype_tree() { $classtypetree = getCache('classtypetree'); if (!$classtypetree) { $classtype = M('classtype')->findAll(['isclose' => 0], 'orders desc'); $classtype = set_class_haschild($classtype); $classtypetree = getTree($classtype); setCache('classtypetree', $classtypetree); } return $classtypetree; } } // 获取栏目数据 if(!function_exists('classTypeData')) { function classTypeData() { $res = getCache('classtype'); $cache_time = (int)webConf('cache_time'); if (!$res || !$cache_time) { $classtypedata = get_classtype_tree(); $d = array(); $www = webConf('domain') ? webConf('domain') : get_domain(); $htmlpath = webConf('pc_html'); $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath; foreach ($classtypedata as $k => $v) { $d[$v['id']] = $v; if ($v['gourl'] != '') { $d[$v['id']]['url'] = $v['gourl']; } else { $file_txt = File_TXT_HIDE ? '' : '.html'; if ($file_txt == '') { $file_txt = CLASS_HIDE_SLASH ? $file_txt : $file_txt . '/'; } $d[$v['id']]['url'] = $www . $htmlpath . '/' . $v['htmlurl'] . $file_txt; } } setCache('classtype', $d, $cache_time); return $d; } return $res; } } // 获取手机端栏目数据 if(!function_exists('classTypeDataMobile')) { function classTypeDataMobile() { $res = getCache('mobileclasstype'); $cache_time = (int)webConf('cache_time'); if (!$res || !$cache_time) { $classtypedata = get_classtype_tree(); $d = array(); $www = webConf('domain') ? webConf('domain') : get_domain(); $htmlpath = webConf('mobile_html'); $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath; foreach ($classtypedata as $k => $v) { $d[$v['id']] = $v; if ($v['gourl'] != '') { $d[$v['id']]['url'] = $v['gourl']; } else { $file_txt = File_TXT_HIDE ? '' : '.html'; if ($file_txt == '') { $file_txt = CLASS_HIDE_SLASH ? $file_txt : $file_txt . '/'; } $d[$v['id']]['url'] = $www . $htmlpath . '/' . $v['htmlurl'] . $file_txt; } } setCache('mobileclasstype', $d, $cache_time); return $d; } return $res; } } // 检查两个栏目id是否为子栏目 if(!function_exists('checkClass')) { function checkClass($pid, $tid){ $class = M('classtype')->find(array('id' => $pid)); if ($class['pid'] == $tid) { return true; } if ($class['pid'] == 0) { return false; } else { checkClass($class['pid'], $tid); } } } //获取栏目的所有下级 /* @param type 当前栏目数组 @param classtype 已被getTree格式化数组 @param code 获取内容类型 1输出所有数组 2输出直系子类id 3输出全系子类ids 4输出直系子类数组children 5输出全系子类数组childrens */ if(!function_exists('get_children')) { function get_children($type, $classtype = null, $code = 1) { if ($type == null || $classtype == null) { Error_msg('参数错误!'); } $children = array(); $childrens = array(); $alldata = array(); $go = false; $children_id = []; $children_ids[] = $type['id']; foreach ($classtype as $v) { if ($v['id'] == $type['id']) { $go = true; continue; } if ($v['level'] == $type['level']) { $go = false; continue; } //所有下级 if ($v['level'] >= $type['level'] && $go) { $childrens[] = $v; $children_ids[] = $v['id']; } //直系下级 if ($v['pid'] == $type['id']) { $children[] = $v; $children_id[] = $v['id']; } } //直系属性 $alldata['id'] = $children_id; $alldata['list'] = $children; //全系属性 $alldata['ids'] = $children_ids; $alldata['lists'] = $childrens; switch ($code) { case 1: return $alldata; break; case 2: return $children_id; break; case 3: return $children_ids; break; case 4: return $children; break; case 5: return $childrens; break; } } } // 获取一个条数据 if(!function_exists('get_info_table')) { function get_info_table($table, $where = null, $str = null) { $data = M($table)->find($where, null, $str); if ($str != null) { return $data[$str]; } return $data; } } // 获取多条数据 if(!function_exists('get_all_info_table')) { function get_all_info_table($table, $where = null, $order = null, $limit = null, $field = null) { $data = M($table)->findAll($where, $order, $field, $limit); return $data; } } //后台方法-获取表单提交的扩展字段的内容 /** @param data 表单提交的内容 @param molds 模块标识 @param isadmin是否后台 **/ if(!function_exists('get_fields_data')) { function get_fields_data($data, $molds, $isadmin = 1) { if ($isadmin) { $fields = M('fields')->findAll(['molds' => $molds, 'isadmin' => 1], 'orders desc,id asc'); } else { //前台需要判断是否前台显示 $fields = M('fields')->findAll(['molds' => $molds, 'isshow' => 1, 'ishome' => 1], 'orders desc,id asc'); } $newdata = []; foreach ($fields as $v) { if (array_key_exists($v['field'], $data)) { switch ($v['fieldtype']) { case 1: case 2: case 5: case 7: case 9: case 12: case 18: case 21: $data[$v['field']] = format_param($data[$v['field']], 1); break; case 11: $data[$v['field']] = strtotime(format_param($data[$v['field']], 1)); break; case 3: if ($isadmin) { $text = $data[$v['field']]; if(webConf('islocal')){ $text = remote_data_local($text, $data['tid'], $data['molds']); } $data[$v['field']] = format_param($text, 4); }else{ $text = $data[$v['field']]; if(webConf('islocal')) { $text = remote_data_local($text, $data['tid'], $data['molds']); } $data[$v['field']] = format_param($text, 4); } break; case 4: case 13: case 17: $data[$v['field']] = format_param($data[$v['field']]); break; case 14: $data[$v['field']] = format_param($data[$v['field']], 3); break; case 8: $r = implode(',', format_param($data[$v['field']], 2)); if ($r) { $r = ',' . $r . ','; } $data[$v['field']] = $r; break; case 16: case 20: if(is_array($data[$v['field']])){ $data[$v['field']] = $data[$v['field']] ? ',' . implode(',',format_param($data[$v['field']], 2)) . ',' : ''; }else{ $data[$v['field']] = $data[$v['field']] ? ',' . format_param($data[$v['field']], 1) . ',' : ''; } break; case 15: $r = implode('||', format_param($data[$v['field']], 2)); $data[$v['field']] = $r; break; case 19: $data[$v['field']] = format_param($data[$v['field']], 1); $data[$v['field']] = $data[$v['field']] ? ',' . $data[$v['field']] . ',' : ''; break; } $newdata[$v['field']] = $data[$v['field']]; } else if (array_key_exists($v['field'] . '_urls', $data)) { switch ($v['fieldtype']) { case 6: case 10: if (array_key_exists($v['field'] . '_des', $data)) { $pics = format_param($data[$v['field'] . '_urls'], 2); $pics_des = format_param($data[$v['field'] . '_des'], 2); foreach ($pics as $k => $vv) { if ($pics_des[$k]) { $pics[$k] = $vv . '|' . $pics_des[$k]; } } $data[$v['field']] = implode('||', $pics); } else { $data[$v['field']] = implode('||', format_param($data[$v['field'] . '_urls'], 2)); } break; } $newdata[$v['field']] = $data[$v['field']]; } else { $data[$v['field']] = ''; } if (isset($data['id'])) { $data['id'] = format_param($data['id']); } } if ($isadmin) { return $data; } else { //前台只返回允许的字段 return $newdata; } } } // 新增字段-后台列表搜索获取 if(!function_exists('molds_search')) { function molds_search($molds = null, $data = null) { if ($molds == null) { Error('缺少模块标识!'); } $lists = M('Fields')->findAll(array('molds' => $molds, 'issearch' => 1), 'orders desc,id asc'); $fields_search = ''; $fields_search_check = array(); foreach ($lists as $v) { $data[$v['field']] = array_key_exists($v['field'], $data) ? $data[$v['field']] : ''; switch ($v['fieldtype']) { case 1: case 2: case 3: case 5: case 6: case 9: case 10: case 14: case 15: $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%" . format_param($data[$v['field']], 1) . "%'"; } } break; case 4: $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " = '" . format_param($data[$v['field']], 1) . "'"; } } break; case 7: case 12: $fields_search .= '
    '; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " = '" . format_param($data[$v['field']], 1) . "'"; } } break; case 8: $fields_search .= '
    '; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%," . format_param($data[$v['field']], 1) . ",%'"; } } break; case 11: $laydate = ($data[$v['field']] == '' || $data[$v['field']] == 0) ? '' : date('Y-m-d', strtotime($data[$v['field']])); $laytime = ($data[$v['field']] == '' || $data[$v['field']] == 0) ? 0 : strtotime($laydate); $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']]) != 0 && format_param($data[$v['field']])!='') { $fields_search_check[] = " (" . $v['field'] . " >= " . $laytime . " and " . $v['field'] . " < " . ($laytime + 86400) . ") "; } } break; case 13: $body = explode(',', $v['body']); $moldsdata = M('molds')->find(['id' => $body[0]]); $num = M($moldsdata['biaoshi'])->getCount(); if ($num > 500) { $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%" . format_param($data[$v['field']], 1) . "%'"; } } } else { $datalist = M($moldsdata['biaoshi'])->findAll(null, 'id desc', 'id,' . $body[1]); $fields_search .= '
    '; } if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " =" . format_param($data[$v['field']]) . " "; } } break; case 16: $body = explode(',', $v['body']); $moldsdata = M('molds')->find(['id' => $body[0]]); $num = M($moldsdata['biaoshi'])->getCount(); if ($num > 500) { $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%," . format_param($data[$v['field']], 1) . ",%'"; } } } else { $datalist = M($moldsdata['biaoshi'])->findAll(['isshow' => 1], 'id desc', 'id,' . $body[1]); $fields_search .= '
    '; } if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%," . format_param($data[$v['field']]) . ",%' "; } } break; case 17: $classtypedata = getclasstypedata(classTypeData()); $classtypetree = get_classtype_tree(); $fields_search .= '
    '; if (array_key_exists($v['field'], $data)) { if ($d) { $fields_search_check[] = ' tid in(' . implode(",", $classtypedata[$d]["children"]["ids"]) . ') '; } } break; case 18: break; case 19: $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%," . format_param($data[$v['field']], 1) . "%,'"; } } break; case 20://栏目绑定多选 $body = explode(',', $v['body']); $tid = (int)$body[0]; $classtypedata = classTypeData(); $molds = $classtypedata[$tid]['molds']; $moldsdata = M('molds')->find(['biaoshi' => $molds]); $num = M($molds)->getCount(); if ($num > 500) { $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%," . format_param($data[$v['field']], 1) . ",%'"; } } } else { $tids = array_column($classtypedata[$tid]['children']['lists'], 'id'); $tids[] = $tid; $sql = " tid in(" . implode(',', $tids) . ") and isshow=1 "; $datalist = M($molds)->findAll($sql, 'id desc', 'id,' . $body[1]); $fields_search .= '
    '; } if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%," . format_param($data[$v['field']]) . ",%' "; } } break; case 21://栏目绑定单选 $body = explode(',', $v['body']); $tid = (int)$body[0]; $classtypedata = classTypeData(); $molds = $classtypedata[$tid]['molds']; $num = M($molds)->getCount(); $moldsdata = M('molds')->find(['biaoshi' => $molds]); if ($num > 500) { $fields_search .= ''; if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " like '%" . format_param($data[$v['field']], 1) . "%'"; } } } else { $tids = array_column($classtypedata[$tid]['children']['lists'], 'id'); $tids[] = $tid; $sql = " tid in(" . implode(',', $tids) . ") and isshow=1 "; $datalist = M($molds)->findAll($sql, 'id desc', 'id,' . $body[1]); $fields_search .= '
    '; } if (array_key_exists($v['field'], $data)) { if (format_param($data[$v['field']], 1) != '') { $fields_search_check[] = " " . $v['field'] . " =" . format_param($data[$v['field']]) . " "; } } break; } } if (count($fields_search_check) > 0) { $fields_search_check = implode(' and ', $fields_search_check); } else { $fields_search_check = ''; } return array('fields_search' => $fields_search, 'fields_search_check' => $fields_search_check); } } if(!function_exists('get_classtype')){ function get_classtype(){ $classtypedata = getCache('jzclasstypedata'); if(!$classtypedata){ $classtype = M('classtype')->findAll(); $classtypedata = []; foreach ($classtype as $v){ $classtypedata[$v['id']] = $v; } setCache('jzclasstypedata',$classtypedata); } return $classtypedata; } } // 后台格式化类型显示 if(!function_exists('format_fields')) { function format_fields($fields = null, $data = null) { $classtypedata = get_classtype(); if ($fields == null) { $list = array( 'string_10' => '截取10个字', 'string_15' => '截取15个字', 'date_1' => '日期(Y-m-d)', 'date_2' => '日期(Y-m-d H:i:s)', ); return $list; } else { switch ($fields['format']) { case 'string_10': return newstr($data, 10); break; case 'string_15': return newstr($data, 15); break; case 'date_1': return "\t" . date('Y-m-d', $data) . "\t"; break; case 'date_2': return "\t" . date('Y-m-d H:i:s', $data) . "\t"; break; default: if ($fields['fieldtype'] == 7 || $fields['fieldtype'] == 12) { $r = explode(',', $fields['body']); foreach ($r as $v) { $d = explode('=', $v); if ($d[1] == $data) { return $d[0]; exit; } } } else if ($fields['fieldtype'] == 8) { $r = explode(',', $fields['body']); $rr = array(); foreach ($r as $v) { $d = explode('=', $v); if (strpos($data, ',' . $d[1] . ',') !== false) { $rr[] = $d[0]; } } return implode(',', $rr); } else if ($fields['fieldtype'] == 5) { $vdata = $data != '' ? '' : ''; return $vdata; } else if ($fields['fieldtype'] == 6) { //图集 if ($data != '') { $vdata = explode('||', $data); $res = ''; foreach ($data as $s) { if ($s != '') { $res .= ''; } } return $res; } else { return ''; } } else if ($fields['fieldtype'] == 9) { $vdata = $data != '' ? '[查看]' : ''; return $vdata; } else if ($fields['fieldtype'] == 10) { if ($data != '') { $vdata = explode('||', $data); $res = ''; foreach ($data as $s) { if ($s != '') { $res .= '[查看]'; } } return $res; } else { return ''; } } else if ($fields['fieldtype'] == 11) { $vdata = $data == 0 ? '-' : "\t" . date('Y-m-d H:i:s', $data) . "\t"; return $vdata; } else if ($fields['fieldtype'] == 13) { $body = explode(',', $fields['body']); $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi'); $res = M($biaoshi)->getField(['id' => $data], $body[1]); if (!$res) { return '[ 空 ]'; } return $res; } else if ($fields['fieldtype'] == 16) { //多选关联 if (trim($data, ',')) { $res = trim($data, ','); $body = explode(',', $fields['body']); $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi'); $all = M($biaoshi)->findAll('id in(' . $res . ')', null, $body[1]); $ss = '[' . implode(',', array_column($all, $body[1])) . ']'; return $ss; } } else if ($fields['fieldtype'] == 17) { $ids = explode(',', $data); $name = []; foreach ($ids as $v) { $name[] = $classtypedata[$v]['classname']; } return implode(',', $name); } else if ($fields['fieldtype'] == 18) { return $data == 0 ? '[未绑定栏目]' : $classtypedata[$data]['classname']; } else if ($fields['fieldtype'] == 19) { if ($data) { return trim($data, ','); } } else if ($fields['fieldtype'] == 21) { $body = explode(',', $fields['body']); $tid = (int)$body[0]; $molds = $classtypedata[$tid]['molds']; $res = M($molds)->getField(['id' => $data], $body[1]); if (!$res) { return '[ 空 ]'; } return $res; } else if ($fields['fieldtype'] == 20) { //栏目关联多选 if (trim($data, ',')) { $res = trim($data, ','); $body = explode(',', $fields['body']); $tid = (int)$body[0]; $molds = $classtypedata[$tid]['molds']; $tids = array_column($classtypedata[$tid]['children']['lists'], 'id'); $tids[] = $tid; $all = M($molds)->findAll('id in(' . $res . ') and tid in(' . implode(',', $tids) . ')', null, $body[1]); $ss = '[' . implode(',', array_column($all, $body[1])) . ']'; return $ss; } } return $data; break; } } } } // 图形验证码--旧版本使用-无作用 if(!function_exists('frvercode')) { function frvercode($num = 4, $str = 'frcode') { //创建随机码 $_nmsg = ''; for ($i = 0; $i < $num; $i++) { $_nmsg .= dechex(mt_rand(0, 15)); } //保存在session里 $_SESSION[$str] = md5(md5($_nmsg)); //长和高 $_width = 75; $_height = 25; //创建图像 $_img = imagecreatetruecolor($_width, $_height); $_white = imagecolorallocate($_img, 255, 255, 255); imagefill($_img, 0, 0, $_white); /* //创建黑色边框 $_black = imagecolorallocate($_img, 100, 100, 100); imagerectangle($_img, 0, 0, $_width-1, $_height-1, $_black); //随机划线条 for ($i=0;$i<6;$i++) { $_rnd_color= imagecolorallocate($_img,mt_rand(0,255),mt_rand(0,255) ,mt_rand(0,255)); imageline($_img,mt_rand(0,75),mt_rand(0,25),mt_rand(0,75),mt_rand(0,25) ,$_rnd_color); } //随机打雪花 for ($i=1;$i<100;$i++) { imagestring($_img,1,mt_rand(1,$_width),mt_rand(1,$_height),"*", imagecolorallocate($_img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255))); } */ //输出验证码 for ($i = 0; $i < strlen($_nmsg); $i++) { imagestring($_img, mt_rand(3, 5), $i * $_width / $num + mt_rand(1, 10), mt_rand(1, $_height / 2), $_nmsg[$i], imagecolorallocate($_img, mt_rand(0, 150), mt_rand(0, 100), mt_rand(0, 150))); } //输出图像 //ob_clean(); header('Content-Type:image/png'); imagepng($_img); //销毁 imagedestroy($_img); } } // 判断是否包含 if(!function_exists('aCheckSubstrs')) { function aCheckSubstrs($substrs, $text) { foreach ($substrs as $substr) if (false !== strpos($text, $substr)) { return true; } return false; } } // 判断是否为手机端 if(!function_exists('isMobile')) { function isMobile() { $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $useragent_commentsblock = preg_match('|\(.*?\)|', $useragent, $matches) > 0 ? $matches[0] : ''; $mobile_os_list = array('Google Wireless Transcoder', 'Windows CE', 'WindowsCE', 'Symbian', 'Android', 'armv6l', 'armv5', 'Mobile', 'CentOS', 'mowser', 'AvantGo', 'Opera Mobi', 'J2ME/MIDP', 'Smartphone', 'Go.Web', 'Palm', 'iPAQ'); $mobile_token_list = array('Profile/MIDP', 'Configuration/CLDC-', '160×160', '176×220', '240×240', '240×320', '320×240', 'UP.Browser', 'UP.Link', 'SymbianOS', 'PalmOS', 'PocketPC', 'SonyEricsson', 'Nokia', 'BlackBerry', 'Vodafone', 'BenQ', 'Novarra-Vision', 'Iris', 'NetFront', 'HTC_', 'Xda_', 'SAMSUNG-SGH', 'Wapaka', 'DoCoMo', 'iPhone', 'iPod', 'iPad'); $found_mobile = aCheckSubstrs($mobile_os_list, $useragent_commentsblock) || aCheckSubstrs($mobile_token_list, $useragent); if ($found_mobile) { return true; } else { return false; } } } // 判断是否微信端 if(!function_exists('isWeixin')) { function isWeixin() { if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) { return true; } return false; } } // 获取前台链接 if(!function_exists('gourl')) { function gourl($id, $htmlurl = null, $molds = 'article') { $www = webConf('domain') ? webConf('domain') : get_domain(); if (is_array($id)) { /** * ownurl target id **/ $value = $id; if ($value['target']) { return $value['target']; } else { if ($value['ownurl']) { return $www . '/' . $value['ownurl']; } } $id = $value['id']; $htmlurl = $value['htmlurl']; } if (!$id) { Error_msg('缺少ID!'); } $htmlpath = (isMobile() && webConf('iswap') == 1) ? webConf('mobile_html') : webConf('pc_html'); $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath; if ($htmlurl != null) { return $www . $htmlpath . '/' . $htmlurl . '/' . $id . '.html'; } $tid = M($molds)->getField(array('id' => $id), 'tid'); $htmlurl = M('classtype')->getField(array('id' => $tid), 'htmlurl'); return $www . $htmlpath . '/' . $htmlurl . '/' . $id . '.html'; } } // 获取前台链接--同上 if(!function_exists('all_url')) { function all_url($id, $molds = 'article', $htmlurl = null){ $www = webConf('domain') ? webConf('domain') : get_domain(); if (is_array($id)) { /** * ownurl target id **/ $value = $id; if ($value['target']) { return $value['target']; } else { if ($value['ownurl']) { return $www . '/' . $value['ownurl']; } } $id = $value['id']; } if (!$id) { Error_msg('缺少ID!'); } $htmlpath = isMobile() && webConf('isopen') ? webConf('mobile_html') : webConf('pc_html'); $htmlpath = ($htmlpath == '' || $htmlpath == '/') ? '' : '/' . $htmlpath; if ($htmlurl != null) { $file_txt = File_TXT_HIDE ? '' : '.html'; return $www . $htmlpath . '/' . $htmlurl . '/' . $id . $file_txt; } $tid = M($molds)->getField(array('id' => $id), 'tid'); $htmlurl = M('classtype')->getField(array('id' => $tid), 'htmlurl'); $file_txt = File_TXT_HIDE ? '' : '.html'; return $www . $htmlpath . '/' . $htmlurl . '/' . $id . $file_txt; } } // 自定义递增函数 if(!function_exists('incrData')) { function incrData($table = null, $id = 0, $field = 'hits', $num = 1) { if (!format_param($table, 1)) { Error_msg($table . '表不存在!'); } if (!format_param($id)) { Error_msg('缺少ID!'); } if (!format_param($field, 1)) { Error_msg('递增字段缺少!'); } if (!format_param($num)) { Error_msg('递增数据格式错误!'); } $r = M($table)->goInc(array('id' => $id), $field, $num); if (!$r) { return '递增失败!'; } return M($table)->getField(array('id' => $id), $field); } } //自定义字段单项/多项选择获取 if(!function_exists('get_key_field_select')) { function get_key_field_select($key = 0, $molds = null, $field = null) { if ($molds == null || $field == null) { echo '参数molds或field缺少'; exit; } $res = M('Fields')->find(array('molds' => $molds, 'field' => $field), null, 'body,fieldtype'); if ($res) { $value = explode(',', $res['body']); if ($res['fieldtype'] == 7 || $res['fieldtype'] == 12) { //单选 foreach ($value as $v) { $d = explode('=', $v); if ($d[1] == $key) { return $d[0]; } } return false; } else if ($res['fieldtype'] == 13) { $biaoshi = M('molds')->getField(['id' => $value[0]], 'biaoshi'); $data = M($biaoshi)->getField(['id' => $key], $value[1]); return $data; } else if ($res['fieldtype'] == 20) { $classtypedata = classTypeData(); $tid = (int)$value[0]; $biaoshi = $classtypedata[$tid]['molds']; $tids = array_column($classtypedata[$tid]['children']['lists'], 'id'); $tids[] = $tid; $sql = "id in(" . implode(',', trim($key, ',')) . ") and tid in(" . implode(',', $tids) . ") "; $data = M($biaoshi)->findAll($sql, null, $value[1]); return array_column($data, $value[1]); } else if ($res['fieldtype'] == 21) { $classtypedata = classTypeData(); $tid = (int)$value[0]; $biaoshi = $classtypedata[$tid]['molds']; $data = M($biaoshi)->getField(['id' => $key], $value[1]); return $data; } else { $s = array(); foreach ($value as $v) { $d = explode('=', $v); if (strpos($key, ',' . $d[1] . ',') !== false) { $s[] = $d[0]; } } return $s; } } else { return '没有查询到该字段内容!'; } } } //根据模型[$molds]、字段[$field]获取并输出内容选项 if(!function_exists('get_field_select')) { function get_field_select($molds = null, $field = null) { if ($molds == null || $field == null) { echo '参数molds或field缺少'; exit; } $res = M('Fields')->find(array('molds' => $molds, 'field' => $field), null, 'body,fieldtype'); if ($res) { $value = explode(',', $res['body']); $s = array(); foreach ($value as $v) { $s[] = explode('=', $v); } return $s; } else { return '没有查询到该字段内容!'; } } } //获取文件大小 if(!function_exists('get_file_byte')) { function get_file_byte($file) { $byte = filesize($file); $KB = 1024; $MB = 1024 * $KB; $GB = 1024 * $MB; $TB = 1024 * $GB; if ($byte < $KB) { return $byte . "B"; } elseif ($byte < $MB) { return round($byte / $KB, 2) . "KB"; } elseif ($byte < $GB) { return round($byte / $MB, 2) . "MB"; } elseif ($byte < $TB) { return round($byte / $GB, 2) . "GB"; } else { return round($byte / $TB, 2) . "TB"; } } } //获取文章评论 if(!function_exists('show_comment')) { function show_comment($tid = 0, $id = 0, $str = null) { if ($tid == 0 || $id == 0) { return false; } $lists = M('comment')->findAll(['tid' => $tid, 'aid' => $id, 'isshow' => 1], 'addtime asc'); $star_num = 0; $count = 0; if ($lists) { foreach ($lists as $k => $v) { $star_num += $v['likes']; $lists[$k]['userinfo'] = M('member')->find(['id' => $v['userid']]); if ($v['likes'] > 0) { $count += 1; } } $lists = set_class_haschild($lists); $lists = getTree($lists); } if ($count != 0) { $average = round($star_num / $count, 1); } else { $average = 0; } $res = array('data' => $lists, 'star' => $star_num, 'count' => $count, 'average' => $average); if ($str != null) { return $res[$str]; } return $res; } } //获取指定评论用户姓名 if(!function_exists('get_comment_user')) { function get_comment_user($id) { $userid = M('comment')->getField(['id' => $id], 'userid'); if (!$userid) { return ''; } else { return M('member')->getField(['id' => $userid], 'username'); } } } //计算评论数量---或者直接comment_num显示 if(!function_exists('get_comment_num')) { function get_comment_num($tid, $id = 0) { if ($id == 0) { return '缺少ID!'; } $count = M('comment')->getCount(['aid' => $id, 'tid' => $tid, 'isshow' => 1]); return $count; } } //处理数组拼接--Screen筛选功能有使用 if(!function_exists('change_parse_url')) { function change_parse_url($arr, $str) { if (count($arr) == 0) { return ''; } unset($arr[$str]); if (count($arr) == 0) { return ''; } $url = str_replace('=', '-', http_build_query($arr, false, '-')); return '-' . $url; } } //获取扩展字段内容输出 if(!function_exists('get_fields_show')) { function get_fields_show($tid, $molds) { $sql = array(); if ($tid != 0) { $sql[] = " tids like '%," . $tid . ",%' "; } $sql[] = " molds = '" . $molds . "' and isshow=1 "; $sql = implode(' and ', $sql); $fields_list = M('Fields')->findAll($sql, 'orders desc,id asc'); return $fields_list; } } //输出指定字段的标题和内容 if(!function_exists('jz_show_fields')) { function jz_show_fields($data = array(), $fields = null) { $sql = array(); if ($data['tid'] != 0) { $sql[] = " tids like '%," . $data['tid'] . ",%' "; } if ($fields) { $arr = explode(',', $fields); $r = []; foreach ($arr as $v) { $r[] = " field='" . $v . "' "; } $sql[] = " (" . implode(' or ', $r) . ") "; } $sql[] = " molds = '" . $data['molds'] . "' and isshow=1 "; $sql = implode(' and ', $sql); $fields_list = M('Fields')->findAll($sql, 'orders desc,id asc'); $new = []; foreach ($fields_list as $k => $v) { $new[$k]['title'] = $v['fieldname']; $new[$k]['field'] = $v['field']; switch ($v['fieldtype']) { case 1: case 2: case 3: case 4: case 5: case 9: case 14: $new[$k]['data'] = $data[$v['field']]; break; case 6: case 10: case 15: $new[$k]['data'] = explode('||', $data[$v['field']]); break; case 7: case 12: $value = explode(',', $v['body']); foreach ($value as $vv) { $d = explode('=', $vv); if ($d[1] == $data[$v['field']]) { $new[$k]['data'] = $d[0]; } } break; case 8: $r = []; $value = explode(',', $v['body']); foreach ($value as $vv) { $d = explode('=', $vv); if (stripos($data[$v['field']], ',' . $d[1] . ',') !== false) { $r[] = $d[0]; } } $new[$k]['data'] = implode(',', $r); break; case 11: $new[$k]['data'] = date('Y-m-d H:i:s', $data[$v['field']]); break; case 13: $body = explode(',', $v['body']); $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi'); $new[$k]['data'] = M($biaoshi)->getField(['id' => $data[$v['field']]], $body[1]); break; case 16: $body = explode(',', $v['body']); $biaoshi = M('molds')->getField(['id' => $body[0]], 'biaoshi'); $s = trim($data[$v['field']], ','); $datalist = M($biaoshi)->findAll('id in(' . $s . ')', null, $body[1]); $r = []; foreach ($datalist as $vv) { $r[] = $vv[$body[1]]; } $new[$k]['data'] = implode(',', $r); break; case 17: $classtypedata = classTypeData(); $new[$k]['data'] = $classtypedata[$data[$v['field']]]['classname']; break; case 18: $s = trim($data[$v['field']], ','); $arr = explode(',', $s); $r = []; $classtypedata = classTypeData(); foreach ($arr as $vv) { $r[] = $classtypedata[$vv]['classname']; } $new[$k]['data'] = implode(',', $r); break; case 19: $new[$k]['data'] = trim($data[$v['field']], ','); break; case 20://绑定栏目多选 $body = explode(',', $v['body']); $classtypedata = classTypeData(); $tid = (int)$body[0]; $molds = $classtypedata[$tid]['molds']; $s = trim($data[$v['field']], ','); $tids = array_column($classtypedata[$tid]['children']['lists'], 'id'); $tids[] = $tid; $datalist = M($molds)->findAll('id in(' . $s . ') and tid in(' . implode(',', $tids) . ')', null, $body[1]); $new[$k]['data'] = implode(',', array_column($datalist, $body[1])); break; case 21://绑定栏目单选 $body = explode(',', $v['body']); $classtypedata = classTypeData(); $tid = (int)$body[0]; $molds = $classtypedata[$tid]['molds']; $new[$k]['data'] = M($molds)->getField(['id' => $data[$v['field']]], $body[1]); break; default: $new[$k]['data'] = $data[$v['field']]; break; } $new[$k]['type'] = $v['fieldtype']; } return $new; } } //发送邮件处理 if(!function_exists('send_mail')) { function send_mail($send_mail, $password, $send_name, $to_mail, $title, $body, $email_ext = '') { require_once(APP_PATH . 'frphp/extend/PHPMailer/PHPMailerAutoload.php'); require_once(APP_PATH . 'frphp/extend/PHPMailer/class.phpmailer.php'); require_once(APP_PATH . "frphp/extend/PHPMailer/class.smtp.php"); $mail = new PHPMailer(); $host = webConf('email_server'); $port = (int)webConf('email_port'); if (!$host || !$port) { exit('邮件服务器未配置完成'); } if (strpos($host, 'qq') !== false) { $mail->isSMTP(); $mail->CharSet = "UTF-8"; $mail->Host = $host; $mail->SMTPAuth = true; $mail->Username = $send_mail; $mail->Password = $password; $mail->SMTPSecure = 'tls'; $mail->Port = $port; $mail->SetFrom($send_mail, $send_name); $address = $to_mail; if (is_array($email_ext)) { foreach ($email_ext as $v) { $mail->AddAddress($v, $send_name); } } else if ($email_ext != '') { $mail->AddAddress($email_ext, $send_name); } $mail->AddAddress($address, $send_name); $mail->isHTML(true); $mail->Subject = $title; $mail->Body = $body; } else { $mail->IsSMTP(); // telling the class to use SMTP $mail->SMTPDebug = 0; // enables SMTP debug information (for testing) $mail->SMTPAuth = true; // enable SMTP authentication $mail->SMTPSecure = "ssl"; // sets the prefix to the servier //$mail->SMTPSecure = false; // sets the prefix to the servier $mail->Host = $host; // sets GMAIL as the SMTP server $mail->Port = $port; // set the SMTP port for the GMAIL server $mail->Username = $send_mail; // GMAIL username $mail->Password = $password; // GMAIL password $mail->SetFrom($send_mail, $send_name); //$mail->AddReplyTo("xxx@xxx.com","First Last"); $mail->Subject = $title; $mail->AltBody = $title; // optional, comment out and test $mail->MsgHTML($body); $mail->CharSet = "utf-8"; // 这里指定字符集! $address = $to_mail; if (is_array($email_ext)) { foreach ($email_ext as $v) { $mail->AddAddress($v, $send_name); } } else if ($email_ext != '') { $email_ext = explode(',', $email_ext); foreach ($email_ext as $v) { $mail->AddAddress($v, $send_name); } } $mail->AddAddress($address, $send_name); } if (!$mail->Send()) { // echo "Mailer Error: " . $mail->ErrorInfo; return false; } else { //echo "Message sent!"; return true; } } } //检测是否收藏 if(!function_exists('checkCollect')) { function checkCollect($tid = 0, $id = 0) { if ($tid && $id && isset($_SESSION['member'])) { $isok = M('shouchang')->getCount(['tid' => $tid, 'aid' => $id, 'userid' => $_SESSION['member']['id']]); return $isok; } else { return false; } } } //检测是否点赞 if(!function_exists('checkLikes')) { function checkLikes($tid = 0, $id = 0) { if (isset($_SESSION['member']) && $_SESSION['member']['id']) { if ($tid && $id) { $isok = M('likes')->getCount(['tid' => $tid, 'aid' => $id, 'userid' => $_SESSION['member']['id']]); return $isok; } else { return false; } } else { if ($tid && $id && isset($_SESSION['likes'])) { if (in_array($tid . '-' . $id, $_SESSION['likes'])) { return true; } else { return false; } } else { return false; } } } } //检查多少未读评论 if(!function_exists('has_no_read_comment')) { function has_no_read_comment() { if (!isset($_SESSION['member'])) { return 0; } $sql = 'userid=' . $_SESSION['member']['id'] . " and isshow=1 and (type = 'comment' or type = 'reply') and isread=0 "; $count = M('task')->getCount($sql); return $count; } } //检查多少未读消息 if(!function_exists('has_no_read_msg')) { function has_no_read_msg() { if (!isset($_SESSION['member'])) { return 0; } //增对个人用户是否关闭提醒 $sql = 'userid=' . $_SESSION['member']['id'] . " and isshow=1 and isread=0 "; if (!$_SESSION['member']['ismsg']) { $sql .= " and type = '0' ";//只接收交易提醒 } if (!$_SESSION['member']['iscomment']) { $sql .= " and type != 'comment' and type != 'reply' "; } if (!$_SESSION['member']['iscollect']) { $sql .= " and type != 'collect' "; } if (!$_SESSION['member']['islikes']) { $sql .= " and type != 'likes' "; } if (!$_SESSION['member']['isat']) { $sql .= " and type != 'at' "; } if (!$_SESSION['member']['isrechange']) { $sql .= " and type != 'rechange' "; } $count = M('task')->getCount($sql); return $count; } } //数据库html反转义 if(!function_exists('html_decode')) { function html_decode($data = null) { if (!$data) return ''; $data = str_replace(''', "'", htmlspecialchars_decode($data)); return $data; } } //字符串替换 if(!function_exists('str_replace_limit')) { function str_replace_limit($search, $replace, $subject, $limit = -1) { if (is_array($search)) { foreach ($search as $k => $v) { $search[$k] = '`' . preg_quote($search[$k], '`') . '`'; } } else { $search = '`' . preg_quote($search, '`') . '`'; } return preg_replace($search, $replace, $subject, $limit); } } //人性化时间显示 if(!function_exists('formatTime')) { function formatTime($sTime, $formt = 'Y-m-d') { //sTime=源时间,cTime=当前时间,dTime=时间差 $cTime = time(); $dTime = $cTime - $sTime; $dDay = intval($dTime / 86400); $dYear = intval(date('Y', $cTime)) - intval(date('Y', $sTime)); //n秒前,n分钟前,n小时前,日期 if ($dTime < 60) { if ($dTime < 10) { if ($dTime < 0) { return date($formt, $sTime); } else { return '刚刚'; } } else { return intval(floor($dTime / 10) * 10) . '秒前'; } } else if ($dTime < 3600) { return intval($dTime / 60) . '分钟前'; } else if ($dTime >= 3600 && $dDay == 0) { return intval($dTime / 3600) . '小时前'; } else if ($dDay > 0 && $dDay <= 7) { return intval($dDay) . '天前'; } else if ($dDay > 7 && $dDay <= 30) { return intval($dDay / 7) . '周前'; } else if ($dDay > 30 && $dDay < 365) { return intval($dDay / 30) . '个月前'; } else { return date($formt, $sTime); } } } //过滤HTML代码函数 if(!function_exists('htmldecode')) { function htmldecode($data) { $data = strip_tags($data); $data = str_replace(' ', '', $data); return $data; } } //计算点赞数 if(!function_exists('jz_zan')) { function jz_zan($tid, $id) { $count = M('likes')->getCount(['tid' => $tid, 'aid' => $id]); return $count; } } //计算收藏数 if(!function_exists('jz_collect')) { function jz_collect($tid, $id) { $count = M('shouchang')->getCount(['tid' => $tid, 'aid' => $id]); return $count; } } //用户详情 if(!function_exists('memberInfo')) { function memberInfo($id, $str = null) { $user = M('member')->find('id=' . $id); if ($str != null) { return $user[$str]; } return $user; } } //图片水印 if(!function_exists('watermark')) { function watermark($img, $water, $pos = 9, $tm = 100, $word = '') { $tm = $tm ?: 100; if(file_exists($water)){ $info = getImageInfo($img); $logo = getImageInfo($water); $dst = openImg($img, $info['type']); $src = openImg($water, $logo['type']); switch ($pos) { case 1: $x = 0; $y = 0; break; case 2: $x = ceil(($info['width'] - $logo['width']) / 2); $y = 0; break; case 3: $x = $info['width'] - $logo['width']; $y = 0; break; case 4: $x = 0; $y = ceil(($info['height'] - $logo['height']) / 2); break; case 5: $x = ceil(($info['width'] - $logo['width']) / 2); $y = ceil(($info['height'] - $logo['height']) / 2); break; case 6: $x = $info['width'] - $logo['width']; $y = ceil(($info['height'] - $logo['height']) / 2); break; case 7: $x = 0; $y = $info['height'] - $logo['height']; break; case 8: $x = ceil(($info['width'] - $logo['width']) / 2); $y = $info['height'] - $logo['height']; break; case 9: $x = $info['width'] - $logo['width']; $y = $info['height'] - $logo['height']; break; case 0: default: $x = mt_rand(0, $info['width'] - $logo['width']); $y = mt_rand(0, $y = $info['height'] - $logo['height']); break; } imagecopymerge($dst, $src, $x, $y, 0, 0, $logo['width'], $logo['height'], $tm); imagejpeg($dst, $img); imagedestroy($dst); imagedestroy($src); return $img; }else if($word){ $webconf = webConf(); // 图片路径 $imagePath = $img; // 文字水印内容 $text = $word; // 每行文字数 $charsPerLine = 10; // 文字大小 $fontSize = 24; // 文字行高 $lineHeight = 34; // 文字颜色(RGB格式) if(!empty($webconf['watermark_rgb']) && (strlen($webconf['watermark_rgb'])==7)) { $r = hexdec(substr($webconf['watermark_rgb'],1,2)); $g = hexdec(substr($webconf['watermark_rgb'],3,2)); $b = hexdec(substr($webconf['watermark_rgb'],5)); }else{ $r = $g = $b = 255; } $color = [$r, $g, $b]; // 文字字体路径 $fontPath = $webconf['watermark_font'] ? APP_PATH.'static/common/'.$webconf['watermark_font']:APP_PATH.'static/common/simsun.ttf'; // 文字水印位置(1-9,左上到右下) $position = $webconf['watermark_wz'] ?: 5; // 创建图像资源 if(stripos($imagePath,'.png')!==false){ $image = imagecreatefrompng($imagePath); }else if(stripos($imagePath,'.gif')!==false){ $image = imagecreatefromgif($imagePath); }else{ $image = imagecreatefromjpeg($imagePath); } // 设置字体文件路径 ---高版本已经废弃 //putenv('GDFONTPATH=' . realpath('.')); // 设置文字颜色 $textColor = imagecolorallocate($image, $color[0], $color[1], $color[2]); // 获取图像尺寸 $imageWidth = imagesx($image); $imageHeight = imagesy($image); // 计算文字宽度和高度 $textBoundingBox = imagettfbbox($fontSize, 0, $fontPath, $text); $textWidth = $textBoundingBox[2] - $textBoundingBox[0]; $textHeight = $textBoundingBox[1] - $textBoundingBox[7]; // 处理文字水印内容并自动换行 $lines = []; $line = ''; //$chars = mb_str_split($text); $chars = smb_str_split($text); $newlines = []; $l = ''; $n = 1;//行数 foreach($chars as $k=>$v){ $l.=$v; if( ($k+1)%$charsPerLine==0){ $newlines[] = $l; $l = ''; $n += 1; } } $newlines[] = $l; //var_dump($newlines);exit; //计算文字真实和宽度 $old = $textHeight+2; $textHeight = count($newlines) * $old; if($n==1){ $textWidth = $old * count($chars); }else{ $textWidth = $old * $charsPerLine; } // 计算水印位置 switch ($position) { case 1: // 左上 $x = 0; $y = 0; break; case 2: // 上 $x = ($imageWidth - $textWidth) / 2; $y = 0; break; case 3: // 右上 $x = $imageWidth - $textWidth; $y = 0; break; case 4: // 左 $x = 0; $y = ($imageHeight - $textHeight) / 2; break; case 5: // 居中 $x = ($imageWidth - $textWidth) / 2; $y = ($imageHeight - $textHeight) / 2; break; case 6: // 右 $x = $imageWidth - $textWidth; $y = ($imageHeight - $textHeight) / 2; break; case 7: // 左下 $x = 0; $y = $imageHeight - $textHeight; break; case 8: // 下 $x = ($imageWidth - $textWidth) / 2; $y = $imageHeight - $textHeight; break; case 9: // 右下 $x = $imageWidth - $textWidth; $y = $imageHeight - $textHeight; break; default: // 默认为右下 $x = $imageWidth - $textWidth; $y = $imageHeight - $textHeight; break; } // 添加文字水印 $y = $y + $fontSize; //微调 $x = $x + $webconf['watermark_x']; $y = $y + $webconf['watermark_y']; foreach ($newlines as $line) { imagettftext($image, $fontSize, 0, $x, $y, $textColor, $fontPath, $line); $y += $lineHeight; } // 生成新的图像文件名 $source = $imagePath; // 替换为你想要保存的图像文件路径和文件名 $newImagePath = $source; // 保存图像到文件 if(stripos($imagePath,'.png')!==false){ imagepng($image, $newImagePath); }else if(stripos($imagePath,'.gif')!==false){ imagegif($image, $newImagePath); }else{ imagejpeg($image, $newImagePath); } // 释放资源 imagedestroy($image); return str_replace(APP_PATH,'',$source); } return $img; } } if(!function_exists('getImageInfo')) { function getImageInfo($path) { $info = getimagesize($path); $data['width'] = $info[0]; $data['height'] = $info[1]; $data['type'] = $info['mime']; return $data; } } //打开图片 if(!function_exists('openImg')) { function openImg($path, $type) { switch ($type) { case 'image/jpeg': case 'image/jpg': case 'image/pjpeg': $img = imagecreatefromjpeg($path); break; case 'image/png': case 'image/x-png': $img = imagecreatefrompng($path); break; case 'image/gif': $img = imagecreatefromgif($path); break; case 'image/wbmp': $img = imagecreatefromwbmp($path); break; default: exit('图片类型不支持'); } return $img; } } //检查是否关注 if(!function_exists('isfollow')) { function isfollow($id, $other) { $follow = M('member')->getField(['id' => $id], 'follow'); if (strpos($follow, ',' . $other . ',') !== false) { return true; } else { return false; } } } //计算粉丝数 if(!function_exists('jz_fans')) { function jz_fans($id = 0) { if ($id) { $user_num = M('member')->getCount(" follow like '%," . $id . ",%'"); return $user_num; } else { return 0; } } } //计算关注数 if(!function_exists('jz_follow')) { function jz_follow($id = 0) { if ($id) { //,1,2,2,4, $follow = M('member')->getField(['id' => $id], 'follow'); if ($follow != '') { $follow = trim($follow, ','); $num = substr_count($follow, ','); return $num + 1; } else { return 0; } } else { return 0; } } } //删除文件目录 if(!function_exists('deldir')) { function deldir($dir) { //先删除目录下的文件: $dh = opendir($dir); while ($file = readdir($dh)) { if ($file != "." && $file != "..") { $fullpath = $dir . "/" . $file; if (!is_dir($fullpath)) { unlink($fullpath); } else { deldir($fullpath); } } } closedir($dh); //删除当前文件夹: if (rmdir($dir)) { return true; } else { return false; } } } /** * 图片压缩裁剪 * src_image 原图链接 根目录绝对链接,支持远程图片 * out_image 生成图链接 写文件名即可 * mode=1 按尺寸裁剪 mode=0 按比例裁剪 * out_width 生成的宽(比例) * out_height 生成的高(比例) * img_quality 压缩比例(PNG无法压缩) * direct=1 中间开始裁剪 direct=0 左上角开始裁剪 * debug=1 调试状态,每次请求都生成缓存 debug=0 会直接调用已生成的缩略图 */ if(!function_exists('jzresize')) { function jzresize($src_image, $out_width = NULL, $out_height = NULL, $mode = 1, $out_image = NULL, $direct = 1, $debug = 0, $img_quality = 90) { if (!file_exists('.' . $src_image)) { if (strpos($src_image, 'http') !== false) { return $src_image; } } else { list($width, $height, $type, $attr) = getimagesize('.' . $src_image); if ($width == $out_width && $height == $out_height) { return $src_image; } if (!is_dir(APP_PATH . 'cache/image')) { if (!mkdir(APP_PATH . 'cache/image', 0777)) { exit('没有权限[cache/image]'); } } if (!$out_image) { $imageinfo = pathinfo($src_image); $filename = str_replace('.' . $imageinfo['extension'], '_' . $out_width . 'x' . $out_height . '.' . $imageinfo['extension'], $imageinfo['basename']); $out_image = 'cache/image/' . $filename; } if (file_exists(APP_PATH . $out_image) && !$debug) { return '/' . $out_image; } else { if (!copy(APP_PATH . $src_image, $out_image)) { return ''; } list($width, $height, $type, $attr) = getimagesize($out_image); switch ($type) { case 1: $img = imagecreatefromgif($out_image); break; case 2: $img = imagecreatefromjpeg($out_image); break; case 3: $img = imagecreatefrompng($out_image); break; } $out_scale = $out_height / $out_width; $src_scale = $height / $width; if ($mode == 1) { $w = $out_width; $h = $out_height; } else { $w = $width; $h = intval($out_scale * $w); if ($h > $height) { $h = $height; $w = intval($h / $out_scale); } } if ($direct == 1) { if ($src_scale >= $out_scale) { $w = intval($width); $h = intval($out_scale * $w); $start_x = 0; $start_y = ($height - $h) / 2; } else { $h = intval($height); $w = intval($h / $out_scale); $start_x = ($width - $w) / 2; $start_y = 0; } } else { $w = intval($width); $h = intval($height); $start_x = 0; $start_y = 0; } $scale = $out_width / $w; $new_img = imagecreatetruecolor($out_width, $out_height); // 根据图像类型处理透明度 switch ($type) { case 1: // GIF $transparent = imagecolorallocatealpha($new_img, 0, 0, 0, 127); imagefill($new_img, 0, 0, $transparent); imagecolortransparent($new_img, $transparent); // 使背景透明 break; case 3: // PNG imagesavealpha($new_img, true); // 保存透明通道信息 $transparent = imagecolorallocatealpha($new_img, 0, 0, 0, 127); imagefill($new_img, 0, 0, $transparent); break; default: // 对于不支持透明度的图像类型(如 JPEG),使用白色背景 $white = imagecolorallocate($new_img, 255, 255, 255); imagefill($new_img, 0, 0, $white); break; } imagecopyresampled($new_img, $img, 0, 0, $start_x, $start_y, $out_width, $out_height, $w, $h); switch ($type) { case 1: // GIF imagegif($new_img, $out_image); // 保存GIF图像,不需要质量参数 break; case 2: // JPEG imagejpeg($new_img, $out_image, $img_quality); // 保存JPEG图像,需要质量参数 break; case 3: // PNG imagesavealpha($new_img, true); // 确保保存透明度信息 imagepng($new_img, $out_image); // 保存PNG图像,不需要质量参数,但可以设置压缩级别 break; } imagedestroy($img); imagedestroy($new_img); return '/' . $out_image; } } } } if(!function_exists('jzcachedata')) { function jzcachedata($field) { $result = getCache('jzcache_' . $field); if (!$result) { $res = M('cachedata')->find(['field' => $field]); if ($res['isall'] && $res['tid']) { $classtypedata = (isMobile() && webConf('iswap') == 1) ? classTypeDataMobile() : classTypeData(); foreach ($classtypedata as $k => $v) { $classtypedata[$k]['children'] = get_children($v, $classtypedata); } } $tid = $res['tid'] ? ($res['isall'] == 1 ? ' and tid in (' . implode(',', $classtypedata[$res['tid']]['children']['ids']) . ') ' : ' and tid=' . $res['tid']) : ''; $sqls = $res['sqls'] ? ' and ' . $res['sqls'] : ''; $orderby = $res['orders'] ? ' order by ' . $res['orders'] : ''; $limit = $res['limits'] ? ' limit ' . $res['limits'] : ''; if ($tid || $sqls) { $where = ' where 1=1 ' . $tid . htmlspecialchars_decode($sqls, ENT_QUOTES); } else { $where = ''; } $sql = "select * from " . DB_PREFIX . $res['molds'] . $where . $orderby . $limit; $result = M()->findSql($sql); if ($result) { foreach ($result as $kk => $vv) { if (isset($vv['htmlurl'])) { $result[$kk]['url'] = gourl($vv, $vv['htmlurl']); } } } $time = $res['times'] * 60; setCache('jzcache_' . $res['field'], $result, $time); } return $result; } } // 增加classtypedata缓存 if(!function_exists('getclasstypedata')) { function getclasstypedata($array, $m = 1) { if ($m) { $s = 'classtypedatamobile'; } else { $s = 'classtypedatapc'; } $classtypedata = getCache($s); if (!$classtypedata) { $classtypedata = $array; $classtypemaxlevel = webConf('classtypemaxlevel'); foreach ($classtypedata as $k => $v) { if ($classtypemaxlevel) { $classtypedata[$k]['children'] = get_all_children($v, $classtypedata); } else { $classtypedata[$k]['children'] = get_children($v, $classtypedata); } } setCache($s, $classtypedata); } return $classtypedata; } } //递归获取全部格式化子类 if(!function_exists('get_all_children')) { function get_all_children($type, $classtypedata) { $res = get_children($type, $classtypedata); if ($type['haschild']) { foreach ($res['list'] as $k => $v) { $res['list'][$k]['children'] = get_all_children($v, $classtypedata); } } return $res; } } if(!function_exists('jztpldata')) { function jztpldata() { $tpldata = getCache('tpldata'); if (!$tpldata) { $webconf = webConf(); $m = (isMobile() && $webconf['iswap'] == 1) ? 1 : 0; if ($m) { $classtypedata = classTypeDataMobile(); } else { $classtypedata = classTypeData(); } $tpldata = []; $tpl_data = M('tplfields')->findAll(); if ($tpl_data) { foreach ($tpl_data as $v) { if ($v['tid']) { $v['url'] = $classtypedata[$v['tid']]['url']; } if ($v['orders']) { switch ($v['orders']) { case 1: $v['orders'] = ' addtime desc '; break; case 2: $v['orders'] = ' addtime asc '; break; case 3: $v['orders'] = ' orders desc '; break; case 4: $v['orders'] = ' hits desc '; break; case 5: $v['orders'] = ' id asc '; break; case 6: $v['orders'] = ' id desc '; break; } } switch ($v['fieldtype']) { case 4: case 11: $data = explode('||', $v['data']); $newdata = []; foreach ($data as $kk => $vv) { $pic = explode('|', $vv); $newdata[$kk] = ['url' => $pic[0], 'title' => $pic[1]]; } $v['filedata'] = $newdata; break; case 8: case 9: $v['sdata'] = explode("\n", $v['sdata']); break; } $tpldata[$v['pid']][$v['field']] = $v; } } setCache('tpldata', $tpldata); } return $tpldata; } } if(!function_exists('jztpldatafield')) { function jztpldatafield() { $tpldata = getCache('tpldata'); if (!$tpldata) { $webconf = webConf(); $m = (isMobile() && $webconf['iswap'] == 1) ? 1 : 0; if ($m) { $classtypedata = classTypeDataMobile(); } else { $classtypedata = classTypeData(); } $tpldata = []; $tpls = M('tpl')->findAll(); $tplarr = []; foreach ($tpls as $v) { $tplarr[$v['id']] = $v; } $tpl_data = M('tplfields')->findAll(); if ($tpl_data) { foreach ($tpl_data as $v) { if ($v['tid']) { $v['url'] = $classtypedata[$v['tid']]['url']; } if ($v['orders']) { switch ($v['orders']) { case 1: $v['orders'] = ' addtime desc '; break; case 2: $v['orders'] = ' addtime asc '; break; case 3: $v['orders'] = ' orders desc '; break; case 4: $v['orders'] = ' hits desc '; break; case 5: $v['orders'] = ' id asc '; break; case 6: $v['orders'] = ' id desc '; break; } } switch ($v['fieldtype']) { case 4: case 11: $data = explode('||', $v['data']); $newdata = []; foreach ($data as $kk => $vv) { $pic = explode('|', $vv); $newdata[$kk] = ['url' => $pic[0], 'title' => $pic[1]]; } $v['filedata'] = $newdata; break; case 8: case 9: $v['sdata'] = explode("\n", $v['sdata']); break; } $tpldata[$tplarr[$v['pid']]['field']][$v['field']] = $v; } } setCache('tpldata2', $tpldata); } else { $tpldata = getCache('tpldata2'); } return $tpldata; } } if(!function_exists('waterwordmark')) { function waterwordmark($title,$path,$isnew = 1){ $webconf = webConf(); // 图片路径 $imagePath = $path; // 文字水印内容 $text = $title; // 每行文字数 $charsPerLine = $webconf['text_num'] ?: 10; // 文字大小 $fontSize = $webconf['text_size'] ?: 24; // 文字行高 $lineHeight = $webconf['text_h'] ?: 34; // 文字间距 $letterSpacing = $webconf['text_m'] ?: 2; // 文字颜色(RGB格式) if(!empty($webconf['text_rgb']) && (strlen($webconf['text_rgb'])==7)) { $r = hexdec(substr($webconf['text_rgb'],1,2)); $g = hexdec(substr($webconf['text_rgb'],3,2)); $b = hexdec(substr($webconf['text_rgb'],5)); }else{ $r = $g = $b = 255; } $color = [$r, $g, $b]; // 文字字体路径 $fontPath = $webconf['text_font'] ? APP_PATH.'static/common/'.$webconf['text_font']:APP_PATH.'static/common/Alibaba-PuHuiTi-Bold.ttf'; // 文字水印位置(1-9,左上到右下) $position = $webconf['text_wz'] ?: 5; // 创建图像资源 if(stripos($imagePath,'.png')!==false){ $image = imagecreatefrompng($imagePath); }else if(stripos($imagePath,'.gif')!==false){ $image = imagecreatefromgif($imagePath); }else{ $image = imagecreatefromjpeg($imagePath); } // 设置字体文件路径 ---高版本已经废弃 //putenv('GDFONTPATH=' . realpath('.')); // 设置文字颜色 $textColor = imagecolorallocate($image, $color[0], $color[1], $color[2]); // 获取图像尺寸 $imageWidth = imagesx($image); $imageHeight = imagesy($image); // 计算文字宽度和高度 $textBoundingBox = imagettfbbox($fontSize, 0, $fontPath, $text); $textWidth = $textBoundingBox[2] - $textBoundingBox[0]; $textHeight = $textBoundingBox[1] - $textBoundingBox[7]; // 处理文字水印内容并自动换行 $lines = []; $line = ''; //$chars = mb_str_split($text); $chars = smb_str_split($text); $newlines = []; $l = ''; $n = 1;//行数 foreach($chars as $k=>$v){ $l.=$v; if( ($k+1)%$charsPerLine==0){ $newlines[] = $l; $l = ''; $n += 1; } } $newlines[] = $l; //var_dump($newlines);exit; //计算文字真实和宽度 $old = $textHeight+2; $textHeight = count($newlines) * $old; if($n==1){ $textWidth = $old * count($chars); }else{ $textWidth = $old * $charsPerLine; } // 计算水印位置 switch ($position) { case 1: // 左上 $x = 0; $y = 0; break; case 2: // 上 $x = ($imageWidth - $textWidth) / 2; $y = 0; break; case 3: // 右上 $x = $imageWidth - $textWidth; $y = 0; break; case 4: // 左 $x = 0; $y = ($imageHeight - $textHeight) / 2; break; case 5: // 居中 $x = ($imageWidth - $textWidth) / 2; $y = ($imageHeight - $textHeight) / 2; break; case 6: // 右 $x = $imageWidth - $textWidth; $y = ($imageHeight - $textHeight) / 2; break; case 7: // 左下 $x = 0; $y = $imageHeight - $textHeight; break; case 8: // 下 $x = ($imageWidth - $textWidth) / 2; $y = $imageHeight - $textHeight; break; case 9: // 右下 $x = $imageWidth - $textWidth; $y = $imageHeight - $textHeight; break; default: // 默认为右下 $x = $imageWidth - $textWidth; $y = $imageHeight - $textHeight; break; } // 添加文字水印 $y = $y + $fontSize; //微调 $x = $x + $webconf['text_x']; $y = $y + $webconf['text_y']; foreach ($newlines as $line) { imagettftext($image, $fontSize, 0, $x, $y, $textColor, $fontPath, $line); $y += $lineHeight; } // 生成新的图像文件名 if($isnew){ $pic_arr = explode('.',$imagePath); $pix = end($pic_arr); //$source = $imagePath; // 替换为你想要保存的图像文件路径和文件名 if(isset($webconf['admin_save_path'])){ //替换日期事件 $t = time(); $d = explode('-', date("Y-y-m-d-H-i-s")); $format = $webconf['admin_save_path']; $format = str_replace("{yyyy}", $d[0], $format); $format = str_replace("{yy}", $d[1], $format); $format = str_replace("{mm}", $d[2], $format); $format = str_replace("{dd}", $d[3], $format); $format = str_replace("{hh}", $d[4], $format); $format = str_replace("{ii}", $d[5], $format); $format = str_replace("{ss}", $d[6], $format); $format = str_replace("{time}", $t, $format); if($format!=''){ //检查文件是否存在 if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){ $path = explode('/',$format); $path1 = APP_PATH; foreach($path as $v){ if($path1==APP_PATH){ if(!file_exists($path1.$v)){ mkdir($path1.$v,0777); } $path1.=$v; }else{ if(!file_exists($path1.'/'.$v)){ mkdir($path1.'/'.$v,0777); } $path1.='/'.$v; } } }else if(!file_exists(APP_PATH.$format)){ mkdir(APP_PATH.$format,0777); } $admin_save_path = $format; }else{ $admin_save_path = 'static/upload'; } }else{ $admin_save_path = 'static/upload'; } $source = APP_PATH.'/'.$admin_save_path.'/'.date('Ymd').rand(1000,9999).'.'.$pix; }else{ $source = $imagePath; // 替换为你想要保存的图像文件路径和文件名 } $newImagePath = $source; // 保存图像到文件 if(stripos($imagePath,'.png')!==false){ imagepng($image, $newImagePath); }else if(stripos($imagePath,'.gif')!==false){ imagegif($image, $newImagePath); }else{ imagejpeg($image, $newImagePath); } // 释放资源 imagedestroy($image); return str_replace(APP_PATH,'',$newImagePath); } } if(!function_exists('smb_str_split')) { // 将字符串拆分为单个字符 function smb_str_split($string, $split_length = 1, $encoding = null) { if ($split_length < 1) { return false; } if ($encoding === null) { $encoding = mb_internal_encoding(); } $result = []; $length = mb_strlen($string, $encoding); for ($i = 0; $i < $length; $i += $split_length) { $result[] = mb_substr($string, $i, $split_length, $encoding); } return $result; } } if(!function_exists('check_field_must')){ function check_field_must($data,$molds){ // 不为空检测 $sql = " molds='{$molds}' and isshow=1 "; if(isset($data['tid']) && $data['tid']){ $tid = (int)$data['tid']; $sql.=" and tids like ',".$tid.",'"; } $fields_list = M('Fields')->findAll($sql,'orders desc,id asc'); if($fields_list){ foreach($fields_list as $v){ if($v['ismust']==1){ if($data[$v['field']]===''|| $data[$v['field']]===null){ if(in_array($v['fieldtype'],array(6,10))){ if($data[$v['field'].'_urls']==''){ JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空!')]); } }else{ JsonReturn(['code'=>1,'msg'=>$v['fieldname'].JZLANG('不能为空!')]); } } } } } } } if(!function_exists('remote_data_local')){ function remote_data_local($body = '', $tid=0, $molds=null) { $webconfig = getCache('webconfig'); $web_basehost = get_domain(); $img_array = array(); preg_match_all('/]+src="([^">]+)"/', $body, $img_array); //preg_match_all('/http(s?):\/\/(.*?).*?\\"/is', $body, $img_array); //img 被转义的数据 $img_array = array_unique($img_array[1]); if(isset($webconfig['admin_save_path'])){ //替换日期事件 $t = time(); $d = explode('-', date("Y-y-m-d-H-i-s")); $format = $webconfig['admin_save_path']; $format = str_replace("{yyyy}", $d[0], $format); $format = str_replace("{yy}", $d[1], $format); $format = str_replace("{mm}", $d[2], $format); $format = str_replace("{dd}", $d[3], $format); $format = str_replace("{hh}", $d[4], $format); $format = str_replace("{ii}", $d[5], $format); $format = str_replace("{ss}", $d[6], $format); $format = str_replace("{time}", $t, $format); if($format!=''){ //检查文件是否存在 if(strpos($format,'/')!==false && !file_exists(APP_PATH.$format)){ $path = explode('/',$format); $path1 = APP_PATH; foreach($path as $v){ if($path1==APP_PATH){ if(!file_exists($path1.$v)){ mkdir($path1.$v,0777); } $path1.=$v; }else{ if(!file_exists($path1.'/'.$v)){ mkdir($path1.'/'.$v,0777); } $path1.='/'.$v; } } }else if(!file_exists(APP_PATH.$format)){ mkdir(APP_PATH.$format,0777); } $admin_save_path = $format; }else{ $admin_save_path = 'public/Admin'; } }else{ $admin_save_path = 'public/Admin'; } $dirname = $admin_save_path.'/'; //创建目录失败 if (!file_exists($dirname) && !mkdir($dirname, 0777, true)) { return $body; } else if (!is_writeable($dirname)) { return $body; } foreach ($img_array as $key => $value) { $imgUrl = trim($value); // $imgUrl = preg_replace('/\\\"/', '', $imgUrl); //img 被转义的数据 $imgUrl = preg_replace('/#/', '', $imgUrl); // 本站图片 / 根网址图片 / 第三方存储插件的图片 if (preg_match("/\/\/('.$web_basehost.')\//i", $imgUrl)) { continue; } // 不是合法链接 if (!preg_match("#^http(s?):\/\/#i", $imgUrl)) { continue; } $heads = @get_headers($imgUrl, 1); // 获取请求头并检测死链 if (empty($heads)) { continue; } else if (!(stristr($heads[0], "200") && !stristr($heads[0], "304"))) { continue; } // 图片扩展名 $fileType = substr($heads['Content-Type'], -4, 4); if (!preg_match("#\.(jpg|jpeg|gif|png|ico|bmp|webp|svg)#i", $fileType)) { if ($fileType == 'image/gif') { $pix = "gif"; } else if ($fileType == 'image/png') { $pix = "png"; } else if ($fileType == 'image/x-icon') { $pix = "ico"; } else if ($fileType == 'image/bmp') { $pix = "bmp"; } else if ($fileType == 'image/webp') { $pix = "webp"; } else if ($heads['Content-Type'] == 'image/svg+xml') { $pix = "svg"; } else { $pix = 'jpg'; } } $pix = strtolower($pix); //打开输出缓冲区并获取远程图片 ob_start(); $context = stream_context_create( array('http' => array( 'follow_location' => false // don't follow redirects )) ); readfile($imgUrl, false, $context); $img = ob_get_contents(); ob_end_clean(); preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/", $imgUrl, $m); $file = []; $file['oriName'] = $m ? $m[1] : ""; $file['filesize'] = strlen($img); $file['ext'] = $pix; $file['name'] = date("ymdHis") . mt_rand(100, 999) .'.'. $file['ext']; $file['fullName'] = $dirname . $file['name']; $fullName = $file['fullName']; //检查文件大小是否超出限制 if ($file['filesize'] >= 20480000) { continue; } //移动文件 if (!(file_put_contents($fullName, $img) && file_exists($fullName))) { //移动失败 continue; } //处理水印 if( (strtolower($pix)=='png' || strtolower($pix)=='jpg' || strtolower($pix)=='jpeg') && $webconfig['iswatermark']==1 ){ watermark($file['fullName'],APP_PATH.$webconfig['watermark_file'],$webconfig['watermark_t'],$webconfig['watermark_tm'],$webconfig['text_word']); } $fileurl = '/'.$file['fullName']; $body = str_replace($imgUrl, $fileurl, $body); //添加图片进数据库 $filesize = round(filesize(APP_PATH.$file['fullName'])/1024,2); M('pictures')->add(['litpic'=>'/'.$file['fullName'],'addtime'=>time(),'userid'=>$_SESSION['admin']['id'],'size'=>$filesize,'filetype'=>strtolower($pix),'tid'=>$tid,'molds'=>$molds]); } return $body; } } ================================================ FILE: conf/FunctionsExt.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/03 // +---------------------------------------------------------------------- /*************************************** * 项目扩展函数-为开发者/站长自行定义使用 * ***************************************/ ================================================ FILE: conf/config.php ================================================ array ( 'host' => '', 'dbname' => '', 'username' => '', 'password' => '', 'prefix' => 'jz_', 'port' => '3306', ), 'redis' => array ( 'SAVE_HANDLE' => 'Redis', 'HOST' => '127.0.0.1', 'PORT' => 6379, 'AUTH' => NULL, 'TIMEOUT' => 0, 'RESERVED' => NULL, 'RETRY_INTERVAL' => 100, 'RECONNECT' => false, 'EXPIRE' => 1800, ), 'APP_DEBUG' => true, 'File_TXT_HIDE' => false, ); ?> ================================================ FILE: conf/route.php ================================================ // +---------------------------------------------------------------------- // | Date:2019/08 // +---------------------------------------------------------------------- return [ /** ['正则url','系统内真实链接','传输方式POST/GET,或者为空,则表示POST/GET都接收'] 如果有多条匹配,默认第一条有效 demo: ['/\/base\/([0-9]+)\.html$/','Home/test/id/$1','GET'], ['/\/xbase\/([0-9]+)\/(\w+)\.html$/','Home/test/id/$1/sq/$2','POST'], ['/\/test_([0-9]+)\.html$/','Home/test/id/$1','GET'], ['/\/abc\.html$/','/shangpin.html',''], **/ //以下规则不可删除,否则会报错! //http://demo.jizhicms.cn/Home/screen/molds/product/categories/3 ['/^\/screen-(\w+)-([0-9]+)-(.*)/','Screen/index/molds/$1/tid/$2/jz_screen/$3',''], ['/^\/searchAll(.*)/','Home/searchAll','GET'], ['/^\/search(.*)/','Home/search','GET'], ]; ================================================ FILE: frphp/common/Config.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/02 // +---------------------------------------------------------------------- /** * 核心公共配置 */ defined('APP_PATH') or exit(); return array( /*系统设定*/ 'Tpl_style' => '/Public',//公共静态文件 'Tpl_common' => 'common',//模板公共目录Home\View\common 'APP_HOME' => 'Home',//默认前台目录 'APP_URL' => '/index.php',//默认前台入口 'HOME_CONTROLLER' => 'Controller',//默认控制器文件目录 'HOME_MODEL' => 'Model',//默认模型文件目录 'HOME_VIEW' => 'View',//默认模板文件目录 'Tpl_template' => '',//默认模板目录-二级目录-多端口配置 'File_TXT' => '.html',//默认模板后缀名 'SessionTime' => 86400*7,//默认缓存时间 'APP_DEBUG' => false,//关闭调试 'StopLog' => false,//关闭事件日志 'DefaultController' => 'Home',//默认控制器 'DefaultAction' => 'index',//默认方法 'open_url_route' => true,//开启自定义路由 'open_redis_session'=> false,//开启redis缓存session 'Cache_Path' => APP_PATH.'cache',//缓存目录 'Session_Path' => APP_PATH.'cache/tmp',//session存储目录 'APP_LANG' => 'zh',//默认当前语言,zh_cn中文简体,其他自定义 'APP_LANG_REQUREST' => 'l',//语言包接收参数(小写的L) 'ROOT' => '/',//根目录路径 'File_TXT_HIDE' => false,//隐藏URL后缀 'CLASS_HIDE_SLASH' => false,//隐藏栏目最后的斜杠 ); ================================================ FILE: frphp/common/Error.php ================================================ <?php echo $msg?>

    • on line
    $count) {$end = $count + 1;} $returns = array(); for ($i = $start; $i <= $end; $i++) { if( $i == $line ){ $returns[] = "
    ".$i.". ".highlight_code($data[$i - 1], TRUE)."
    "; }else{ $returns[] = $i.". ".highlight_code($data[$i - 1], TRUE); } } return $returns; } function highlight_code($code){ if (preg_match("/<\?(php)?[^[:graph:]]/", $code)) { $code = highlight_string($code, TRUE); } else { $code = preg_replace("/(<\?php )+/", "", highlight_string(" ================================================ FILE: frphp/common/Functions.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/02 // +---------------------------------------------------------------------- /***************** * 核心公共函数集* *****************/ /** * 实例化一个没有模型文件的Model *@name string 模块名 * */ function M($name = null,$prefix = 1) { if(empty($name)){ $path = 'frphp\\lib\\Model'; return $path::getInstance(); } $table = $name; $name = ucfirst($name); if($name==''){ return '缺少模型类!'; }else{ $name = APP_HOME.'\\'.HOME_MODEL.'\\'.$name.'Model'; if(!class_exists($name)){ $path = 'frphp\\lib\\Model'; return $path::getInstance($table,$prefix); }else{ return $name::getInstance($table,$prefix); } } } /** 参数过滤,格式化 **/ function format_param($value=null,$int=0,$default=false){ if($value==null){ return '';} if($value===false && $default!==false){ return $default;} switch ($int){ case 0://整数 return (int)$value; case 1://字符串 $value = SafeFilter($value); $value=htmlspecialchars(trim($value), ENT_QUOTES); $value = addslashes($value); return $value; case 2://数组 if($value=='')return ''; array_walk_recursive($value, "array_format"); return $value; case 3://浮点 return (float)$value; case 4: $value = addslashes($value); $value = SafeFilter($value); return trim($value); case 5: $value = SafeFilter($value); $value=htmlspecialchars(trim($value), ENT_QUOTES); $value = addslashes($value); $ra=Array('select','insert','update','delete'); return str_ireplace($ra,'',$value); case 6: $value= strip_tags($value, "

    '; foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { if ($p > 0) { echo ''; } else { $startTime = $thisTime; } $p++; $lastTime = $thisTime; } echo '
    BENCHMARK
    till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
    TOTAL: '.number_format($lastTime-$startTime, 6).'s
    '; } } //########################################################################## QRtools::markTime('start'); //---- qrspec.php ----------------------------- /* * PHP QR Code encoder * * QR Code specifications * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) * or * "Automatic identification and data capture techniques -- * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('QRSPEC_VERSION_MAX', 40); define('QRSPEC_WIDTH_MAX', 177); define('QRCAP_WIDTH', 0); define('QRCAP_WORDS', 1); define('QRCAP_REMINDER', 2); define('QRCAP_EC', 3); class QRspec { public static $capacity = array( array( 0, 0, 0, array( 0, 0, 0, 0)), array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 array( 25, 44, 7, array( 10, 16, 22, 28)), array( 29, 70, 7, array( 15, 26, 36, 44)), array( 33, 100, 7, array( 20, 36, 52, 64)), array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 array( 41, 172, 7, array( 36, 64, 96, 112)), array( 45, 196, 0, array( 40, 72, 108, 130)), array( 49, 242, 0, array( 48, 88, 132, 156)), array( 53, 292, 0, array( 60, 110, 160, 192)), array( 57, 346, 0, array( 72, 130, 192, 224)), //10 array( 61, 404, 0, array( 80, 150, 224, 264)), array( 65, 466, 0, array( 96, 176, 260, 308)), array( 69, 532, 0, array( 104, 198, 288, 352)), array( 73, 581, 3, array( 120, 216, 320, 384)), array( 77, 655, 3, array( 132, 240, 360, 432)), //15 array( 81, 733, 3, array( 144, 280, 408, 480)), array( 85, 815, 3, array( 168, 308, 448, 532)), array( 89, 901, 3, array( 180, 338, 504, 588)), array( 93, 991, 3, array( 196, 364, 546, 650)), array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 array(101, 1156, 4, array( 224, 442, 644, 750)), array(105, 1258, 4, array( 252, 476, 690, 816)), array(109, 1364, 4, array( 270, 504, 750, 900)), array(113, 1474, 4, array( 300, 560, 810, 960)), array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 array(121, 1706, 4, array( 336, 644, 952, 1110)), array(125, 1828, 4, array( 360, 700, 1020, 1200)), array(129, 1921, 3, array( 390, 728, 1050, 1260)), array(133, 2051, 3, array( 420, 784, 1140, 1350)), array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 array(141, 2323, 3, array( 480, 868, 1290, 1530)), array(145, 2465, 3, array( 510, 924, 1350, 1620)), array(149, 2611, 3, array( 540, 980, 1440, 1710)), array(153, 2761, 3, array( 570, 1036, 1530, 1800)), array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 array(161, 3034, 0, array( 600, 1120, 1680, 1980)), array(165, 3196, 0, array( 630, 1204, 1770, 2100)), array(169, 3362, 0, array( 660, 1260, 1860, 2220)), array(173, 3532, 0, array( 720, 1316, 1950, 2310)), array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 ); //---------------------------------------------------------------------- public static function getDataLength($version, $level) { return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; } //---------------------------------------------------------------------- public static function getECCLength($version, $level) { return self::$capacity[$version][QRCAP_EC][$level]; } //---------------------------------------------------------------------- public static function getWidth($version) { return self::$capacity[$version][QRCAP_WIDTH]; } //---------------------------------------------------------------------- public static function getRemainder($version) { return self::$capacity[$version][QRCAP_REMINDER]; } //---------------------------------------------------------------------- public static function getMinimumVersion($size, $level) { for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; if($words >= $size) return $i; } return -1; } //###################################################################### public static $lengthTableBits = array( array(10, 12, 14), array( 9, 11, 13), array( 8, 16, 16), array( 8, 10, 12) ); //---------------------------------------------------------------------- public static function lengthIndicator($mode, $version) { if ($mode == QR_MODE_STRUCTURE) return 0; if ($version <= 9) { $l = 0; } else if ($version <= 26) { $l = 1; } else { $l = 2; } return self::$lengthTableBits[$mode][$l]; } //---------------------------------------------------------------------- public static function maximumWords($mode, $version) { if($mode == QR_MODE_STRUCTURE) return 3; if($version <= 9) { $l = 0; } else if($version <= 26) { $l = 1; } else { $l = 2; } $bits = self::$lengthTableBits[$mode][$l]; $words = (1 << $bits) - 1; if($mode == QR_MODE_KANJI) { $words *= 2; // the number of bytes is required } return $words; } // Error correction code ----------------------------------------------- // Table of the error correction code (Reed-Solomon block) // See Table 12-16 (pp.30-36), JIS X0510:2004. public static $eccTable = array( array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 ); //---------------------------------------------------------------------- // CACHEABLE!!! public static function getEccSpec($version, $level, array &$spec) { if (count($spec) < 5) { $spec = array(0,0,0,0,0); } $b1 = self::$eccTable[$version][$level][0]; $b2 = self::$eccTable[$version][$level][1]; $data = self::getDataLength($version, $level); $ecc = self::getECCLength($version, $level); if($b2 == 0) { $spec[0] = $b1; $spec[1] = (int)($data / $b1); $spec[2] = (int)($ecc / $b1); $spec[3] = 0; $spec[4] = 0; } else { $spec[0] = $b1; $spec[1] = (int)($data / ($b1 + $b2)); $spec[2] = (int)($ecc / ($b1 + $b2)); $spec[3] = $b2; $spec[4] = $spec[1] + 1; } } // Alignment pattern --------------------------------------------------- // Positions of alignment patterns. // This array includes only the second and the third position of the // alignment patterns. Rest of them can be calculated from the distance // between them. // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. public static $alignmentPattern = array( array( 0, 0), array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 ); /** -------------------------------------------------------------------- * Put an alignment marker. * @param frame * @param width * @param ox,oy center coordinate of the pattern */ public static function putAlignmentMarker(array &$frame, $ox, $oy) { $finder = array( "\xa1\xa1\xa1\xa1\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa0\xa1\xa0\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa1\xa1\xa1\xa1" ); $yStart = $oy-2; $xStart = $ox-2; for($y=0; $y<5; $y++) { QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); } } //---------------------------------------------------------------------- public static function putAlignmentPattern($version, &$frame, $width) { if($version < 2) return; $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; if($d < 0) { $w = 2; } else { $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); } if($w * $w - 3 == 1) { $x = self::$alignmentPattern[$version][0]; $y = self::$alignmentPattern[$version][0]; self::putAlignmentMarker($frame, $x, $y); return; } $cx = self::$alignmentPattern[$version][0]; for($x=1; $x<$w - 1; $x++) { self::putAlignmentMarker($frame, 6, $cx); self::putAlignmentMarker($frame, $cx, 6); $cx += $d; } $cy = self::$alignmentPattern[$version][0]; for($y=0; $y<$w-1; $y++) { $cx = self::$alignmentPattern[$version][0]; for($x=0; $x<$w-1; $x++) { self::putAlignmentMarker($frame, $cx, $cy); $cx += $d; } $cy += $d; } } // Version information pattern ----------------------------------------- // Version information pattern (BCH coded). // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. // size: [QRSPEC_VERSION_MAX - 6] public static $versionPattern = array( 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, 0x27541, 0x28c69 ); //---------------------------------------------------------------------- public static function getVersionPattern($version) { if($version < 7 || $version > QRSPEC_VERSION_MAX) return 0; return self::$versionPattern[$version -7]; } // Format information -------------------------------------------------- // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) public static $formatInfo = array( array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) ); public static function getFormatInfo($mask, $level) { if($mask < 0 || $mask > 7) return 0; if($level < 0 || $level > 3) return 0; return self::$formatInfo[$level][$mask]; } // Frame --------------------------------------------------------------- // Cache of initial frames. public static $frames = array(); /** -------------------------------------------------------------------- * Put a finder pattern. * @param frame * @param width * @param ox,oy upper-left coordinate of the pattern */ public static function putFinderPattern(&$frame, $ox, $oy) { $finder = array( "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" ); for($y=0; $y<7; $y++) { QRstr::set($frame, $ox, $oy+$y, $finder[$y]); } } //---------------------------------------------------------------------- public static function createFrame($version) { $width = self::$capacity[$version][QRCAP_WIDTH]; $frameLine = str_repeat ("\0", $width); $frame = array_fill(0, $width, $frameLine); // Finder pattern self::putFinderPattern($frame, 0, 0); self::putFinderPattern($frame, $width - 7, 0); self::putFinderPattern($frame, 0, $width - 7); // Separator $yOffset = $width - 7; for($y=0; $y<7; $y++) { $frame[$y][7] = "\xc0"; $frame[$y][$width - 8] = "\xc0"; $frame[$yOffset][7] = "\xc0"; $yOffset++; } $setPattern = str_repeat("\xc0", 8); QRstr::set($frame, 0, 7, $setPattern); QRstr::set($frame, $width-8, 7, $setPattern); QRstr::set($frame, 0, $width - 8, $setPattern); // Format info $setPattern = str_repeat("\x84", 9); QRstr::set($frame, 0, 8, $setPattern); QRstr::set($frame, $width - 8, 8, $setPattern, 8); $yOffset = $width - 8; for($y=0; $y<8; $y++,$yOffset++) { $frame[$y][8] = "\x84"; $frame[$yOffset][8] = "\x84"; } // Timing pattern for($i=1; $i<$width-15; $i++) { $frame[6][7+$i] = chr(0x90 | ($i & 1)); $frame[7+$i][6] = chr(0x90 | ($i & 1)); } // Alignment pattern self::putAlignmentPattern($version, $frame, $width); // Version information if($version >= 7) { $vinf = self::getVersionPattern($version); $v = $vinf; for($x=0; $x<6; $x++) { for($y=0; $y<3; $y++) { $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } $v = $vinf; for($y=0; $y<6; $y++) { for($x=0; $x<3; $x++) { $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } } // and a little bit... $frame[$width - 8][8] = "\x81"; return $frame; } //---------------------------------------------------------------------- public static function debug($frame, $binary_mode = false) { if ($binary_mode) { foreach ($frame as &$frameLine) { $frameLine = join('  ', explode('0', $frameLine)); $frameLine = join('██', explode('1', $frameLine)); } ?>


            '; echo join("
            ", $frame); echo '






    '; } else { foreach ($frame as &$frameLine) { $frameLine = join(' ', explode("\xc0", $frameLine)); $frameLine = join('', explode("\xc1", $frameLine)); $frameLine = join(' ', explode("\xa0", $frameLine)); $frameLine = join('', explode("\xa1", $frameLine)); $frameLine = join('', explode("\x84", $frameLine)); //format 0 $frameLine = join('', explode("\x85", $frameLine)); //format 1 $frameLine = join('', explode("\x81", $frameLine)); //special bit $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 $frameLine = join('', explode("\x91", $frameLine)); //clock 1 $frameLine = join(' ', explode("\x88", $frameLine)); //version $frameLine = join('', explode("\x89", $frameLine)); //version $frameLine = join('♦', explode("\x01", $frameLine)); $frameLine = join('⋅', explode("\0", $frameLine)); } ?> "; echo join("
    ", $frame); echo "
    "; } } //---------------------------------------------------------------------- public static function serial($frame) { return gzcompress(join("\n", $frame), 9); } //---------------------------------------------------------------------- public static function unserial($code) { return explode("\n", gzuncompress($code)); } //---------------------------------------------------------------------- public static function newFrame($version) { if($version < 1 || $version > QRSPEC_VERSION_MAX) return null; if(!isset(self::$frames[$version])) { $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; if (QR_CACHEABLE) { if (file_exists($fileName)) { self::$frames[$version] = self::unserial(file_get_contents($fileName)); } else { self::$frames[$version] = self::createFrame($version); file_put_contents($fileName, self::serial(self::$frames[$version])); } } else { self::$frames[$version] = self::createFrame($version); } } if(is_null(self::$frames[$version])) return null; return self::$frames[$version]; } //---------------------------------------------------------------------- public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } public static function rsBlockNum1($spec) { return $spec[0]; } public static function rsDataCodes1($spec) { return $spec[1]; } public static function rsEccCodes1($spec) { return $spec[2]; } public static function rsBlockNum2($spec) { return $spec[3]; } public static function rsDataCodes2($spec) { return $spec[4]; } public static function rsEccCodes2($spec) { return $spec[2]; } public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } } //---- qrimage.php ----------------------------- /* * PHP QR Code encoder * * Image output of code using GD2 * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('QR_IMAGE', true); class QRimage { //---------------------------------------------------------------------- public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Content-type: image/png"); ImagePng($image); } else { if($saveandprint===TRUE){ ImagePng($image, $filename); header("Content-type: image/png"); ImagePng($image); }else{ ImagePng($image, $filename); } } ImageDestroy($image); } //---------------------------------------------------------------------- public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Content-type: image/jpeg"); ImageJpeg($image, null, $q); } else { ImageJpeg($image, $filename, $q); } ImageDestroy($image); } //---------------------------------------------------------------------- private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) { $h = count($frame); $w = strlen($frame[0]); $imgW = $w + 2*$outerFrame; $imgH = $h + 2*$outerFrame; $base_image =ImageCreate($imgW, $imgH); $col[0] = ImageColorAllocate($base_image,255,255,255); $col[1] = ImageColorAllocate($base_image,0,0,0); imagefill($base_image, 0, 0, $col[0]); for($y=0; $y<$h; $y++) { for($x=0; $x<$w; $x++) { if ($frame[$y][$x] == '1') { ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); } } } $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); ImageDestroy($base_image); return $target_image; } } //---- qrinput.php ----------------------------- /* * PHP QR Code encoder * * Input encoding class * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('STRUCTURE_HEADER_BITS', 20); define('MAX_STRUCTURED_SYMBOLS', 16); class QRinputItem { public $mode; public $size; public $data; public $bstream; public function __construct($mode, $size, $data, $bstream = null) { $setData = array_slice($data, 0, $size); if (count($setData) < $size) { $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); } if(!QRinput::check($mode, $size, $setData)) { throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); return null; } $this->mode = $mode; $this->size = $size; $this->data = $setData; $this->bstream = $bstream; } //---------------------------------------------------------------------- public function encodeModeNum($version) { try { $words = (int)($this->size / 3); $bs = new QRbitstream(); $val = 0x1; $bs->appendNum(4, $val); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); for($i=0; $i<$words; $i++) { $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; $val += (ord($this->data[$i*3+2]) - ord('0')); $bs->appendNum(10, $val); } if($this->size - $words * 3 == 1) { $val = ord($this->data[$words*3]) - ord('0'); $bs->appendNum(4, $val); } else if($this->size - $words * 3 == 2) { $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; $val += (ord($this->data[$words*3+1]) - ord('0')); $bs->appendNum(7, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeAn($version) { try { $words = (int)($this->size / 2); $bs = new QRbitstream(); $bs->appendNum(4, 0x02); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); for($i=0; $i<$words; $i++) { $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); $bs->appendNum(11, $val); } if($this->size & 1) { $val = QRinput::lookAnTable(ord($this->data[$words * 2])); $bs->appendNum(6, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeMode8($version) { try { $bs = new QRbitstream(); $bs->appendNum(4, 0x4); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); for($i=0; $i<$this->size; $i++) { $bs->appendNum(8, ord($this->data[$i])); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeKanji($version) { try { $bs = new QRbitrtream(); $bs->appendNum(4, 0x8); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); for($i=0; $i<$this->size; $i+=2) { $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); if($val <= 0x9ffc) { $val -= 0x8140; } else { $val -= 0xc140; } $h = ($val >> 8) * 0xc0; $val = ($val & 0xff) + $h; $bs->appendNum(13, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeStructure() { try { $bs = new QRbitstream(); $bs->appendNum(4, 0x03); $bs->appendNum(4, ord($this->data[1]) - 1); $bs->appendNum(4, ord($this->data[0]) - 1); $bs->appendNum(8, ord($this->data[2])); $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function estimateBitStreamSizeOfEntry($version) { $bits = 0; if($version == 0) $version = 1; switch($this->mode) { case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; default: return 0; } $l = QRspec::lengthIndicator($this->mode, $version); $m = 1 << $l; $num = (int)(($this->size + $m - 1) / $m); $bits += $num * (4 + $l); return $bits; } //---------------------------------------------------------------------- public function encodeBitStream($version) { try { unset($this->bstream); $words = QRspec::maximumWords($this->mode, $version); if($this->size > $words) { $st1 = new QRinputItem($this->mode, $words, $this->data); $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); $st1->encodeBitStream($version); $st2->encodeBitStream($version); $this->bstream = new QRbitstream(); $this->bstream->append($st1->bstream); $this->bstream->append($st2->bstream); unset($st1); unset($st2); } else { $ret = 0; switch($this->mode) { case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; case QR_MODE_8: $ret = $this->encodeMode8($version); break; case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; default: break; } if($ret < 0) return -1; } return $this->bstream->size(); } catch (Exception $e) { return -1; } } }; //########################################################################## class QRinput { public $items; private $version; private $level; //---------------------------------------------------------------------- public function __construct($version = 0, $level = QR_ECLEVEL_L) { if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { throw new Exception('Invalid version no'); return NULL; } $this->version = $version; $this->level = $level; } //---------------------------------------------------------------------- public function getVersion() { return $this->version; } //---------------------------------------------------------------------- public function setVersion($version) { if($version < 0 || $version > QRSPEC_VERSION_MAX) { throw new Exception('Invalid version no'); return -1; } $this->version = $version; return 0; } //---------------------------------------------------------------------- public function getErrorCorrectionLevel() { return $this->level; } //---------------------------------------------------------------------- public function setErrorCorrectionLevel($level) { if($level > QR_ECLEVEL_H) { throw new Exception('Invalid ECLEVEL'); return -1; } $this->level = $level; return 0; } //---------------------------------------------------------------------- public function appendEntry(QRinputItem $entry) { $this->items[] = $entry; } //---------------------------------------------------------------------- public function append($mode, $size, $data) { try { $entry = new QRinputItem($mode, $size, $data); $this->items[] = $entry; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function insertStructuredAppendHeader($size, $index, $parity) { if( $size > MAX_STRUCTURED_SYMBOLS ) { throw new Exception('insertStructuredAppendHeader wrong size'); } if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { throw new Exception('insertStructuredAppendHeader wrong index'); } $buf = array($size, $index, $parity); try { $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); array_unshift($this->items, $entry); return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function calcParity() { $parity = 0; foreach($this->items as $item) { if($item->mode != QR_MODE_STRUCTURE) { for($i=$item->size-1; $i>=0; $i--) { $parity ^= $item->data[$i]; } } } return $parity; } //---------------------------------------------------------------------- public static function checkModeNum($size, $data) { for($i=0; $i<$size; $i++) { if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ return false; } } return true; } //---------------------------------------------------------------------- public static function estimateBitsModeNum($size) { $w = (int)$size / 3; $bits = $w * 10; switch($size - $w * 3) { case 1: $bits += 4; break; case 2: $bits += 7; break; default: break; } return $bits; } //---------------------------------------------------------------------- public static $anTable = array( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ); //---------------------------------------------------------------------- public static function lookAnTable($c) { return (($c > 127)?-1:self::$anTable[$c]); } //---------------------------------------------------------------------- public static function checkModeAn($size, $data) { for($i=0; $i<$size; $i++) { if (self::lookAnTable(ord($data[$i])) == -1) { return false; } } return true; } //---------------------------------------------------------------------- public static function estimateBitsModeAn($size) { $w = (int)($size / 2); $bits = $w * 11; if($size & 1) { $bits += 6; } return $bits; } //---------------------------------------------------------------------- public static function estimateBitsMode8($size) { return $size * 8; } //---------------------------------------------------------------------- public function estimateBitsModeKanji($size) { return (int)(($size / 2) * 13); } //---------------------------------------------------------------------- public static function checkModeKanji($size, $data) { if($size & 1) return false; for($i=0; $i<$size; $i+=2) { $val = (ord($data[$i]) << 8) | ord($data[$i+1]); if( $val < 0x8140 || ($val > 0x9ffc && $val < 0xe040) || $val > 0xebbf) { return false; } } return true; } /*********************************************************************** * Validation **********************************************************************/ public static function check($mode, $size, $data) { if($size <= 0) return false; switch($mode) { case QR_MODE_NUM: return self::checkModeNum($size, $data); break; case QR_MODE_AN: return self::checkModeAn($size, $data); break; case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; case QR_MODE_8: return true; break; case QR_MODE_STRUCTURE: return true; break; default: break; } return false; } //---------------------------------------------------------------------- public function estimateBitStreamSize($version) { $bits = 0; foreach($this->items as $item) { $bits += $item->estimateBitStreamSizeOfEntry($version); } return $bits; } //---------------------------------------------------------------------- public function estimateVersion() { $version = 0; $prev = 0; do { $prev = $version; $bits = $this->estimateBitStreamSize($prev); $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if ($version < 0) { return -1; } } while ($version > $prev); return $version; } //---------------------------------------------------------------------- public static function lengthOfCode($mode, $version, $bits) { $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); switch($mode) { case QR_MODE_NUM: $chunks = (int)($payload / 10); $remain = $payload - $chunks * 10; $size = $chunks * 3; if($remain >= 7) { $size += 2; } else if($remain >= 4) { $size += 1; } break; case QR_MODE_AN: $chunks = (int)($payload / 11); $remain = $payload - $chunks * 11; $size = $chunks * 2; if($remain >= 6) $size++; break; case QR_MODE_8: $size = (int)($payload / 8); break; case QR_MODE_KANJI: $size = (int)(($payload / 13) * 2); break; case QR_MODE_STRUCTURE: $size = (int)($payload / 8); break; default: $size = 0; break; } $maxsize = QRspec::maximumWords($mode, $version); if($size < 0) $size = 0; if($size > $maxsize) $size = $maxsize; return $size; } //---------------------------------------------------------------------- public function createBitStream() { $total = 0; foreach($this->items as $item) { $bits = $item->encodeBitStream($this->version); if($bits < 0) return -1; $total += $bits; } return $total; } //---------------------------------------------------------------------- public function convertData() { $ver = $this->estimateVersion(); if($ver > $this->getVersion()) { $this->setVersion($ver); } for(;;) { $bits = $this->createBitStream(); if($bits < 0) return -1; $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if($ver < 0) { throw new Exception('WRONG VERSION'); return -1; } else if($ver > $this->getVersion()) { $this->setVersion($ver); } else { break; } } return 0; } //---------------------------------------------------------------------- public function appendPaddingBit(&$bstream) { $bits = $bstream->size(); $maxwords = QRspec::getDataLength($this->version, $this->level); $maxbits = $maxwords * 8; if ($maxbits == $bits) { return 0; } if ($maxbits - $bits < 5) { return $bstream->appendNum($maxbits - $bits, 0); } $bits += 4; $words = (int)(($bits + 7) / 8); $padding = new QRbitstream(); $ret = $padding->appendNum($words * 8 - $bits + 4, 0); if($ret < 0) return $ret; $padlen = $maxwords - $words; if($padlen > 0) { $padbuf = array(); for($i=0; $i<$padlen; $i++) { $padbuf[$i] = ($i&1)?0x11:0xec; } $ret = $padding->appendBytes($padlen, $padbuf); if($ret < 0) return $ret; } $ret = $bstream->append($padding); return $ret; } //---------------------------------------------------------------------- public function mergeBitStream() { if($this->convertData() < 0) { return null; } $bstream = new QRbitstream(); foreach($this->items as $item) { $ret = $bstream->append($item->bstream); if($ret < 0) { return null; } } return $bstream; } //---------------------------------------------------------------------- public function getBitStream() { $bstream = $this->mergeBitStream(); if($bstream == null) { return null; } $ret = $this->appendPaddingBit($bstream); if($ret < 0) { return null; } return $bstream; } //---------------------------------------------------------------------- public function getByteStream() { $bstream = $this->getBitStream(); if($bstream == null) { return null; } return $bstream->toByte(); } } //---- qrbitstream.php ----------------------------- /* * PHP QR Code encoder * * Bitstream class * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRbitstream { public $data = array(); //---------------------------------------------------------------------- public function size() { return count($this->data); } //---------------------------------------------------------------------- public function allocate($setLength) { $this->data = array_fill(0, $setLength, 0); return 0; } //---------------------------------------------------------------------- public static function newFromNum($bits, $num) { $bstream = new QRbitstream(); $bstream->allocate($bits); $mask = 1 << ($bits - 1); for($i=0; $i<$bits; $i++) { if($num & $mask) { $bstream->data[$i] = 1; } else { $bstream->data[$i] = 0; } $mask = $mask >> 1; } return $bstream; } //---------------------------------------------------------------------- public static function newFromBytes($size, $data) { $bstream = new QRbitstream(); $bstream->allocate($size * 8); $p=0; for($i=0; $i<$size; $i++) { $mask = 0x80; for($j=0; $j<8; $j++) { if($data[$i] & $mask) { $bstream->data[$p] = 1; } else { $bstream->data[$p] = 0; } $p++; $mask = $mask >> 1; } } return $bstream; } //---------------------------------------------------------------------- public function append(QRbitstream $arg) { if (is_null($arg)) { return -1; } if($arg->size() == 0) { return 0; } if($this->size() == 0) { $this->data = $arg->data; return 0; } $this->data = array_values(array_merge($this->data, $arg->data)); return 0; } //---------------------------------------------------------------------- public function appendNum($bits, $num) { if ($bits == 0) return 0; $b = QRbitstream::newFromNum($bits, $num); if(is_null($b)) return -1; $ret = $this->append($b); unset($b); return $ret; } //---------------------------------------------------------------------- public function appendBytes($size, $data) { if ($size == 0) return 0; $b = QRbitstream::newFromBytes($size, $data); if(is_null($b)) return -1; $ret = $this->append($b); unset($b); return $ret; } //---------------------------------------------------------------------- public function toByte() { $size = $this->size(); if($size == 0) { return array(); } $data = array_fill(0, (int)(($size + 7) / 8), 0); $bytes = (int)($size / 8); $p = 0; for($i=0; $i<$bytes; $i++) { $v = 0; for($j=0; $j<8; $j++) { $v = $v << 1; $v |= $this->data[$p]; $p++; } $data[$i] = $v; } if($size & 7) { $v = 0; for($j=0; $j<($size & 7); $j++) { $v = $v << 1; $v |= $this->data[$p]; $p++; } $data[$bytes] = $v; } return $data; } } //---- qrsplit.php ----------------------------- /* * PHP QR Code encoder * * Input splitting classes * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) * or * "Automatic identification and data capture techniques -- * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRsplit { public $dataStr = ''; public $input; public $modeHint; //---------------------------------------------------------------------- public function __construct($dataStr, $input, $modeHint) { $this->dataStr = $dataStr; $this->input = $input; $this->modeHint = $modeHint; } //---------------------------------------------------------------------- public static function isdigitat($str, $pos) { if ($pos >= strlen($str)) return false; return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); } //---------------------------------------------------------------------- public static function isalnumat($str, $pos) { if ($pos >= strlen($str)) return false; return (QRinput::lookAnTable(ord($str[$pos])) >= 0); } //---------------------------------------------------------------------- public function identifyMode($pos) { if ($pos >= strlen($this->dataStr)) return QR_MODE_NUL; $c = $this->dataStr[$pos]; if(self::isdigitat($this->dataStr, $pos)) { return QR_MODE_NUM; } else if(self::isalnumat($this->dataStr, $pos)) { return QR_MODE_AN; } else if($this->modeHint == QR_MODE_KANJI) { if ($pos+1 < strlen($this->dataStr)) { $d = $this->dataStr[$pos+1]; $word = (ord($c) << 8) | ord($d); if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { return QR_MODE_KANJI; } } } return QR_MODE_8; } //---------------------------------------------------------------------- public function eatNum() { $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 0; while(self::isdigitat($this->dataStr, $p)) { $p++; } $run = $p; $mode = $this->identifyMode($p); if($mode == QR_MODE_8) { $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + QRinput::estimateBitsMode8(1) // + 4 + l8 - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 if($dif > 0) { return $this->eat8(); } } if($mode == QR_MODE_AN) { $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + QRinput::estimateBitsModeAn(1) // + 4 + la - QRinput::estimateBitsModeAn($run + 1);// - 4 - la if($dif > 0) { return $this->eatAn(); } } $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eatAn() { $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 0; while(self::isalnumat($this->dataStr, $p)) { if(self::isdigitat($this->dataStr, $p)) { $q = $p; while(self::isdigitat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - QRinput::estimateBitsModeAn($q); // - 4 - la if($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; if(!self::isalnumat($this->dataStr, $p)) { $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + QRinput::estimateBitsMode8(1) // + 4 + l8 - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 if($dif > 0) { return $this->eat8(); } } $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eatKanji() { $p = 0; while($this->identifyMode($p) == QR_MODE_KANJI) { $p += 2; } $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eat8() { $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 1; $dataStrLen = strlen($this->dataStr); while($p < $dataStrLen) { $mode = $this->identifyMode($p); if($mode == QR_MODE_KANJI) { break; } if($mode == QR_MODE_NUM) { $q = $p; while(self::isdigitat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - QRinput::estimateBitsMode8($q); // - 4 - l8 if($dif < 0) { break; } else { $p = $q; } } else if($mode == QR_MODE_AN) { $q = $p; while(self::isalnumat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + QRinput::estimateBitsModeAn($q - $p) + 4 + $la - QRinput::estimateBitsMode8($q); // - 4 - l8 if($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function splitString() { while (strlen($this->dataStr) > 0) { if($this->dataStr == '') return 0; $mode = $this->identifyMode(0); switch ($mode) { case QR_MODE_NUM: $length = $this->eatNum(); break; case QR_MODE_AN: $length = $this->eatAn(); break; case QR_MODE_KANJI: if ($hint == QR_MODE_KANJI) $length = $this->eatKanji(); else $length = $this->eat8(); break; default: $length = $this->eat8(); break; } if($length == 0) return 0; if($length < 0) return -1; $this->dataStr = substr($this->dataStr, $length); } } //---------------------------------------------------------------------- public function toUpper() { $stringLen = strlen($this->dataStr); $p = 0; while ($p<$stringLen) { $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); if($mode == QR_MODE_KANJI) { $p += 2; } else { if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); } $p++; } } return $this->dataStr; } //---------------------------------------------------------------------- public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) { if(is_null($string) || $string == '\0' || $string == '') { throw new Exception('empty string!!!'); } $split = new QRsplit($string, $input, $modeHint); if(!$casesensitive) $split->toUpper(); return $split->splitString(); } } //---- qrrscode.php ----------------------------- /* * PHP QR Code encoder * * Reed-Solomon error correction support * * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q * (libfec is released under the GNU Lesser General Public License.) * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRrsItem { public $mm; // Bits per symbol public $nn; // Symbols per block (= (1<= $this->nn) { $x -= $this->nn; $x = ($x >> $this->mm) + ($x & $this->nn); } return $x; } //---------------------------------------------------------------------- public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { // Common code for intializing a Reed-Solomon control block (char or int symbols) // Copyright 2004 Phil Karn, KA9Q // May be used under the terms of the GNU Lesser General Public License (LGPL) $rs = null; // Check parameter ranges if($symsize < 0 || $symsize > 8) return $rs; if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding $rs = new QRrsItem(); $rs->mm = $symsize; $rs->nn = (1<<$symsize)-1; $rs->pad = $pad; $rs->alpha_to = array_fill(0, $rs->nn+1, 0); $rs->index_of = array_fill(0, $rs->nn+1, 0); // PHP style macro replacement ;) $NN =& $rs->nn; $A0 =& $NN; // Generate Galois field lookup tables $rs->index_of[0] = $A0; // log(zero) = -inf $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 $sr = 1; for($i=0; $i<$rs->nn; $i++) { $rs->index_of[$sr] = $i; $rs->alpha_to[$i] = $sr; $sr <<= 1; if($sr & (1<<$symsize)) { $sr ^= $gfpoly; } $sr &= $rs->nn; } if($sr != 1){ // field generator polynomial is not primitive! $rs = NULL; return $rs; } /* Form RS code generator polynomial from its roots */ $rs->genpoly = array_fill(0, $nroots+1, 0); $rs->fcr = $fcr; $rs->prim = $prim; $rs->nroots = $nroots; $rs->gfpoly = $gfpoly; /* Find prim-th root of 1, used in decoding */ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) ; // intentional empty-body loop! $rs->iprim = (int)($iprim / $prim); $rs->genpoly[0] = 1; for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { $rs->genpoly[$i+1] = 1; // Multiply rs->genpoly[] by @**(root + x) for ($j = $i; $j > 0; $j--) { if ($rs->genpoly[$j] != 0) { $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; } else { $rs->genpoly[$j] = $rs->genpoly[$j-1]; } } // rs->genpoly[0] can never be zero $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; } // convert rs->genpoly[] to index form for quicker encoding for ($i = 0; $i <= $nroots; $i++) $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; return $rs; } //---------------------------------------------------------------------- public function encode_rs_char($data, &$parity) { $MM =& $this->mm; $NN =& $this->nn; $ALPHA_TO =& $this->alpha_to; $INDEX_OF =& $this->index_of; $GENPOLY =& $this->genpoly; $NROOTS =& $this->nroots; $FCR =& $this->fcr; $PRIM =& $this->prim; $IPRIM =& $this->iprim; $PAD =& $this->pad; $A0 =& $NN; $parity = array_fill(0, $NROOTS, 0); for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; if($feedback != $A0) { // feedback term is non-zero // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must // always be for the polynomials constructed by init_rs() $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); for($j=1;$j<$NROOTS;$j++) { $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; } } // Shift array_shift($parity); if($feedback != $A0) { array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); } else { array_push($parity, 0); } } } } //########################################################################## class QRrs { public static $items = array(); //---------------------------------------------------------------------- public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { foreach(self::$items as $rs) { if($rs->pad != $pad) continue; if($rs->nroots != $nroots) continue; if($rs->mm != $symsize) continue; if($rs->gfpoly != $gfpoly) continue; if($rs->fcr != $fcr) continue; if($rs->prim != $prim) continue; return $rs; } $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); array_unshift(self::$items, $rs); return $rs; } } //---- qrmask.php ----------------------------- /* * PHP QR Code encoder * * Masking * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('N1', 3); define('N2', 3); define('N3', 40); define('N4', 10); class QRmask { public $runLength = array(); //---------------------------------------------------------------------- public function __construct() { $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); } //---------------------------------------------------------------------- public function writeFormatInformation($width, &$frame, $mask, $level) { $blacks = 0; $format = QRspec::getFormatInfo($mask, $level); for($i=0; $i<8; $i++) { if($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[8][$width - 1 - $i] = chr($v); if($i < 6) { $frame[$i][8] = chr($v); } else { $frame[$i + 1][8] = chr($v); } $format = $format >> 1; } for($i=0; $i<7; $i++) { if($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[$width - 7 + $i][8] = chr($v); if($i == 0) { $frame[8][7] = chr($v); } else { $frame[8][6 - $i] = chr($v); } $format = $format >> 1; } return $blacks; } //---------------------------------------------------------------------- public function mask0($x, $y) { return ($x+$y)&1; } public function mask1($x, $y) { return ($y&1); } public function mask2($x, $y) { return ($x%3); } public function mask3($x, $y) { return ($x+$y)%3; } public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } //---------------------------------------------------------------------- private function generateMaskNo($maskNo, $width, $frame) { $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); for($y=0; $y<$width; $y++) { for($x=0; $x<$width; $x++) { if(ord($frame[$y][$x]) & 0x80) { $bitMask[$y][$x] = 0; } else { $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); $bitMask[$y][$x] = ($maskFunc == 0)?1:0; } } } return $bitMask; } //---------------------------------------------------------------------- public static function serial($bitFrame) { $codeArr = array(); foreach ($bitFrame as $line) $codeArr[] = join('', $line); return gzcompress(join("\n", $codeArr), 9); } //---------------------------------------------------------------------- public static function unserial($code) { $codeArr = array(); $codeLines = explode("\n", gzuncompress($code)); foreach ($codeLines as $line) $codeArr[] = str_split($line); return $codeArr; } //---------------------------------------------------------------------- public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) { $b = 0; $bitMask = array(); $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; if (QR_CACHEABLE) { if (file_exists($fileName)) { $bitMask = self::unserial(file_get_contents($fileName)); } else { $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) mkdir(QR_CACHE_DIR.'mask_'.$maskNo); file_put_contents($fileName, self::serial($bitMask)); } } else { $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); } if ($maskGenOnly) return; $d = $s; for($y=0; $y<$width; $y++) { for($x=0; $x<$width; $x++) { if($bitMask[$y][$x] == 1) { $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); } $b += (int)(ord($d[$y][$x]) & 1); } } return $b; } //---------------------------------------------------------------------- public function makeMask($width, $frame, $maskNo, $level) { $masked = array_fill(0, $width, str_repeat("\0", $width)); $this->makeMaskNo($maskNo, $width, $frame, $masked); $this->writeFormatInformation($width, $masked, $maskNo, $level); return $masked; } //---------------------------------------------------------------------- public function calcN1N3($length) { $demerit = 0; for($i=0; $i<$length; $i++) { if($this->runLength[$i] >= 5) { $demerit += (N1 + ($this->runLength[$i] - 5)); } if($i & 1) { if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { $fact = (int)($this->runLength[$i] / 3); if(($this->runLength[$i-2] == $fact) && ($this->runLength[$i-1] == $fact) && ($this->runLength[$i+1] == $fact) && ($this->runLength[$i+2] == $fact)) { if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { $demerit += N3; } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { $demerit += N3; } } } } } return $demerit; } //---------------------------------------------------------------------- public function evaluateSymbol($width, $frame) { $head = 0; $demerit = 0; for($y=0; $y<$width; $y++) { $head = 0; $this->runLength[0] = 1; $frameY = $frame[$y]; if ($y>0) $frameYM = $frame[$y-1]; for($x=0; $x<$width; $x++) { if(($x > 0) && ($y > 0)) { $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); if(($b22 | ($w22 ^ 1))&1) { $demerit += N2; } } if(($x == 0) && (ord($frameY[$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } else if($x > 0) { if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } for($x=0; $x<$width; $x++) { $head = 0; $this->runLength[0] = 1; for($y=0; $y<$width; $y++) { if($y == 0 && (ord($frame[$y][$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } else if($y > 0) { if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } return $demerit; } //---------------------------------------------------------------------- public function mask($width, $frame, $level) { $minDemerit = PHP_INT_MAX; $bestMaskNum = 0; $bestMask = array(); $checked_masks = array(0,1,2,3,4,5,6,7); if (QR_FIND_FROM_RANDOM !== false) { $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); for ($i = 0; $i < $howManuOut; $i++) { $remPos = rand (0, count($checked_masks)-1); unset($checked_masks[$remPos]); $checked_masks = array_values($checked_masks); } } $bestMask = $frame; foreach($checked_masks as $i) { $mask = array_fill(0, $width, str_repeat("\0", $width)); $demerit = 0; $blacks = 0; $blacks = $this->makeMaskNo($i, $width, $frame, $mask); $blacks += $this->writeFormatInformation($width, $mask, $i, $level); $blacks = (int)(100 * $blacks / ($width * $width)); $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); $demerit += $this->evaluateSymbol($width, $mask); if($demerit < $minDemerit) { $minDemerit = $demerit; $bestMask = $mask; $bestMaskNum = $i; } } return $bestMask; } //---------------------------------------------------------------------- } //---- qrencode.php ----------------------------- /* * PHP QR Code encoder * * Main encoder classes. * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRrsblock { public $dataLength; public $data = array(); public $eccLength; public $ecc = array(); public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) { $rs->encode_rs_char($data, $ecc); $this->dataLength = $dl; $this->data = $data; $this->eccLength = $el; $this->ecc = $ecc; } }; //########################################################################## class QRrawcode { public $version; public $datacode = array(); public $ecccode = array(); public $blocks; public $rsblocks = array(); //of RSblock public $count; public $dataLength; public $eccLength; public $b1; //---------------------------------------------------------------------- public function __construct(QRinput $input) { $spec = array(0,0,0,0,0); $this->datacode = $input->getByteStream(); if(is_null($this->datacode)) { throw new Exception('null imput string'); } QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); $this->version = $input->getVersion(); $this->b1 = QRspec::rsBlockNum1($spec); $this->dataLength = QRspec::rsDataLength($spec); $this->eccLength = QRspec::rsEccLength($spec); $this->ecccode = array_fill(0, $this->eccLength, 0); $this->blocks = QRspec::rsBlockNum($spec); $ret = $this->init($spec); if($ret < 0) { throw new Exception('block alloc error'); return null; } $this->count = 0; } //---------------------------------------------------------------------- public function init(array $spec) { $dl = QRspec::rsDataCodes1($spec); $el = QRspec::rsEccCodes1($spec); $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); $blockNo = 0; $dataPos = 0; $eccPos = 0; for($i=0; $iecccode,$eccPos); $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } if(QRspec::rsBlockNum2($spec) == 0) return 0; $dl = QRspec::rsDataCodes2($spec); $el = QRspec::rsEccCodes2($spec); $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); if($rs == NULL) return -1; for($i=0; $iecccode,$eccPos); $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } return 0; } //---------------------------------------------------------------------- public function getCode() { $ret; if($this->count < $this->dataLength) { $row = $this->count % $this->blocks; $col = $this->count / $this->blocks; if($col >= $this->rsblocks[0]->dataLength) { $row += $this->b1; } $ret = $this->rsblocks[$row]->data[$col]; } else if($this->count < $this->dataLength + $this->eccLength) { $row = ($this->count - $this->dataLength) % $this->blocks; $col = ($this->count - $this->dataLength) / $this->blocks; $ret = $this->rsblocks[$row]->ecc[$col]; } else { return 0; } $this->count++; return $ret; } } //########################################################################## class QRcode { public $version; public $width; public $data; //---------------------------------------------------------------------- public function encodeMask(QRinput $input, $mask) { if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { throw new Exception('wrong version'); } if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { throw new Exception('wrong level'); } $raw = new QRrawcode($input); QRtools::markTime('after_raw'); $version = $raw->version; $width = QRspec::getWidth($version); $frame = QRspec::newFrame($version); $filler = new FrameFiller($width, $frame); if(is_null($filler)) { return NULL; } // inteleaved data and ecc codes for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { $code = $raw->getCode(); $bit = 0x80; for($j=0; $j<8; $j++) { $addr = $filler->next(); $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); $bit = $bit >> 1; } } QRtools::markTime('after_filler'); unset($raw); // remainder bits $j = QRspec::getRemainder($version); for($i=0; $i<$j; $i++) { $addr = $filler->next(); $filler->setFrameAt($addr, 0x02); } $frame = $filler->frame; unset($filler); // masking $maskObj = new QRmask(); if($mask < 0) { if (QR_FIND_BEST_MASK) { $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); } else { $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); } } else { $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); } if($masked == NULL) { return NULL; } QRtools::markTime('after_mask'); $this->version = $version; $this->width = $width; $this->data = $masked; return $this; } //---------------------------------------------------------------------- public function encodeInput(QRinput $input) { return $this->encodeMask($input, -1); } //---------------------------------------------------------------------- public function encodeString8bit($string, $version, $level) { if(string == NULL) { throw new Exception('empty string!'); return NULL; } $input = new QRinput($version, $level); if($input == NULL) return NULL; $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); if($ret < 0) { unset($input); return NULL; } return $this->encodeInput($input); } //---------------------------------------------------------------------- public function encodeString($string, $version, $level, $hint, $casesensitive) { if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { throw new Exception('bad hint'); return NULL; } $input = new QRinput($version, $level); if($input == NULL) return NULL; $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); if($ret < 0) { return NULL; } return $this->encodeInput($input); } //---------------------------------------------------------------------- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) { $enc = QRencode::factory($level, $size, $margin); return $enc->encodePNG($text, $outfile, $saveandprint=false); } //---------------------------------------------------------------------- public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = QRencode::factory($level, $size, $margin); return $enc->encode($text, $outfile); } //---------------------------------------------------------------------- public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = QRencode::factory($level, $size, $margin); return $enc->encodeRAW($text, $outfile); } } //########################################################################## class FrameFiller { public $width; public $frame; public $x; public $y; public $dir; public $bit; //---------------------------------------------------------------------- public function __construct($width, &$frame) { $this->width = $width; $this->frame = $frame; $this->x = $width - 1; $this->y = $width - 1; $this->dir = -1; $this->bit = -1; } //---------------------------------------------------------------------- public function setFrameAt($at, $val) { $this->frame[$at['y']][$at['x']] = chr($val); } //---------------------------------------------------------------------- public function getFrameAt($at) { return ord($this->frame[$at['y']][$at['x']]); } //---------------------------------------------------------------------- public function next() { do { if($this->bit == -1) { $this->bit = 0; return array('x'=>$this->x, 'y'=>$this->y); } $x = $this->x; $y = $this->y; $w = $this->width; if($this->bit == 0) { $x--; $this->bit++; } else { $x++; $y += $this->dir; $this->bit--; } if($this->dir < 0) { if($y < 0) { $y = 0; $x -= 2; $this->dir = 1; if($x == 6) { $x--; $y = 9; } } } else { if($y == $w) { $y = $w - 1; $x -= 2; $this->dir = -1; if($x == 6) { $x--; $y -= 8; } } } if($x < 0 || $y < 0) return null; $this->x = $x; $this->y = $y; } while(ord($this->frame[$y][$x]) & 0x80); return array('x'=>$x, 'y'=>$y); } } ; //########################################################################## class QRencode { public $casesensitive = true; public $eightbit = false; public $version = 0; public $size = 3; public $margin = 4; public $structured = 0; // not supported yet public $level = QR_ECLEVEL_L; public $hint = QR_MODE_8; //---------------------------------------------------------------------- public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = new QRencode(); $enc->size = $size; $enc->margin = $margin; switch ($level.'') { case '0': case '1': case '2': case '3': $enc->level = $level; break; case 'l': case 'L': $enc->level = QR_ECLEVEL_L; break; case 'm': case 'M': $enc->level = QR_ECLEVEL_M; break; case 'q': case 'Q': $enc->level = QR_ECLEVEL_Q; break; case 'h': case 'H': $enc->level = QR_ECLEVEL_H; break; } return $enc; } //---------------------------------------------------------------------- public function encodeRAW($intext, $outfile = false) { $code = new QRcode(); if($this->eightbit) { $code->encodeString8bit($intext, $this->version, $this->level); } else { $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); } return $code->data; } //---------------------------------------------------------------------- public function encode($intext, $outfile = false) { $code = new QRcode(); if($this->eightbit) { $code->encodeString8bit($intext, $this->version, $this->level); } else { $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); } QRtools::markTime('after_encode'); if ($outfile!== false) { file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); } else { return QRtools::binarize($code->data); } } //---------------------------------------------------------------------- public function encodePNG($intext, $outfile = false,$saveandprint=false) { try { ob_start(); $tab = $this->encode($intext); $err = ob_get_contents(); ob_end_clean(); if ($err != '') QRtools::log($outfile, $err); $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); } catch (Exception $e) { QRtools::log($outfile, $e->getMessage()); } } } ================================================ FILE: frphp/extend/pinyin.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/02 // +---------------------------------------------------------------------- namespace frphp; // 框架根目录 defined('CORE_PATH') or define('CORE_PATH', __DIR__); // 内核版本信息 const FrPHP_VERSION = '2.1'; /** * FrPHP框架核心 */ class frphp { // 配置内容 protected $config = []; public function __construct($config) { $this->config = $config; //引入系统配置 //定义全局常量 $MyConfig = require(CORE_PATH.'/common/Config.php'); defined('APP_DEBUG') or define('APP_DEBUG', isset($config['APP_DEBUG']) ? $config['APP_DEBUG'] : $MyConfig['APP_DEBUG']); defined('Tpl_style') or define('Tpl_style', isset($config['Tpl_style']) ? $config['Tpl_style'] : $MyConfig['Tpl_style']); defined('Tpl_common') or define('Tpl_common', isset($config['Tpl_common']) ? $config['Tpl_common'] : $MyConfig['Tpl_common']); defined('Tpl_template') or define('Tpl_template', isset($config['Tpl_template']) ? $config['Tpl_template'] : $MyConfig['Tpl_template']); defined('APP_HOME') or define('APP_HOME', isset($config['APP_HOME']) ? $config['APP_HOME'] : $MyConfig['APP_HOME']); defined('HOME_MODEL') or define('HOME_MODEL', isset($config['HOME_MODEL']) ? $config['HOME_MODEL'] : $MyConfig['HOME_MODEL']); defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', isset($config['HOME_CONTROLLER']) ? $config['HOME_CONTROLLER'] : $MyConfig['HOME_CONTROLLER']); defined('HOME_VIEW') or define('HOME_VIEW', isset($config['HOME_VIEW']) ? $config['HOME_VIEW'] : $MyConfig['HOME_VIEW']); defined('File_TXT') or define('File_TXT', isset($config['File_TXT']) ? $config['File_TXT'] : $MyConfig['File_TXT']); defined('SessionTime') or define('SessionTime', isset($config['SessionTime']) ? $config['SessionTime'] : $MyConfig['SessionTime']); defined('StopLog') or define('StopLog', isset($config['StopLog']) ? $config['StopLog'] : $MyConfig['StopLog']); defined('DefaultController') or define('DefaultController', isset($config['DefaultController']) ? $config['DefaultController'] : $MyConfig['DefaultController']); defined('DefaultAction') or define('DefaultAction', isset($config['DefaultAction']) ? $config['DefaultAction'] : $MyConfig['DefaultAction']); defined('open_url_route') or define('open_url_route', isset($config['open_url_route']) ? $config['open_url_route'] : $MyConfig['open_url_route']); defined('open_redis_session') or define('open_redis_session', isset($config['open_redis_session']) ? $config['open_redis_session'] : $MyConfig['open_redis_session']); defined('Cache_Path') or define('Cache_Path', isset($config['Cache_Path']) ? $config['Cache_Path'] : $MyConfig['Cache_Path']); defined('Session_Path') or define('Session_Path', isset($config['Session_Path']) ? $config['Session_Path'] : $MyConfig['Session_Path']); defined('APP_LANG') or define('APP_LANG', isset($config['APP_LANG']) ? $config['APP_LANG'] : $MyConfig['APP_LANG']); defined('APP_LANG_REQUREST') or define('APP_LANG_REQUREST', isset($config['APP_LANG_REQUREST']) ? $config['APP_LANG_REQUREST'] : $MyConfig['APP_LANG_REQUREST']); defined('ROOT') or define('ROOT', isset($config['ROOT']) ? $config['ROOT'] : $MyConfig['ROOT']); defined('File_TXT_HIDE') or define('File_TXT_HIDE', isset($config['File_TXT_HIDE']) ? $config['File_TXT_HIDE'] : $MyConfig['File_TXT_HIDE']); defined('CLASS_HIDE_SLASH') or define('CLASS_HIDE_SLASH', isset($config['CLASS_HIDE_SLASH']) ? $config['CLASS_HIDE_SLASH'] : $MyConfig['CLASS_HIDE_SLASH']); //引入系统函数 require(CORE_PATH.'/common/Functions.php'); //引入项目函数 $ext_fun = APP_PATH.'conf/Functions.php'; if(file_exists($ext_fun)){ require($ext_fun); } //引入扩展函数 $Extend = scandir(CORE_PATH.'/extend'); //var_dump($Extend); foreach($Extend as $v){ if(strpos($v,'.php')!==false){ include CORE_PATH.'/extend/'.$v; } } //检查缓存文件是否存在 if(!is_dir(Cache_Path)){ mkdir(Cache_Path); } if(!is_dir(Cache_Path.'/tmp')){ mkdir(Cache_Path.'/tmp'); } //设置时区 @date_default_timezone_set('PRC'); } // 运行程序 public function run() { spl_autoload_register(array($this, 'loadClass')); $this->setDbConfig(); $this->setReporting(); $this->removeMagicQuotes(); //$this->unregisterGlobals(); $this->route(); } // 路由处理 public function route() { //读取系统配置 $webconfig = getCache('webconfig'); if( !isset($webconfig['closesession']) || (isset($webconfig['closesession']) && $webconfig['closesession']==0) || APP_HOME=='app/admin'){ //检查是否开启redis_session ---2019/09/05 留恋风 if(open_redis_session || (isset($webconfig['openredis']) && $webconfig['openredis'])){ $session = new \SessionRedis($this->config['redis']); session_set_save_handler($session,true); if (!isset($_COOKIE['PHPSESSID'])) { session_set_cookie_params($this->config['redis']['EXPIRE']); if(!session_id()){ session_start();} } else { if(!session_id()){ session_start();} setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + $this->config['redis']['EXPIRE'],'/',"","",true); } //全局Redis $redis = new \Redis(); $redis->connect($this->config['redis']['HOST'],$this->config['redis']['PORT']); if($this->config['redis']['AUTH']){ $redis->auth($this->config['redis']['AUTH']); } $GLOBALS['Redis'] = $redis; if(!$GLOBALS['Redis']){ exit('请检查Redis配置是否正确!'); } }else{ //开启SESSION,并设置600s缓存时间 start_session(SessionTime); $session = new \FrSession(array('save_path'=>Session_Path,'life_time'=>SessionTime)); session_set_save_handler($session,true); if (!isset($_COOKIE['PHPSESSID'])) { session_set_cookie_params(SessionTime); if(!session_id()){ session_start();} } else { if(!session_id()){ session_start();} setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() + SessionTime,'/',"","",true); } } } if(isset($_SERVER['argv']) && !isset($_SERVER['REQUEST_URI'])){ $url = urldecode($_SERVER['argv'][1]); }else{ $url = urldecode($_SERVER['REQUEST_URI']); } //读取系统配置 $webconfig = getCache('webconfig'); if(!$webconfig){ $wcf = M('sysconfig')->findAll(); $webconfig = array(); foreach($wcf as $k=>$v){ if($v['field']=='web_js' || $v['field']=='ueditor_config'){ $v['data'] = html_decode($v['data']); } $webconfig[$v['field']] = $v['data']; } setCache('webconfig',$webconfig); } if($webconfig){ if($webconfig['iswap']==1){ $webconfig['mobile_html'] = $webconfig['mobile_html']=='' ? '/' : $webconfig['mobile_html']; $url = str_replace('/'.$webconfig['mobile_html'].'/','/',$url); } $url = str_replace('/'.$webconfig['pc_html'].'/','/',$url); } //引入自定义路由 $route_ok = false; $method = ''; if(open_url_route){ $open_url_route = include (APP_PATH.'conf/route.php'); $urls = ''; foreach($open_url_route as $k=>$v){ if($v!='' && $v[0]!='' && $v[1]!=''){ $route_ok = preg_match_all($v[0],$url,$matches); $urls = $v[1]; $method = strtoupper($v[2]); if($route_ok){ break; } } } if($route_ok){ //print_r($matches); foreach($matches as $k=>$v){ $urls = str_replace('$'.$k,$v[0],$urls); } $url = $urls; } $position = strpos($url,'?'); if($position!==false){ $param = substr($url,$position+1); parse_str($param,$_GET); } }else{ $open_url_route = []; } //去除二级目录 $url = str_replace(ROOT,'/',$url); $url = format_param($url,6); define('REQUEST_URI',$url); $controllerName = DefaultController; $actionName = DefaultAction; $param = array(); $tpl = get_template(); define('TEMPLATE',$tpl); // 清除?之后的内容 $position = strpos($url, '?'); $url = $position === false ? $url : substr($url, 0, $position); //删除入口文件字符串 if(stripos($url,'.php')!==false){ //获取入口文件 $ds = stripos($url,'.php'); if(stripos($url,ADMIN_MODEL)!==false){ define('APP_URL',substr($url,0,($ds+4)).'/'.ADMIN_MODEL); $url = str_replace(ADMIN_MODEL,'',$url); }else{ define('APP_URL',substr($url,0,($ds+4))); } $url = substr(strstr($url,'.php'),4); }else{ define('APP_URL','/index.php'); } //去除最后的.html后缀 if(stripos($url,'.html')!==false){ $url = str_ireplace('.html','',$url); } // 删除前后的“/” $url = trim($url, '/'); if ($url){ // 使用“/”分割字符串,并保存在数组中 $urlArray = explode('/', $url); // 删除空的数组元素 //$urlArray = array_filter($urlArray); foreach($urlArray as $k=>$v){ if($v!=''){ $urlArray[$k] = $v; } } // 获取控制器名 $controllerName = ucfirst($urlArray[0]); // 获取动作名 array_shift($urlArray); $actionName = $urlArray ? $urlArray[0] : $actionName; // 获取URL参数 array_shift($urlArray); $param = $urlArray ? $urlArray : array(); } // 判断插件中是否存在控制器和操作--2019/2/15 by 留恋风 $app_home = str_replace('/','\\',APP_HOME); $controller = $app_home.'\\plugins\\'. $controllerName . 'Controller'; if (!class_exists($controller) || !method_exists($controller, $actionName)) { // 不存在插件,则进入系统默认控制器 // 判断控制器和操作是否存在 $controller = $app_home.'\\'.HOME_CONTROLLER.'\\'. $controllerName . 'Controller'; if (!class_exists($controller)) { $controllerName = 'Home'; $controller = $app_home.'\\'.HOME_CONTROLLER.'\\HomeController'; } //规定前台数据统一到jizhi里面处理 if(APP_URL=='/index.php'){ if (!method_exists($controller, $actionName)) { $actionName = 'jizhi'; //Error_msg('方法不存在!'); } }else{ if (!method_exists($controller, $actionName)) { Error_msg('方法不存在!'); } } if($controllerName=='Home' && $actionName=='jizhi'){ if(method_exists($app_home.'\\plugins\\HomeController', 'jizhi')){ $controller = $app_home.'\\plugins\\HomeController'; $actionName = 'jizhi'; } } } //定义全局控制器及方法常量 define('APP_CONTROLLER',$controllerName); define('APP_ACTION',$actionName); if(open_url_route && $route_ok){ switch($method){ case 'GET': $param = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET; break; case 'POST': $param = $_POST; break; default: //Error_msg('路由配置错误!传输方式未填写或者不正确!请检查Conf/route.php'); $_GET = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET; $param = (count($_GET)>0) ? array_merge($_GET,$_REQUEST) : $_REQUEST; break; } }else{ $_GET = (count($this->stringGet($param))>0) ? array_merge($this->stringGet($param),$_GET) : $_GET; $param = (count($_GET)>0) ? array_merge($_GET,$_REQUEST) : $_REQUEST; } //读Hook数据缓存 $hookconfig = getCache('hook'); if(!$hookconfig){ //Hook插件注册--缓存整个插件表数据 $hookconfig = M('hook')->findAll(array('isopen'=>1),'orders desc'); setCache('hook',$hookconfig); } if($hookconfig){ foreach($hookconfig as $v){ if("app\\".$v['module']==$app_home && $v['controller']==APP_CONTROLLER && (strpos(','.$v['action'].',',','.APP_ACTION.',')!==false || $v['all_action']==1)){ $newhook_controller = '\\app\\'.$v['module'].'\\plugins\\'.$v['hook_controller'].'Controller'; if(class_exists($newhook_controller)){ $newhook = new $newhook_controller($param); $hook_action = $v['hook_action']; $newhook->$hook_action($param); $newhook = null; } } } } $dispatch = new $controller($param); $dispatch->$actionName($param); } //将链接参数转为GET传值 public function stringGet($urlarray){ $data = array(); foreach($urlarray as $k=>$v){ if(($k+1)%2==1){ if(!isset($urlarray[$k+1])){$urlarray[$k+1]=null;} $data[$v] = $urlarray[$k+1]; } } return $data; } // 检测开发环境 public function setReporting() { ini_set("session.cookie_httponly", 1); if (APP_DEBUG === true) { //error_reporting(E_ALL); error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING & ~E_DEPRECATED); ini_set('display_errors','On'); } else { error_reporting(0); ini_set('display_errors','Off'); ini_set('log_errors', 'On'); } } // 删除敏感字符 public function stripSlashesDeep($value) { $value = is_array($value) ? array_map(array($this, 'stripSlashesDeep'), $value) : stripslashes($value); return $value; } // 检测敏感字符并删除 public function removeMagicQuotes() { $_GET = isset($_GET) ? $this->stripSlashesDeep($_GET ) : ''; $_POST = isset($_POST) ? $this->stripSlashesDeep($_POST ) : ''; $_COOKIE = isset($_COOKIE) ? $this->stripSlashesDeep($_COOKIE) : ''; $_SESSION = isset($_SESSION) ? $this->stripSlashesDeep($_SESSION) : ''; } // 检测自定义全局变量并移除。因为 register_globals 已经弃用,如果 // 已经弃用的 register_globals 指令被设置为 on,那么局部变量也将 // 在脚本的全局作用域中可用。 例如, $_POST['foo'] 也将以 $foo 的 // 形式存在,这样写是不好的实现,会影响代码中的其他变量。 相关信息, // 参考: http://php.net/manual/zh/faq.using.php#faq.register-globals public function unregisterGlobals() { if (ini_get('register_globals')) { $array = array('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES'); foreach ($array as $value) { foreach ($GLOBALS[$value] as $key => $var) { if ($var === $GLOBALS[$key]) { unset($GLOBALS[$key]); } } } } } // 配置数据库信息 public function setDbConfig() { if ($this->config['db']) { define('DB_HOST', $this->config['db']['host']); define('DB_NAME', $this->config['db']['dbname']); define('DB_PREFIX', $this->config['db']['prefix']); define('DB_USER', $this->config['db']['username']); define('DB_PASS', $this->config['db']['password']); define('DB_PORT', $this->config['db']['port']); if(DB_HOST=='' || DB_NAME=='' || DB_USER=='' || DB_PASS==''){ exit('数据库无法链接,如果您是第一次使用,请先执行安装程序

    极致CMS建站程序 jizhicms.com'); } } } // 自动加载类 public function loadClass($className) { $classMap = $this->classMap(); if (isset($classMap[$className])) { // 包含内核文件 $file = $classMap[$className]; } elseif (strpos($className, '\\') !== false) { // 包含应用(application目录)文件 $file = APP_PATH . str_replace('\\', '/', $className) . '.php'; if (!is_file($file)) { return; } } else { return; } include $file; // 这里可以加入判断,如果名为$className的类、接口或者性状不存在,则在调试模式下抛出错误 } // 内核文件命名空间映射关系 protected function classMap() { return [ 'frphp\lib\Controller' => CORE_PATH . '/lib/Controller.php', 'frphp\lib\Model' => CORE_PATH . '/lib/Model.php', 'frphp\lib\View' => CORE_PATH . '/lib/View.php', 'frphp\db\DBholder' => CORE_PATH . '/db/DBholder.php', ]; } } // 加载配置文件 $config = require(APP_PATH . 'conf/config.php'); $url = urldecode($_SERVER['REQUEST_URI']); defined('ADMIN_MODEL') or define('ADMIN_MODEL', 'admins'); //判断是否后台入口 if(strpos($url,'/index.php/'.ADMIN_MODEL)!==false || (defined('APP_HOME') && APP_HOME=='app/admin')){ //后台 //定义项目目录 defined('APP_HOME') or define('APP_HOME', 'app/admin'); //定义项目模板文件目录 defined('HOME_VIEW') or define('HOME_VIEW', 't'); defined('Tpl_template') or define('Tpl_template', 'tpl'); //定义项目控制器文件目录 defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', 'c'); //定义项目模型文件目录 defined('HOME_MODEL') or define('HOME_MODEL', 'm'); //定义项目默认方法 defined('DefaultController') or define('DefaultController', 'Index'); defined('DefaultAction') or define('DefaultAction', 'index'); //定义静态文件路径 defined('Tpl_style') or define('Tpl_style', '/app/admin/t/tpl'); }else{ //前台 //定义项目目录 defined('APP_HOME') or define('APP_HOME', 'app/home'); //定义模板文件夹 defined('TPL_PATH') or define('TPL_PATH', 'static'); //定义项目模板文件目录 defined('HOME_VIEW') or define('HOME_VIEW', ''); //定义项目模板公共文件目录 defined('Tpl_common') or define('Tpl_common', ''); //定义项目控制器文件目录 defined('HOME_CONTROLLER') or define('HOME_CONTROLLER', 'c'); //定义项目模型文件目录 defined('HOME_MODEL') or define('HOME_MODEL', 'm'); //定义模板文件后缀 defined('File_TXT') or define('File_TXT', '.php'); //定义项目默认方法 defined('DefaultAction') or define('DefaultAction', 'jizhi'); //定义静态文件路径 defined('Tpl_style') or define('Tpl_style', '/static/'); } header_remove('X-Powered-By'); //实例化核心类 (new frphp($config))->run(); ================================================ FILE: frphp/lib/Controller.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/02 // +---------------------------------------------------------------------- namespace frphp\lib; /** * 控制器基类 */ class Controller { protected $_controller; protected $_action; protected $_view; protected $_data; // 构造函数,初始化属性,并实例化对应模型 public function __construct($param=null) { $this->_controller = APP_CONTROLLER; $this->_action = APP_ACTION; $this->_data = $param; //对语言包获取优先处理 if(!empty($_REQUEST) && isset($_REQUEST[APP_LANG_REQUREST])){ $_SESSION['lang'] = $_REQUEST[APP_LANG_REQUREST]; define('LANG',$_SESSION['lang']); }else if(isset($_SESSION['lang'])){ define('LANG',$_SESSION['lang']); }else{ define('LANG',APP_LANG); } $this->_view = new View(APP_CONTROLLER, APP_ACTION); $this->_init(); } // 自动调用方法 public function _init(){ } // 分配变量 public function __set($name, $value) { $this->$name = $value; $this->_view->assign($name, $value); } public function assign($name, $value) { $this->_view->assign($name, $value); } // 渲染视图 public function display($name=null) { $this->_view->render($name); } // 获取URL参数值 public function frparam($str=null, $int=0,$default = FALSE, $method = null){ $data = $this->_data; if($str===null) return $data; if(!array_key_exists($str,$data)){ return ($default===FALSE)?false:$default; } if($method===null){ $value = $data[$str]; }else{ $method = strtolower($method); switch($method){ case 'get': $value = $_GET[$str]; break; case 'post': $value = $_POST[$str]; break; case 'cookie': $value = $_COOKIE[$str]; break; } } return format_param($value,$int,$default); } } ================================================ FILE: frphp/lib/Model.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/03/15 // +---------------------------------------------------------------------- namespace frphp\lib; use frphp\db\DBholder; use PDO; class Model { protected $model; protected static $table; protected $primary = 'id'; private $db; private static $instance=false;//不支持单例模式 public function __construct(){ $this->db = DBholder::getInstance(); } public static function getInstance($table = null,$prefix = 1){ if(self::$instance===false){ self::$instance = new self($table); } if($table!=null){ self::$table = $table; } if($prefix){ self::$table = DB_PREFIX.strtolower(self::$table); }else{ self::$table = self::$table; } return self::$instance; } //查询数据条数 public function getCount($conditions=null){ $where = ''; if(is_array($conditions)){ $conditions = $this->__prepera_format($conditions); $join = array(); foreach( $conditions as $key => $value ){ if(is_array($value)){ $va = '\''.$value[1].'\''; $join[] = "{$key} ".$value[0]." {$va}"; }else{ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } } if(count($join)){ $where = "WHERE ".join(" AND ",$join); } }else{ if(null != $conditions) $where = "WHERE ".$conditions; } $table = self::$table; $sql = "SELECT count(*) as Frcount FROM {$table} {$where}"; $result = $this->db->getArray($sql); return $result[0]['Frcount']; } //递增数据 public function goInc($conditions,$field,$vp=1){ $where = ""; if(is_array($conditions)){ $conditions = $this->__prepera_format($conditions); $join = array(); foreach( $conditions as $key => $value ){ if(is_array($value)){ $va = '\''.$value[1].'\''; $join[] = "{$key} ".$value[0]." {$va}"; }else{ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } } if(count($join)){ $where = "WHERE ".join(" AND ",$join); } }else{ if(null != $conditions)$where = "WHERE ".$conditions; } $values = "{$field} = {$field} + {$vp}"; $table = self::$table; $sql = "UPDATE {$table} SET {$values} {$where}"; return $this->runSql($sql); } //递减 public function goDec($conditions,$field,$vp=1){ return $this->goInc($conditions,$field,-$vp); } // 修改数据 public function update($conditions=null,$row=null) { $where = ""; $row = $this->__prepera_format($row); if(empty($row))return FALSE; if(is_array($conditions)){ $conditions = $this->__prepera_format($conditions); $join = array(); foreach( $conditions as $key => $value ){ if(is_array($value)){ $va = '\''.$value[1].'\''; $join[] = "{$key} ".$value[0]." {$va}"; }else{ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } } if(count($join)){ $where = "WHERE ".join(" AND ",$join); } }else{ if(null != $conditions)$where = "WHERE ".$conditions; } foreach($row as $key => $value){ if($value!==null){ $value = '\''.$value.'\''; $vals[] = "{$key} = {$value}"; }else{ $vals[] = "{$key} = null"; } } $values = join(", ",$vals); $table = self::$table; $sql = "UPDATE {$table} SET {$values} {$where}"; return $this->runSql($sql); } public function updateMuti($conditions=null,$rows=null){ if(count($conditions)!=count($rows)){ throw new Exception('数组不匹配'); return false; } $whereArr = []; foreach($conditions as $condition){ if(is_array($condition)){ $condition = $this->__prepera_format($condition); $join = array(); foreach( $condition as $key => $value ){ if(is_array($value)){ $va = '\''.$value[1].'\''; $join[] = "{$key} ".$value[0]." {$va}"; }else{ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } } if(count($join)){ $where = "WHERE ".join(" AND ",$join); } }else{ if(null != $condition)$where = "WHERE ".$condition; } $whereArr[] = $where; } $valuesArr = []; foreach($rows as $row){ $row = $this->__prepera_format($row); if(!empty($row)){ foreach($row as $key => $value){ if($value!==null){ $value = '\''.$value.'\''; $vals[] = "{$key} = {$value}"; }else{ $vals[] = "{$key} = null"; } } $values = join(", ",$vals); $valuesArr[]=$values; } } if(count($whereArr)!=count($valuesArr)){ throw new Exception('数组不匹配'); return false; } $sqlArr=[]; $table = self::$table; foreach($whereArr as $k=>$where){ $sqlArr[] = "UPDATE {$table} SET {$valuesArr[$k]} {$where};"; } $sql=implode('',$sqlArr); return $this->runSql($sql); } // 查询所有 public function findAll($conditions=null,$order=null,$fields=null,$limit=null) { $where = ''; if(is_array($conditions)){ $conditions = $this->__prepera_format($conditions); $join = array(); foreach( $conditions as $key => $value ){ if(is_array($value)){ $va = '\''.$value[1].'\''; $join[] = "{$key} ".$value[0]." {$va}"; }else{ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } } if(count($join)){ $where = "WHERE ".join(" AND ",$join); } }else{ if(null != $conditions)$where = "WHERE ".$conditions; } if(is_array($order)){ $where .= ' ORDER BY '; $where .= implode(',', $order); }else{ if($order!=null)$where .= " ORDER BY ".$order; } if(!empty($limit)){ if(strpos($limit,',')===false){ $limit = ($limit<=0) ? 1 : $limit; } $where .= " LIMIT {$limit}"; } $fields = empty($fields) ? "*" : $fields; $table = self::$table; $sql = "SELECT {$fields} FROM {$table} {$where}"; return $this->db->getArray($sql); } //分页查询 public function findPage($conditions=null,$order=null,$fields=null,$limit=null) { $where = ''; if(is_array($conditions)){ $conditions = $this->__prepera_format($conditions); $join = array(); foreach( $conditions as $key => $value ){ if(is_array($value)){ $va = '\''.$value[1].'\''; $join[] = "{$key} ".$value[0]." {$va}"; }else{ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } } if(count($join)){ $where = "WHERE ".join(" AND ",$join); } }else{ if(null != $conditions)$where = "WHERE ".$conditions; } if(is_array($order)){ $where .= ' ORDER BY '; $where .= implode(',', $order); }else{ if($order!=null)$where .= " ORDER BY ".$order; } if(!empty($limit)){ if(strpos($limit,',')===false){ $limit = ($limit<=0) ? 1 : $limit; } $where .= " LIMIT {$limit}"; } $fields = empty($fields) ? "*" : $fields; $table = self::$table; $sql = "SELECT SQL_CALC_FOUND_ROWS {$fields} FROM {$table} {$where}"; $data = $this->db->getArray($sql); $sql = 'SELECT FOUND_ROWS()'; $result = $this->db->getArray($sql); return ['lists'=>$data,'sum'=>$result[0]['FOUND_ROWS()']]; } // 查询一条 public function find($where=null,$order=null,$fields=null,$limit=1) { if( $record = $this->findAll($where, $order, $fields, 1) ){ return array_pop($record); }else{ return FALSE; } } //获取单一字段内容 public function getField($where=null,$fields=null,$orders=null){ if( $record = $this->findAll($where, $orders, $fields, 1) ){ $res = array_pop($record); return $res[$fields]; }else{ return FALSE; } } //执行 SQL 语句,返回PDOStatement对象,可以理解为结果集 public function query($sql){ return $this->db->query(); } //执行SQL语句返回影响行数 public function runSql($sql) { return $this->db->exec($sql); } //执行SQL语句函数 public function findSql($sql) { return $this->db->getArray($sql); } //执行SQL获取分页 public function findSqlPage($sql,$orderlimit=''){ $sql = "select SQL_CALC_FOUND_ROWS * from (".$sql.") a ".$orderlimit; $data = $this->db->getArray($sql); $sql = 'SELECT FOUND_ROWS()'; $result = $this->db->getArray($sql); return ['lists'=>$data,'sum'=>$result[0]['FOUND_ROWS()']]; } // 根据条件 (conditions) 删除 public function delete($conditions) { $where = ""; if(is_array($conditions)){ $conditions = $this->__prepera_format($conditions); $join = array(); foreach( $conditions as $key => $value ){ if(is_array($value)){ $va = '\''.$value[1].'\''; $join[] = "{$key} ".$value[0]." {$va}"; }else{ $value = '\''.$value.'\''; $join[] = "{$key} = {$value}"; } } if(count($join)){ $where = "WHERE ".join(" AND ",$join); } }else{ if(null != $conditions)$where = "WHERE ( ".$conditions. ")"; } $table = self::$table; $sql = "DELETE FROM {$table} {$where}"; return $this->runSql($sql); } // 新增数据 public function add($row) { if(!is_array($row))return FALSE; $row = $this->__prepera_format($row); if(empty($row))return FALSE; foreach($row as $key => $value){ if($value!==null){ $cols[] = $key; $vals[] = '\''.$value.'\''; } } $col = join(',', $cols); $val = join(',', $vals); $table = self::$table; $sql = "INSERT INTO {$table} ({$col}) VALUES ({$val})"; if( FALSE != $this->runSql($sql) ){ if( $newinserid = $this->db->lastInsertId() ){ return $newinserid; }else{ $a=$this->find($row, "{$this->primary} DESC",$this->primary); return array_pop($a); } } return FALSE; } //预处理SQL private function __prepera_format($rows) { $table = self::$table; $stmt = $this->db->getTable($table); $stmt->execute(); $columns = $stmt->fetchAll(PDO::FETCH_CLASS); $newcol = array(); foreach ($columns as $key => $value) { $field = strtolower($value->Field); if(stripos($value->Type,'int')!==false || stripos($value->Type,'decimal')!==false){ if(isset($rows[$field])){ if($rows[$field]!=='' && $rows[$field]!==false){ $newcol[$field] = $rows[$field]; }else{ $newcol[$field] = 0; } } }else{ if(isset($rows[$field])){ if($rows[$field]!=='' && $rows[$field]!==false ){ $newcol[$field] = $rows[$field]; }else{ $newcol[$field] = null; } } } } return $newcol; //return array_intersect_key($rows,$newcol); } public function __destruct() { $this->db = null; } } ================================================ FILE: frphp/lib/View.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/02 // +---------------------------------------------------------------------- namespace frphp\lib; use frphp\extend\Page; /** * 视图基类 */ class View { protected $variables = array(); protected $_controller; protected $_action; protected $_cachefile; function __construct($controller, $action) { $this->_controller = strtolower($controller); $this->_action = strtolower($action); } // 分配变量 public function assign($name, $value) { //$this->variables[$name] = $value; $GLOBALS[$name] = $value; } // 渲染显示 public function render($name=null) { if(defined('TPL_PATH')){ $path = TPL_PATH; }else{ $path = APP_HOME; } if($name){ if(strpos($name,'@')!==false){ $controllerLayout = str_replace('@','',$name); }else{ $controllerLayout = HOME_VIEW ? $path.'/'.HOME_VIEW.'/'.Tpl_template.'/' . $name : $path.'/'.Tpl_template.'/' . $name; $controllerLayout = (stripos($controllerLayout,File_TXT)!==false || stripos($controllerLayout,'.html')!==false ) ? $controllerLayout : $controllerLayout.File_TXT; } }else{ $controllerLayout = HOME_VIEW ? $path .'/'.HOME_VIEW.'/'.Tpl_template.'/' . strtolower($this->_controller) . '/' . $this->_action : $path .'/'.Tpl_template.'/' . strtolower($this->_controller) . '/' . $this->_action; } //去除可能没有的Tpl_template $controllerLayout = str_ireplace(['//','\\'],'/',$controllerLayout); //判断视图文件是否存在 if (file_exists($controllerLayout)) { $this->template($controllerLayout); } else { //兼容自定义扩展和.html模板 $controllerLayout = str_replace(File_TXT,'.html',$controllerLayout); if (file_exists($controllerLayout)) { $this->template($controllerLayout); }else{ $f = strpos($name,File_TXT)!==false ? $name : $name.File_TXT; Error_msg('无法找到视图文件,页面模板:'.$f); } } } //模板解析 public function template($controllerLayout){ //extract($this->variables);//分配变量到模板中 extract($GLOBALS);//分配变量到模板中 //对路径文件换为缓存目录 '/'换为'-' //$layout = str_ireplace(array("//","/"),'_',$controllerLayout); //$cache_file = str_ireplace('.html','.php',APP_PATH.'/cache/'.$layout); $cache_file = Cache_Path.'/'.md5($controllerLayout).'.php'; $this->_cachefile = $cache_file;//传入系统中 $now_time = time(); if(file_exists($cache_file)){ $last_time = filemtime($cache_file); }else{ $last_time = 0; } $cache_time = webConf('cache_time') ? webConf('cache_time') : 0; $isclear = 0; if((($now_time - $last_time)/60)>$cache_time){ $isclear = 1; } if(APP_DEBUG===true){ $fp_tp=@fopen($controllerLayout,"r"); $fp_txt=@fread($fp_tp,filesize($controllerLayout)); @fclose($fp_tp); $fp_txt=$this->template_html($fp_txt); $fp_txt = "".$fp_txt; $fpt_tpl=@fopen($cache_file,"w"); @fwrite($fpt_tpl,$fp_txt); @fclose($fpt_tpl); }else if(is_readable($cache_file)!==true || $isclear){ $fp_tp=@fopen($controllerLayout,"r"); $fp_txt=@fread($fp_tp,filesize($controllerLayout)); @fclose($fp_tp); $fp_txt=$this->template_html($fp_txt); $fp_txt = "".$fp_txt; $fpt_tpl=@fopen($cache_file,"w"); @fwrite($fpt_tpl,$fp_txt); @fclose($fpt_tpl); } if(is_readable($cache_file)!==true){ Error_msg('无法找到模板缓存,请刷新后重试,或者检查cache缓存文件夹权限'); } include $cache_file; } //模板分解替换 public function template_html($content){ //include标签 preg_match_all('/\{include=\"(.*?)\"\}/si',$content,$i); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,$this->template_html_include($i[1][$k]),$content); } //loop标签 preg_match_all('/\{loop (.*?)\}/si',$content,$i); $this->check_template_err(substr_count($content, '{/loop}'),count($i[0]),'loop'); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,$this->template_html_loop($i[1][$k]),$content); } $content=str_ireplace('{/loop}','',$content); //foreach循环 preg_match_all('/\{foreach(.*?)\}/si',$content,$i); $this->check_template_err(substr_count($content, '{/foreach}'),count($i[0]),'foreach'); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,$this->template_html_foreach($i[1][$k]),$content); } $content=str_ireplace('{/foreach}','',$content); //screen标签 preg_match_all('/\{screen (.*?)\}/si',$content,$i); $this->check_template_err(substr_count($content, '{/screen}'),count($i[0]),'screen'); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,$this->template_html_screen($i[1][$k]),$content); } $content=str_ireplace('{/screen}','',$content); //for循环 preg_match_all('/\{for(.*?)\}/si',$content,$i); $this->check_template_err(substr_count($content, '{/for}'),count($i[0]),'for'); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'',$content); } $content=str_ireplace('{/for}','',$content); //if判断 preg_match_all('/\{if(.*?)\}/si',$content,$i); $this->check_template_err(substr_count($content, '{/if}'),count($i[0]),'if'); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'',$content); } $content=str_ireplace('{else}','',$content); //else if判断 preg_match_all('/\{else if(.*?)\}/si',$content,$i); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'',$content); } $content=str_ireplace('{/if}','',$content); //PHP函数解析 preg_match_all('/\{fun (.*?)\}/si',$content,$i); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'',$content); } //PHP常量解析 preg_match_all('/\{__(.*?)__}/si',$content,$i); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'',$content); } //PHP标签解析 preg_match_all('/\{php(.*?)\/}/si',$content,$i); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'',$content); } //PHP变量解析 preg_match_all('/\{\$(.*?)\}/si',$content,$i); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'',$content); } //标签原样输出 preg_match_all('/\{!--(.*?)\--}/si',$content,$i); foreach($i[0] as $k=>$v){ $content=str_ireplace($v,'{'.$i[1][$k].'}',$content); } return $content; } //引入公共模板 public function template_html_include($filename){ if(strpos($filename,'.')!==false){ $prefix = ''; }else{ $prefix = File_TXT; } if(defined('TPL_PATH')){ $path = TPL_PATH; }else{ $path = APP_HOME; } if(APP_URL=='/index.php'){ $includefile = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.TEMPLATE.'/'.$filename. $prefix); $file = TEMPLATE.'/'.$filename. $prefix; }else{ $includefile = str_replace('//','/',APP_PATH . $path .'/'.HOME_VIEW.'/'.Tpl_template.'/'. Tpl_common .'/'.$filename. $prefix); $file = Tpl_common .'/'.$filename. $prefix; } if(!is_file($includefile)){ //兼容自定义扩展和.html模板 $includefile = str_replace(File_TXT,'.html',$includefile); if (!is_file($includefile)) { Error_msg($file.'不存在!'); } } $content = file_get_contents($includefile); $content = $this->template_html($content); return $content; } //检查模板标签是否错误! public function check_template_err($a,$b,$msg){ if($a!=$b) Error_msg($this->_cachefile.'模板中存在不完整'.$msg.'标签,请检查是否遗漏{'.$msg.'}开始或结束符'); } //筛选 /** 输出参数:筛选列表all(item),链接url,升降序(id,orders,addtime) {screen molds="article" orderby="orders desc" tid="1|2" fields='pingpai,yanse' as="v"} **/ public function template_html_screen($f){ preg_match_all('/.*?(\s*.*?=.*?[\"|\'].*?[\"|\']\s).*?/si',' '.$f.' ',$aa); $a=array(); foreach($aa[1] as $v){ $t=explode('=',trim(str_replace(array('"',"'"),'',$v))); $a=array_merge($a,array(trim($t[0]) => trim($t[1]))); } if(strpos($a['molds'],'$')!==FALSE){ $a['molds']='\'".'.$a['molds'].'."\''; }else{ $a['molds'] = " '".$a['molds']."' "; } $molds=$a['molds']; if(isset($a['fields'])){$fields="'".$a['fields']."'";}else{$fields='null';} if($a['as']!=''){$as=$a['as'];}else{$as='v';} if(isset($a['orderby'])){ $order="'".$a['orderby']."'"; }else{$order="' id desc '";} $tids = '1=1'; if(isset($a['tid'])){ $arr_tid = array(); if(strpos($a['tid'],'|')!==false){ foreach(explode('|',$a['tid']) as $v){ $arr_tid[]=" (tids like '%,".$v.",%') "; } $tids = ' ( '. implode('or',$arr_tid).' ) '; }else if(strpos($a['tid'],'$')!==false){ $tids = " tids like '%,".trim($a['tid'],"'").",%' "; }else{ $tids = " tids like '%,".$a['tid'].",%' "; } } $where = '1=1'; if(isset($a['fields'])){ if(strpos($a['fields'],',')!==false){ $a['fields'] = str_replace(',',"','",$a['fields']); } $where = " field in ('".$a['fields']."') "; } $sql=' fieldtype in(7,8,12) and isshow=1 and field!=\'isshow\' and molds='.$molds.' and '.$tids.' and '.$where; $txt="findAll(\$w,\$order,\$fields);"; $txt.='$n=0;foreach($'.$as.'_data as $'.$as.'_key=> $'.$as.'){ $n++; $vs=array(); $fieldvalue = explode(",",$'.$as.'["body"]); //$rooturl = get_domain()."/screen/index/molds/".$'.$as.'["molds"]."/tid/".$type["id"]; $rooturl = get_domain()."/screen-".$'.$as.'["molds"]."-".$type["id"]; foreach($fieldvalue as $kk=>$vv){ $d=explode("=",$vv); $vs[$kk] = array("key"=>$d[1],"value"=>$d[0],"url"=>$rooturl."-".$'.$as.'["field"]."-".$d[1].change_parse_url($filters,$'.$as.'["field"])); } $'.$as.'["list"] = $vs; $'.$as.'["url"] = $rooturl."-".$'.$as.'["field"]."-0"; ?>'; return $txt; } //foreach全局标签 /** $content=str_ireplace($v,'',$content); */ private function template_html_foreach($f){ $ff = explode(' as ',$f); if(strpos($ff[1],'=>')!==false){ $fff = explode('=>',$ff[1]); $fff[1] = trim($fff[1]); return ''; }else{ $ff[1] = trim($ff[1]); return ''; } } //loop全局标签 private function template_html_loop($f){ preg_match_all('/.*?(\s*.*?=.*?[\"|\'].*?[\"|\']\s).*?/si',' '.$f.' ',$aa); $a=array();foreach($aa[1] as $v){$t=explode('=',trim(str_replace(array('"'),"'",$v)));$a=array_merge($a,array(trim($t[0]) => trim($t[1])));} if(isset($a['table'])){ if(strpos($a['table'],'$')!==FALSE){$a['table']=trim($a['table'],"'");} $db=$a['table']; }else{ if(!isset($a['tid'])){ exit('缺少table参数!');} if(strpos($a['tid'],'$')!==false){ $db = ' $classtypedata['.trim($a['tid'],"'").']["molds"] '; }else{ if(strpos($a['tid'],',')!==false){ $tids = explode(',',$a['tid']); $db = ' $classtypedata['.trim($tids[0],"'").']["molds"] '; }else{ $db = ' $classtypedata['.trim($a['tid'],"'").']["molds"] '; } } } if(isset($a['limit'])){ if(strpos($a['limit'],'$')!==false){ $limit=trim($a['limit'],"'"); }else{ $limit=$a['limit']; } }else{$limit='null';} if(isset($a['notempty'])){$notempty=trim($a['notempty'],"'");}else{$notempty=false;} if(isset($a['empty'])){$empty=trim($a['empty'],"'");}else{$empty=false;} if(isset($a['fields'])){ if(strpos($a['fields'],'$')!==false){ $fields=trim($a['fields'],"'"); }else{ $fields=$a['fields']; } }else{$fields='null';} if(isset($a['isall'])){$isall=trim($a['isall'],"'");}else{$isall=false;} if(isset($a['as'])){$as=$a['as'];}else{$as='v';} if(isset($a['day'])){$day=$a['day'];}else{$day=false;} if(isset($a['jzpage'])){$jzpage=trim($a['jzpage'],"'");}else{$jzpage='page';} if(isset($a['sql'])){$sql=trim($a['sql'],"'");}else{$sql='';} if(isset($a['jzcache'])){$jzcache=trim($a['jzcache'],"'");}else{$jzcache=false;} if(isset($a['jzcachetime'])){$jzcachetime= 60 * trim($a['jzcachetime'],"'");}else{$jzcachetime=30*60;} if(isset($a['orderby'])){ $order=$a['orderby']; if(strpos($a['orderby'],'$')!==FALSE){$order=trim($a['orderby'],"'");} //$order=' '.str_replace('|',' ',$order).' '; }else{$order="' id desc '";} if(isset($a['like'])){ // like='title|学习,keywords|学习' => title like '%学习%' and keywords like '%学习%'; $lk = array(); if(strpos($a['like'],',')!==false){ $like = explode(',',trim($a['like'],"'")); foreach($like as $v){ $s = explode('|',$v); if(strpos($s[1],'$')!==false){ $lk[] = " ".$s[0]." like \'%'.".trim($s[1]).".'%\' "; }else{ $lk[]= " ".$s[0]." like \'%".trim($s[1])."%\' "; } } $lk = " and ( ". implode(" or ",$lk)." )"; }else{ if(strpos($a['like'],'$')!==false){ $like = explode('|',trim($a['like'],"'")); $lk = " and ".$like[0]." like \'%'.".trim($like[1]).".'%\' "; }else{ $like = explode('|',trim($a['like'],"'")); $lk = " and ".$like[0]." like \'%".trim($like[1])."%\' "; } } }else{ $lk='';} if(isset($a['notlike'])){ $not = array(); if(strpos($a['notlike'],',')!==false){ $like = explode(',',trim($a['notlike'],"'")); foreach($like as $v){ $s = explode('|',$v); if(strpos($s[1],'$')!==false){ $not[] = " ".$s[0]." not like \'%'.".trim($s[1]).".'%\' or ".$s[0]." is null "; }else{ $not[]= " ".$s[0]." not like \'%".trim($s[1])."%\' or ".$s[0]." is null "; } } $notlike = " and ( ". implode(" or ",$not)." )"; }else{ if(strpos($a['notlike'],'$')!==false){ $like = explode('|',trim($a['notlike'],"'")); $notlike = " and (".$like[0]." not like \'%'.".trim($like[1]).".'%\' or ".$like[0]." is null) "; }else{ $like = explode('|',trim($a['notlike'],"'")); $notlike = " and (".$like[0]." not like \'%".trim($like[1])."%\' or ".$like[0]." is null) "; } } }else{ $notlike = ''; } //不在某个参数范围内 $notin_sql = ''; if(isset($a['notin'])){ if(strpos($a['notin'],'|')!==false){ $notin = explode('|',trim($a['notin'],"'")); if(strpos($notin[1],'$')!==false){ $notin_sql = ' and '.$notin[0].' not in(\'.'.$notin[1].'.\') '; }else{ $notin_sql = ' and '.$notin[0].' not in('.$notin[1].') '; } } } //在某个参数范围内 $in_sql = ''; if(isset($a['in'])){ if(strpos($a['in'],'|')!==false){ $in = explode('|',trim($a['in'],"'")); if(strpos($in[1],'$')!==false){ $in_sql = ' and '.$in[0].' in(\'.'.$in[1].'.\') '; }else{ $in_sql = ' and '.$in[0].' in('.$in[1].') '; } } } if($sql){ $sql = " and ('.".$sql.".' ) "; } if(isset($a['notjz'])){ $jz = 0; }else{ $jz = 1; } unset($a['table']);unset($a['orderby']);unset($a['limit']);unset($a['as']);unset($a['like']);unset($a['notlike']);unset($a['fields']);unset($a['isall']);unset($a['notin']);unset($a['notempty']);unset($a['empty']);unset($a['day']);unset($a['in']);unset($a['sql']);unset($a['jzpage']);unset($a['jzcache']);unset($a['jzcachetime']);unset($a['notjz']); $w = ' 1=1 '; $fu = ''; $ispage=false; if($jzpage!='page'){ if(stripos($jzpage,'$')!==false){ $jzpage = "'.$jzpage.'"; } $pagenum = "\$pagenum = (int)\$_REQUEST['".$jzpage."'] ? (int)\$_REQUEST['".$jzpage."'] : 1; "; }else{ $pagenum = "\$pagenum = isset(\$frpage) ? \$frpage : (int)\$_REQUEST['page'];"; } foreach($a as $k=>$v){ if(strpos($v,'$')===FALSE){ //$v = str_ireplace("'",'',$v); $v = trim($v,"'"); } if($k=='ispage'){ $ispage=true; }else if($k=='tid'){ $classtypedata = classTypeData(); if(strpos($a['tid'],',')!==false){ if($isall){ $a['tid'] = trim($a['tid'],"'"); $tids=explode(',',$a['tid']); $ss = []; $fu = " \$fu = [];\$f = [];"; foreach($tids as $s){ if($classtypedata[$s]){ $ss[] = ' tid in(\'.implode(",",$classtypedata['.$s.']["children"]["ids"]).\') '; $fu .= " \$fu = array_merge(\$fu,\$classtypedata[".$s."][\"children\"][\"ids\"]);"; } } $fu .= "foreach(\$fu as \$fv){ \$f[] = 'tids like \'%,'.\$fv.',%\''; }"; if(count($ss)){ $w.=' and ('.implode(' or ',$ss).' or \'.implode(\' or \',$f).\' )'; } }else{ $w.=' and tid in('.trim($a['tid'],"'").') '; } }else{ if(strpos($a['tid'],'$')!==false){ if($isall){ $fu = " \$f = []; \$fu = \$classtypedata[".trim($v,"'")."]['children']['ids'];"; $fu .= "foreach(\$fu as \$fv){ \$f[] = 'tids like \'%,'.\$fv.',%\' '; }"; $w.= ' and ( tid in(\'.implode(",",$classtypedata['.trim($v,"'").']["children"]["ids"]).\') or \'.implode(\' or \',$f).\' ) '; }else{ $w.="and tid='.".trim($v,"'").".' "; } }else{ if($isall){ $fu = " \$f = []; \$fu = \$classtypedata[".trim($v,"'")."]['children']['ids'];"; $fu .= "foreach(\$fu as \$fv){ \$f[] = 'tids like \'%,'.\$fv.',%\' '; }"; if($classtypedata[$v]) { $w .= ' and (tid in(\'.implode(",",$classtypedata[' . trim($v, "'") . ']["children"]["ids"]).\') or \'.implode(\' or \',$f).\') '; } }else{ $w.="and tid=".$v." "; } } } }else if($k=='jzattr'){ if(strpos($v,',')!==false){ $s = explode(',',$v); $s_sql = []; foreach($s as $ss){ $s_sql[]=" jzattr like \'%,".$ss.",%\' "; } $w.=" and ( ".implode('or',$s_sql)." ) "; }else{ $w.=" and jzattr like \'%,".$v.",%\'"; } }else{ if(strpos($v,'$')!==FALSE){ $w.="and ".$k."=\''.".trim($v,"'").".'\' "; }else{ $w.="and ".$k."=\'".$v."\' "; } } } if($notempty){ //多个字段 if(strpos($notempty,'|')!==false){ $notempty = explode('|',$notempty); foreach($notempty as $v){ $w.=' (and trim('.$v.') !="" && trim('.$v.') is not null) '; } }else{ $w.=' and (trim('.$notempty.') !="" && trim('.$notempty.') is not null) '; } } if($empty){ //多个字段 if(strpos($empty,'|')!==false){ $empty = explode('|',$empty); foreach($empty as $v){ $w.=' and (trim('.$v.') ="" or trim('.$v.') is null) '; } }else{ $w.=' and (trim('.$empty.') ="" or trim('.$empty.') is null) '; } } if($day){ $day =str_replace("'",'',$day); if(strpos($day,'$')!==false){ $day = trim($day,"'"); $w.=" and DATE_SUB(CURDATE(), INTERVAL '".".$day."."' DAY) <= date(FROM_UNIXTIME(addtime))"; }else{ $w.=" and DATE_SUB(CURDATE(), INTERVAL ".$day." DAY) <= date(FROM_UNIXTIME(addtime))"; } } if(webconf('schedule_table')){ if(webConf('schedule_table')){ $tables = explode('|',webConf('schedule_table')); if(in_array(trim($db,"'"),$tables)){ $w.= ' and addtime<='.time().' '; } } } $w .= $notin_sql; $w .= $in_sql; $w .= $sql; $w.= $lk; $w.= $notlike; $as = trim($as,"'"); $txt="typeurl = 'tpl'; \$".$as."_page->paged = '".$jzpage."'; \$".$as."_data = \$".$as."_page->where(\$".$as."_w)->fields(\$".$as."_fields)->orderby(\$".$as."_order)->limit(\$".$as."_limit)->page(\$pagenum)->go(); \$".$as."_pages = \$".$as."_page->pageList(3,'?".$jzpage."='); \$".$as."_sum = \$".$as."_page->sum; \$".$as."_listpage = \$".$as."_page->listpage; \$".$as."_prevpage = \$".$as."_page->prevpage; \$".$as."_nextpage = \$".$as."_page->nextpage; \$".$as."_allpage = \$".$as."_page->allpage;"; }else{ if($jzcache){ $txt .= " \$cachestr = md5(\$".$as."_table.\$".$as."_w.\$".$as."_order.\$".$as."_fields.\$".$as."_limit); $".$as."_data = getCache(\$cachestr); if($".$as."_data!==false){ $".$as."_data = M(\$".$as."_table,\$".$as."_prefix)->findAll(\$".$as."_w,\$".$as."_order,\$".$as."_fields,\$".$as."_limit); setCache(\$cachestr,$".$as."_data,$jzcachetime); }"; }else{ $txt .= " $".$as."_data = M(\$".$as."_table,\$".$as."_prefix)->findAll(\$".$as."_w,\$".$as."_order,\$".$as."_fields,\$".$as."_limit);"; } } $txt.='$'.$as.'_n=0;foreach($'.$as.'_data as $'.$as.'_key=> $'.$as.'){ $'.$as.'_n++; if(!array_key_exists(\'url\',$'.$as.')){ if($'.$as.'_table==\'classtype\'){ $'.$as.'[\'url\'] = $classtypedata[$'.$as.'[\'id\']][\'url\']; }else if($'.$as.'_table==\'message\'){ $'.$as.'[\'url\'] = U(\'message/details\',[\'id\'=>$'.$as.'[\'id\']]); }else if($'.$as.'_table==\'tags\'){ $'.$as.'[\'url\'] = U(\'tags/index\',[\'id\'=>$'.$as.'[\'id\']]); }else{ $'.$as.'[\'url\'] = gourl($'.$as.',$'.$as.'[\'htmlurl\']); } } ?>'; return $txt; } } ================================================ FILE: index.php ================================================ // +---------------------------------------------------------------------- // | Date:2022/04/11 // +---------------------------------------------------------------------- // 应用目录为当前目录 define('APP_PATH', __DIR__ . '/'); define('ADMIN_MODEL','admins'); // 加载框架文件 require(APP_PATH . 'frphp/fr.php'); // 就这么简单~ ================================================ FILE: install/db.php ================================================ /* MySQL Database Backup Tools Server:127.0.0.1:3306 Database:db Data:2022-01-26 13:46:31 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for jz_article -- ---------------------------- DROP TABLE IF EXISTS `jz_article`; CREATE TABLE `jz_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '文章标题', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目', `molds` varchar(50) DEFAULT 'article' COMMENT '模型标识', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `description` text COMMENT '简介', `seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID:0前台发布', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `body` mediumtext COMMENT '文章内容', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击次数', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否审核:1审核0未审2退回', `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0后台发布', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐', `tids` varchar(255) DEFAULT NULL COMMENT '副栏目', `zan` int(11) DEFAULT '0' COMMENT '点赞数', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='文章表'; -- ---------------------------- -- Table structure for jz_attr -- ---------------------------- DROP TABLE IF EXISTS `jz_attr`; CREATE TABLE `jz_attr` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'attr' COMMENT '模型标识', `name` varchar(50) DEFAULT NULL COMMENT '属性名', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='推荐属性'; -- ---------------------------- -- Table structure for jz_buylog -- ---------------------------- DROP TABLE IF EXISTS `jz_buylog`; CREATE TABLE `jz_buylog` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `aid` int(11) DEFAULT '0' COMMENT '内容ID', `userid` int(11) DEFAULT '0' COMMENT '会员ID', `orderno` varchar(255) DEFAULT NULL COMMENT '订单号', `type` tinyint(1) DEFAULT '1' COMMENT '交易类型:1购买商品0兑换金币', `buytype` varchar(20) DEFAULT NULL COMMENT '支付类型', `msg` varchar(255) DEFAULT NULL COMMENT '记录', `molds` varchar(255) DEFAULT NULL COMMENT '模型标识', `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总计', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金额', `addtime` int(11) DEFAULT '0' COMMENT '添加时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='购买记录表'; -- ---------------------------- -- Table structure for jz_cachedata -- ---------------------------- DROP TABLE IF EXISTS `jz_cachedata`; CREATE TABLE `jz_cachedata` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `field` varchar(50) DEFAULT NULL COMMENT '字段', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `isall` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否输出所有:1是0否', `sqls` varchar(500) DEFAULT NULL COMMENT 'SQL', `orders` varchar(255) DEFAULT NULL COMMENT '排序', `limits` int(11) NOT NULL DEFAULT '10' COMMENT '输出条数', `times` int(11) NOT NULL DEFAULT '0' COMMENT '更新周期', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='数据缓存表'; -- ---------------------------- -- Table structure for jz_chain -- ---------------------------- DROP TABLE IF EXISTS `jz_chain`; CREATE TABLE `jz_chain` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL COMMENT '内链词', `newtitle` varchar(100) DEFAULT NULL COMMENT '替换词', `url` varchar(255) DEFAULT NULL COMMENT '链接', `num` int(11) NOT NULL DEFAULT '-1' COMMENT '替换次数', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='内链'; -- ---------------------------- -- Table structure for jz_classtype -- ---------------------------- DROP TABLE IF EXISTS `jz_classtype`; CREATE TABLE `jz_classtype` ( `id` int(11) NOT NULL AUTO_INCREMENT, `classname` varchar(50) DEFAULT NULL COMMENT '栏目名', `seo_classname` varchar(50) DEFAULT NULL COMMENT 'SEO栏目名', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `description` text COMMENT '描述', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `body` text COMMENT '内容', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序', `orderstype` int(4) NOT NULL DEFAULT '0' COMMENT '排序类型:1时间倒序2ID正序3点击量倒序4ID正序5时间正序6点击量正序', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', `iscover` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否覆盖下级', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '上级栏目ID', `gid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目权限:0不限制', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `lists_html` varchar(50) DEFAULT NULL COMMENT '栏目页模板', `details_html` varchar(50) DEFAULT NULL COMMENT '详情页模板', `lists_num` int(4) DEFAULT '0' COMMENT '列表数量', `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数', `gourl` varchar(255) DEFAULT NULL COMMENT '栏目外链', `ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许会员发布', `isclose` tinyint(1) NOT NULL DEFAULT '0' COMMENT '关闭栏目', `gids` varchar(255) DEFAULT NULL COMMENT '允许访问角色', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='栏目表'; -- ---------------------------- -- Table structure for jz_collect -- ---------------------------- DROP TABLE IF EXISTS `jz_collect`; CREATE TABLE `jz_collect` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `description` varchar(500) DEFAULT NULL COMMENT '简介', `tid` int(11) DEFAULT NULL COMMENT '所属栏目', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `w` varchar(10) NOT NULL DEFAULT '0' COMMENT '宽', `h` varchar(10) NOT NULL DEFAULT '0' COMMENT '高', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `url` varchar(255) DEFAULT NULL COMMENT '链接', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图'; -- ---------------------------- -- Table structure for jz_collect_type -- ---------------------------- DROP TABLE IF EXISTS `jz_collect_type`; CREATE TABLE `jz_collect_type` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '分类名', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图分类'; -- ---------------------------- -- Table structure for jz_comment -- ---------------------------- DROP TABLE IF EXISTS `jz_comment`; CREATE TABLE `jz_comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'comment' COMMENT '模型标识', `tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目tid', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章id', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '回复帖子id', `zid` int(11) NOT NULL DEFAULT '0' COMMENT '主回复帖子:同一层楼内回复,规定主回复id', `body` text COMMENT '评论内容', `reply` text COMMENT '回复内容', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0表示游客', `likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏2被删除', `isread` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已读:1已读0未读', PRIMARY KEY (`id`), KEY `tid` (`tid`), KEY `aid` (`aid`), KEY `pid` (`pid`), KEY `zid` (`zid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='评论表'; -- ---------------------------- -- Table structure for jz_ctype -- ---------------------------- DROP TABLE IF EXISTS `jz_ctype`; CREATE TABLE `jz_ctype` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) DEFAULT NULL COMMENT '配置栏名称', `action` varchar(255) DEFAULT NULL COMMENT '配置标识,用于权限控制', `sys` tinyint(1) DEFAULT 0 COMMENT '系统配置,1是0否', `isopen` tinyint(1) DEFAULT 1 COMMENT '是否启用,1启用0关闭', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统设置栏目名'; -- ---------------------------- -- Table structure for jz_customurl -- ---------------------------- DROP TABLE IF EXISTS `jz_customurl`; CREATE TABLE `jz_customurl` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `url` varchar(255) DEFAULT NULL COMMENT '自定义URL', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='自定义链接表'; -- ---------------------------- -- Table structure for jz_fields -- ---------------------------- DROP TABLE IF EXISTS `jz_fields`; CREATE TABLE `jz_fields` ( `id` int(11) NOT NULL AUTO_INCREMENT, `field` varchar(50) DEFAULT NULL COMMENT '字段标识', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `fieldname` varchar(100) DEFAULT NULL COMMENT '字段名称', `tips` varchar(100) DEFAULT NULL COMMENT '填写提示', `fieldtype` tinyint(2) NOT NULL DEFAULT '1' COMMENT '输入类型', `tids` text COMMENT '绑定栏目', `fieldlong` varchar(50) DEFAULT NULL COMMENT '字段长度', `body` text COMMENT '字段配置', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '表单排序', `ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填:1是0否', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台是否显示:1显示0隐藏', `isadmin` tinyint(1) NOT NULL DEFAULT '1' COMMENT '后台是否显示:1显示0隐藏', `issearch` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搜索显示:1显示0隐藏', `islist` tinyint(1) NOT NULL DEFAULT '0' COMMENT '列表显示:1显示0隐藏', `format` varchar(50) DEFAULT NULL COMMENT '格式化', `vdata` varchar(50) DEFAULT NULL COMMENT '默认值', `isajax` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'AJAX显示:1显示0隐藏', `listorders` int(4) NOT NULL DEFAULT '0' COMMENT '列表排序', `isext` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否扩展信息', `width` varchar(50) DEFAULT NULL COMMENT '列表中显示宽度', `ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台表单录入', `ldfield` varchar(255) DEFAULT NULL COMMENT '关联字段', `linkfield` varchar(255) DEFAULT NULL COMMENT '连接字段', `remote` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否远程数据', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Table structure for jz_hook -- ---------------------------- DROP TABLE IF EXISTS `jz_hook`; CREATE TABLE `jz_hook` ( `id` int(11) NOT NULL AUTO_INCREMENT, `module` varchar(50) DEFAULT NULL COMMENT '模块,Home/A', `namespace` varchar(100) DEFAULT NULL COMMENT '控制器命名空间', `controller` varchar(50) DEFAULT NULL COMMENT '控制器', `action` varchar(255) DEFAULT NULL COMMENT '执行函数:可同时注册多个方法,逗号拼接', `hook_namespace` varchar(100) DEFAULT NULL COMMENT '钩子控制器所在的命名空间', `hook_controller` varchar(50) DEFAULT NULL COMMENT '钩子控制器', `hook_action` varchar(50) DEFAULT NULL COMMENT '钩子执行方法', `all_action` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否全局控制器', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序:越大越靠前执行', `isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否关闭:1开启0关闭', `plugins_name` varchar(50) DEFAULT NULL COMMENT '关联插件名', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件钩子'; -- ---------------------------- -- Table structure for jz_layout -- ---------------------------- DROP TABLE IF EXISTS `jz_layout`; CREATE TABLE `jz_layout` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` varchar(200) DEFAULT NULL COMMENT '桌面名称', `top_layout` text COMMENT '顶部菜单', `left_layout` text COMMENT '左侧菜单', `gid` int(11) DEFAULT NULL COMMENT '所属角色', `ext` varchar(255) DEFAULT NULL COMMENT '备注', `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统配置:1是0否', `isdefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认配置:1是0否', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='桌面设置'; -- ---------------------------- -- Table structure for jz_level -- ---------------------------- DROP TABLE IF EXISTS `jz_level`; CREATE TABLE `jz_level` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'level' COMMENT '模型标识', `name` varchar(20) DEFAULT NULL COMMENT '管理员名称', `pass` varchar(100) DEFAULT NULL COMMENT '密码', `tel` varchar(20) DEFAULT NULL COMMENT '电话号码', `gid` int(4) NOT NULL DEFAULT '2' COMMENT '所属角色', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间', `logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='管理员表'; -- ---------------------------- -- Table structure for jz_level_group -- ---------------------------- DROP TABLE IF EXISTS `jz_level_group`; CREATE TABLE `jz_level_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'level_group' COMMENT '模型标识', `name` varchar(50) DEFAULT NULL COMMENT '角色名称', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', `isadmin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超管:1是0否', `ischeck` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发布审核:1需要审核0不需要', `classcontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否配置栏目权限:1是0否', `paction` text COMMENT '权限列表', `tids` text COMMENT '拥有栏目权限', `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结', `description` varchar(500) DEFAULT NULL COMMENT '描述', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; -- ---------------------------- -- Table structure for jz_likes -- ---------------------------- DROP TABLE IF EXISTS `jz_likes`; CREATE TABLE `jz_likes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`), KEY `tid` (`tid`,`aid`,`userid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='点赞表'; -- ---------------------------- -- Table structure for jz_link_type -- ---------------------------- DROP TABLE IF EXISTS `jz_link_type`; CREATE TABLE `jz_link_type` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '友链分类名', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接分类表'; -- ---------------------------- -- Table structure for jz_links -- ---------------------------- DROP TABLE IF EXISTS `jz_links`; CREATE TABLE `jz_links` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '友链名称', `molds` varchar(50) DEFAULT 'links' COMMENT '模型标识', `url` varchar(255) DEFAULT NULL COMMENT '链接', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接表'; -- ---------------------------- -- Table structure for jz_member -- ---------------------------- DROP TABLE IF EXISTS `jz_member`; CREATE TABLE `jz_member` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'member' COMMENT '模型标识', `username` varchar(50) DEFAULT NULL COMMENT '用户昵称', `openid` varchar(255) DEFAULT NULL COMMENT '微信OPENID', `pass` varchar(255) DEFAULT NULL COMMENT '密码', `token` varchar(255) DEFAULT NULL COMMENT 'Token', `sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别:1男2女0未知', `gid` int(11) NOT NULL DEFAULT '1' COMMENT '会员分组ID', `litpic` varchar(255) DEFAULT NULL COMMENT '头像', `tel` varchar(50) DEFAULT NULL COMMENT '手机号码', `jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分数', `likes` text COMMENT '喜欢点赞(已废弃)', `collection` text COMMENT '收藏(已废弃)', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金币', `email` varchar(255) DEFAULT NULL COMMENT '邮箱', `address` varchar(255) DEFAULT NULL COMMENT '地址', `province` varchar(50) DEFAULT NULL COMMENT '省份', `city` varchar(50) DEFAULT NULL COMMENT '城市', `regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间', `hassendtime` int(11) NOT NULL DEFAULT '0' COMMENT '发送验证码时间', `logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0封禁', `signature` varchar(255) DEFAULT NULL COMMENT '个性签名', `birthday` varchar(25) DEFAULT NULL COMMENT '生日:2020-01-01', `follow` text COMMENT '关注列表', `fans` int(11) NOT NULL DEFAULT '0' COMMENT '粉丝数', `ismsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收消息提醒', `iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收评论消息提醒', `iscollect` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收收藏消息提醒', `islikes` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收点赞消息提醒', `isat` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收@消息提醒', `isrechange` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收交易消息提醒', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '推荐用户ID', `uploadsize` int(11) NOT NULL DEFAULT '50' COMMENT '上传大小限制', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员表'; -- ---------------------------- -- Table structure for jz_member_group -- ---------------------------- DROP TABLE IF EXISTS `jz_member_group`; CREATE TABLE `jz_member_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '分组名', `molds` varchar(50) DEFAULT 'member_group' COMMENT '模型标识', `description` varchar(255) DEFAULT NULL COMMENT '分组简介', `paction` text COMMENT '权限', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '分组上级', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许登录', `iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许评论', `ischeckmsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否需要审核评论', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣价:现金折扣或者百分比折扣', `discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型:0无折扣1现金折扣,1百分比折扣', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员分组'; -- ---------------------------- -- Table structure for jz_menu -- ---------------------------- DROP TABLE IF EXISTS `jz_menu`; CREATE TABLE `jz_menu` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL COMMENT '导航名称', `nav` text COMMENT '导航配置', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='导航表'; -- ---------------------------- -- Table structure for jz_message -- ---------------------------- DROP TABLE IF EXISTS `jz_message`; CREATE TABLE `jz_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `molds` varchar(50) DEFAULT 'message' COMMENT '模型标识', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员', `tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章ID', `user` varchar(255) DEFAULT NULL COMMENT '用户名', `ip` varchar(255) DEFAULT NULL COMMENT 'IP', `body` text COMMENT '留言内容', `reply` text COMMENT '回复内容', `tel` varchar(50) DEFAULT NULL COMMENT '电话', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序', `email` varchar(255) DEFAULT NULL COMMENT '邮箱', `isshow` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否审核:1审核0未审', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量', `tids` varchar(255) DEFAULT NULL COMMENT '副栏目', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='留言表'; -- ---------------------------- -- Table structure for jz_molds -- ---------------------------- DROP TABLE IF EXISTS `jz_molds`; CREATE TABLE `jz_molds` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '模型名称', `biaoshi` varchar(50) DEFAULT NULL COMMENT '模型标识', `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统:1是0否', `isopen` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启:1开启0关闭', `iscontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启权限:1开启权限0不开启', `ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '栏目必选:1是0否', `isclasstype` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示栏目', `isshowclass` tinyint(1) DEFAULT '1' COMMENT '栏目绑定:1显示0隐藏', `list_html` varchar(50) DEFAULT 'list.html' COMMENT '默认列表模板', `details_html` varchar(50) DEFAULT 'details.html' COMMENT '默认详情模板', `orders` int(11) NOT NULL DEFAULT '100' COMMENT '排序', `ispreview` tinyint(1) DEFAULT '1' COMMENT '是否可以预览', `ishome` tinyint(1) DEFAULT '0' COMMENT '前台发布', PRIMARY KEY (`id`), KEY `biaoshi` (`biaoshi`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='模型表'; -- ---------------------------- -- Table structure for jz_orders -- ---------------------------- DROP TABLE IF EXISTS `jz_orders`; CREATE TABLE `jz_orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `orderno` varchar(255) DEFAULT NULL COMMENT '订单号', `molds` varchar(50) DEFAULT 'orders' COMMENT '模型标识', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '下单会员', `paytype` varchar(20) DEFAULT NULL COMMENT '支付方式', `ptype` tinyint(1) DEFAULT '1' COMMENT '交易类型:1商品购买2充值金额3充值积分', `tel` varchar(50) DEFAULT NULL COMMENT '电话', `username` varchar(50) DEFAULT NULL COMMENT '用户名', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `price` varchar(200) DEFAULT NULL COMMENT '价格', `jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分', `qianbao` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '钱包', `body` text COMMENT '购买内容', `receive_username` varchar(50) DEFAULT NULL COMMENT '收件人', `receive_tel` varchar(20) DEFAULT NULL COMMENT '收件电话', `receive_email` varchar(50) DEFAULT NULL COMMENT '收件邮箱', `receive_address` varchar(255) DEFAULT NULL COMMENT '收件地址', `ispay` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否支付:1支付0未支付', `paytime` int(11) NOT NULL DEFAULT '0' COMMENT '支付时间', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '下单时间', `send_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '订单状态:1提交订单,2已支付,3超时,4已提交订单,5已发货,6已废弃失效,0删除订单', `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣', `yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; -- ---------------------------- -- Table structure for jz_page -- ---------------------------- DROP TABLE IF EXISTS `jz_page`; CREATE TABLE `jz_page` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `molds` varchar(50) DEFAULT 'page' COMMENT '模型标识', `htmlurl` varchar(50) DEFAULT NULL COMMENT '链接', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `tids` varchar(255) NOT NULL COMMENT '副栏目', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='单页模型'; -- ---------------------------- -- Table structure for jz_pictures -- ---------------------------- DROP TABLE IF EXISTS `jz_pictures`; CREATE TABLE `jz_pictures` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `path` varchar(20) DEFAULT 'Admin' COMMENT '板块:Admin后台Home前台', `filetype` varchar(20) DEFAULT NULL COMMENT '类型', `size` varchar(50) DEFAULT NULL COMMENT '大小', `litpic` varchar(255) DEFAULT NULL COMMENT '链接', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID/发布会员ID', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='图片集'; -- ---------------------------- -- Table structure for jz_pingjia -- ---------------------------- DROP TABLE IF EXISTS `jz_pingjia`; CREATE TABLE `jz_pingjia` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) DEFAULT '0' COMMENT '所属栏目', `tids` varchar(255) DEFAULT NULL COMMENT '副栏目', `title` varchar(255) DEFAULT NULL COMMENT '标题', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `description` varchar(500) DEFAULT NULL COMMENT '简介', `body` text COMMENT '内容', `molds` varchar(50) DEFAULT 'pingjia' COMMENT '模型标识', `userid` int(11) DEFAULT '0' COMMENT '发布管理员', `orders` int(11) DEFAULT '0' COMMENT '排序', `member_id` int(11) DEFAULT '0' COMMENT '前台用户', `comment_num` int(11) DEFAULT '0' COMMENT '评论数', `htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义URL', `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性', `hits` int(11) DEFAULT '0' COMMENT '点击量', `zan` int(11) DEFAULT '0' COMMENT '点赞数', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG', `addtime` int(11) DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `zhiye` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Table structure for jz_plugins -- ---------------------------- DROP TABLE IF EXISTS `jz_plugins`; CREATE TABLE `jz_plugins` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '插件名称', `filepath` varchar(50) DEFAULT NULL COMMENT '插件文件名', `description` varchar(255) DEFAULT NULL COMMENT '简介', `version` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '版本', `author` varchar(50) DEFAULT NULL COMMENT '作者', `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `module` varchar(20) NOT NULL DEFAULT 'Home' COMMENT '模块', `isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启:1开启0关闭', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `config` text COMMENT '配置', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件表'; -- ---------------------------- -- Table structure for jz_power -- ---------------------------- DROP TABLE IF EXISTS `jz_power`; CREATE TABLE `jz_power` ( `id` int(11) NOT NULL AUTO_INCREMENT, `action` varchar(50) DEFAULT NULL COMMENT '函数名', `name` varchar(50) DEFAULT NULL COMMENT '权限名', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限ID', `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开放', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户权限表'; -- ---------------------------- -- Table structure for jz_product -- ---------------------------- DROP TABLE IF EXISTS `jz_product`; CREATE TABLE `jz_product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'product' COMMENT '模型标识', `title` varchar(255) DEFAULT NULL COMMENT '商品名称', `seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `description` varchar(255) DEFAULT NULL COMMENT '简介', `litpic` varchar(255) DEFAULT NULL COMMENT '首图', `stock_num` int(11) NOT NULL DEFAULT '0' COMMENT '库存', `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格', `pictures` text COMMENT '图集', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示', `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数', `body` mediumtext COMMENT '详情', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '录入管理员ID', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐', `tids` varchar(255) DEFAULT NULL, `zan` int(11) DEFAULT '0', `lx` varchar(2) DEFAULT NULL, `color` varchar(2) DEFAULT NULL, `hy` varchar(500) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='商品表'; -- ---------------------------- -- Table structure for jz_recycle -- ---------------------------- DROP TABLE IF EXISTS `jz_recycle`; CREATE TABLE `jz_recycle` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标记', `molds` varchar(50) DEFAULT NULL COMMENT '回收模型标志', `data` mediumtext COMMENT '回收数据', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '关联删除', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='回收站'; -- ---------------------------- -- Table structure for jz_ruler -- ---------------------------- DROP TABLE IF EXISTS `jz_ruler`; CREATE TABLE `jz_ruler` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '权限名称', `fc` varchar(50) DEFAULT NULL COMMENT '函数', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限', `isdesktop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否桌面配置显示(已废弃)', `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '系统:1是0否', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色权限表'; -- ---------------------------- -- Table structure for jz_shouchang -- ---------------------------- DROP TABLE IF EXISTS `jz_shouchang`; CREATE TABLE `jz_shouchang` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户收藏表'; -- ---------------------------- -- Table structure for jz_sysconfig -- ---------------------------- DROP TABLE IF EXISTS `jz_sysconfig`; CREATE TABLE `jz_sysconfig` ( `id` int(11) NOT NULL AUTO_INCREMENT, `field` varchar(50) DEFAULT NULL COMMENT '配置字段', `title` varchar(255) DEFAULT NULL COMMENT '配置名称', `tip` varchar(255) DEFAULT NULL COMMENT '字段填写提示', `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '参数类型:1图片2单行文本3多行文本4编辑器5文件上传6下拉开启关闭选项7下拉是否选项8栏目选项9代码', `data` text COMMENT '配置内容', `typeid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '配置栏ID', `config` text COMMENT '单选多选配置信息', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `sys` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否系统字段', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统配置'; -- ---------------------------- -- Table structure for jz_tags -- ---------------------------- DROP TABLE IF EXISTS `jz_tags`; CREATE TABLE `jz_tags` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) DEFAULT '0' COMMENT '栏目ID', `tids` varchar(500) DEFAULT NULL COMMENT '相关栏目', `orders` int(11) DEFAULT '0' COMMENT '排序', `comment_num` int(11) DEFAULT '0' COMMENT '评论数', `molds` varchar(50) DEFAULT 'tags' COMMENT '模型标识', `htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接', `keywords` varchar(50) DEFAULT NULL COMMENT '关键词', `newname` varchar(50) DEFAULT NULL COMMENT '替换词(已废弃)', `num` int(4) DEFAULT '-1' COMMENT '替换次数:-1不限制', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示隐藏', `target` varchar(50) DEFAULT '_blank' COMMENT '外链', `number` int(11) DEFAULT '0' COMMENT '数量', `member_id` int(11) DEFAULT '0' COMMENT '发布会员', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='TAGS表'; -- ---------------------------- -- Table structure for jz_task -- ---------------------------- DROP TABLE IF EXISTS `jz_task`; CREATE TABLE `jz_task` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) DEFAULT '0' COMMENT '栏目ID', `aid` int(11) DEFAULT '0' COMMENT '文章ID', `userid` int(11) DEFAULT '0' COMMENT '发布会员', `puserid` int(11) DEFAULT '0' COMMENT '对象会员', `molds` varchar(50) DEFAULT NULL COMMENT '模块标识', `type` varchar(50) DEFAULT NULL COMMENT '消息类型', `body` varchar(255) DEFAULT NULL COMMENT '内容', `url` varchar(255) DEFAULT NULL COMMENT '链接', `isread` tinyint(1) DEFAULT '0' COMMENT '是否已读:1已读0未读', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `readtime` int(11) DEFAULT '0' COMMENT '阅读时间', `addtime` int(11) DEFAULT '0' COMMENT '发布时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员消息表'; -- ---------------------------- -- Records of jz_article -- ---------------------------- -- ---------------------------- -- Records of jz_attr -- ---------------------------- INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('1','置顶','1'); INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('2','热点','1'); INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('3','推荐','1'); -- ---------------------------- -- Records of jz_buylog -- ---------------------------- -- ---------------------------- -- Records of jz_cachedata -- ---------------------------- -- ---------------------------- -- Records of jz_chain -- ---------------------------- -- ---------------------------- -- Records of jz_classtype -- ---------------------------- -- ---------------------------- -- Records of jz_collect -- ---------------------------- -- ---------------------------- -- Records of jz_collect_type -- ---------------------------- -- ---------------------------- -- Records of jz_comment -- ---------------------------- -- ---------------------------- -- Records of jz_ctype -- ---------------------------- INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('1','基本设置','base',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('2','高级设置','high-level',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('3','搜索配置','searchconfig',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('4','邮件订单','email-order',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('5','支付配置','payconfig',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('6','公众号配置','wechatbind',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('7','积分配置','jifenset',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('8','图片水印','imagewatermark',1,1); -- ---------------------------- -- Records of jz_customurl -- ---------------------------- -- ---------------------------- -- Records of jz_fields -- ---------------------------- INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('1','url','links','链接地址', NULL,'1',',0,','255', NULL,'0','1','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('2','title','links','链接名称', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('3','email','message','联系邮箱', NULL,'1', NULL,'255', NULL,'0','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('4','keywords','tags','关键词','尽量简短,但不能重复','1', NULL,'50', NULL,'0','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('5','newname','tags','替换词','尽量简短,但不能重复,20字以内,可不填。【已废弃】','1', NULL,'50', NULL,'0','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('7','num','tags','替换次数','一篇文章内替换的次数,默认-1,全部替换【已废弃】','4', NULL,'4', NULL,'0','0','1','0','0','0', NULL,'-1','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('8','target','tags','打开方式', NULL,'7', NULL,'50','新窗口=_blank,本窗口=_self','0','0','1','0','0','0', NULL,'_blank','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('9','number','tags','标签数','无需填写,程序自动处理','4', NULL,'11', NULL,'0','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('10','member_id','article','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('11','member_id','product','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('12','member_id','links','发布用户','前台会员,无需填写','13', NULL,'11','3,username','0','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('13','target','links','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('14','ownurl','links','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('15','ownurl','tags','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('16','addtime','links','添加时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('17','addtime','tags','添加时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('43','molds','product','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('19','title','article','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0','250','1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('20','tid','article','所属栏目', NULL,'17', NULL,'13', NULL,'1','1','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('21','molds','article','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('22','htmlurl','article','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('23','keywords','article','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('24','description','article','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('25','seo_title','article','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('26','userid','article','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('27','litpic','article','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('28','body','article','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('29','addtime','article','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('30','orders','article','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('31','hits','article','点击量', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('32','isshow','article','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','1','1', NULL,'1','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('33','comment_num','article','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('34','istop','article','是否置顶:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('35','ishot','article','是否头条:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('36','istuijian','article','是否推荐:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('37','tags','article','Tags', NULL,'19',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('38','target','article','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('39','ownurl','article','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('40','jzattr','article','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','0','0','150','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('41','tids','article','副栏目', NULL,'18', NULL,'255', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('42','zan','article','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('44','title','product','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','100','0','300','1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('45','seo_title','product','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('46','tid','product','所属栏目', NULL,'17', NULL,'11', NULL,'1','0','1','1','1','1', NULL,'0','1','100','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('47','hits','product','点击量', NULL,'4',',0,10,','11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('48','htmlurl','product','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('49','keywords','product','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('50','description','product','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('51','litpic','product','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','100','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('52','stock_num','product','库存', NULL,'1', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('53','price','product','价格', NULL,'1', NULL,'10,2', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('54','pictures','product','图集', NULL,'6',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,', NULL, NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('55','isshow','product','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','0','1', NULL,'1','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('56','comment_num','product','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('57','body','product','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('58','userid','product','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('59','orders','product','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','100','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('60','addtime','product','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('61','istop','product','是否置顶:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('62','ishot','product','是否头条:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('63','istuijian','product','是否推荐:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('64','tags','product','Tags', NULL,'19', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('65','target','product','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('66','ownurl','product','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('67','jzattr','product','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','100','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('68','tids','product','副栏目', NULL,'18', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('69','zan','product','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('70','isshow','tags','是否显示', NULL,'7', NULL,'1','显示=1,隐藏=0,退回=2','0','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('71','lx','product','类型', NULL,'7',',1,6,7,','2','响应式=1,PC=2,手机=3,PC+手机=4,小程序=5','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('72','color','product','颜色', NULL,'7',',1,6,7,','2','红色=1,橙色=2,黄色=3,绿色=4,蓝色=5,紫色=6,粉色=7','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('73','hy','product','行业', NULL,'8',',1,6,7,','500','金融/证券=1,IT科技/软件=2,教育/培训=3,珠宝/工艺品=4,五金/机电=5,婚庆/摄影/美容=6,旅游/餐饮/美食=7,房产/汽车/运输=8,休闲/文化=9,医疗/生物/化工=10,儿童/游乐园=11,动物/宠物=12,鲜花/礼物=13,运动/俱乐部=14,生态/农业=15,建筑/装饰=16,广告/网站/设计=17,个人/导航/博客=18','2','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('74','title','pingjia','用户名','默认为空','1',',0,10,','255', NULL,'100','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('75','tid','pingjia','所属栏目','选择栏目','17',',10,','11', NULL,'100','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('76','tids','pingjia','副栏目','绑定后可以在当前模型的其他栏目中显示','18', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('77','keywords','pingjia','关键词','每个词用英文逗号(,)拼接','1', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('78','tags','pingjia','TAG','每个词用英文逗号(,)拼接','19', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('79','litpic','pingjia','头像','可留空','5',',0,10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('80','description','pingjia','简述','可留空','2',',0,10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('81','body','pingjia','内容','可留空','3',',10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('82','member_id','pingjia','发布会员','前台发布会员ID记录','13', NULL,'11','3,username','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('83','userid','pingjia','管理员','后台发布管理员ID记录','13', NULL,'11','11,name','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('84','target','pingjia','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('85','ownurl','pingjia','自定义URL','默认为空,自定义URL','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('86','hits','pingjia','点击量','系统自动添加','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('87','comment_num','pingjia','评论数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('88','zan','pingjia','点赞数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('89','addtime','pingjia','添加时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('90','jzattr','pingjia','推荐属性','1置顶2热点3推荐','16', NULL,'50','14,name','100','0','1','0','0','0', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('91','isshow','pingjia','是否显示','显示隐藏','7',',10,','1','显示=1,隐藏=0,退回=2','100','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('92','zhiye','pingjia','职业', NULL,'1',',10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('93','orders','pingjia','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (94, 'username', 'member', '用户昵称', NULL, 1, ',0,', '255', NULL, 2, 1, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (95, 'openid', 'member', '微信OPENID', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (96, 'sex', 'member', '性别', NULL, 12, ',0,', '2', '男=1,女=2,未知=0', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (97, 'gid', 'member', '会员分组', NULL, 13, ',0,', '11', '6,name', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (98, 'litpic', 'member', '会员头像', NULL, 5, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (99, 'tel', 'member', '电话号码', NULL, 1, ',0,', '12', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (100, 'jifen', 'member', '积分', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (101, 'money', 'member', '金币', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (102, 'email', 'member', '邮箱', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (103, 'province', 'member', '省份', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (104, 'city', 'member', '城市', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (105, 'address', 'member', '详细地址', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (106, 'regtime', 'member', '注册时间', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (107, 'logintime', 'member', '最近登录', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (108, 'signature', 'member', '个性签名', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (109, 'birthday', 'member', '生日', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (110, 'pid', 'member', '推荐人', NULL, 13, ',0,', '11', '3,username', 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (111, 'isshow', 'member', '状态', '封禁后不能登录', 7, ',0,', '2', '正常=1,封禁=0', 2, 0, 1, 1, 1, 1, NULL, '1', 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (112, 'title', 'message', '标题', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (113, 'user', 'message', '用户昵称', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 0, 1, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (114, 'tid', 'message', '相关栏目', NULL, 13, ',4,', '11', '2,classname', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (115, 'tel', 'message', '联系电话', NULL, 1, ',4,', '20', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (116, 'ip', 'message', '留言IP', NULL, 1, ',4,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (117, 'body', 'message', '留言内容', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (118, 'isshow', 'message', '是否审核', NULL, 7, ',4,', '1', '未审核=0,已审核=1', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (119, 'addtime', 'message', '提交时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (120, 'reply', 'message', '回复留言', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (121, 'uploadsize', 'member', '上传限制', '单位M,上传总文件大小限制,超过此大小不允许上传', 4, ',0,', '11', NULL, 2, 0, 0, 1, 0, 0, NULL, '0', 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('122','updatetime','article','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('123','updatetime','product','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('124','updatetime','pingjia','更新时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (125, 'updatetime', 'message', '更新时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('126','updatetime','links','更新时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('127','updatetime','tags','更新时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1'); -- ---------------------------- -- Records of jz_hook -- ---------------------------- -- ---------------------------- -- Records of jz_layout -- ---------------------------- INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('1','系统默认','[]','[{"name":"内容管理","icon":"&#xe6b4;","nav":[{"key":"16948","title":"内容列表","value":"9","icon":""},{"key":"12349","title":"商品列表","value":"105","icon":""},{"key":"19748","title":"推荐属性","value":"202","icon":""}]},{"name":"栏目管理","icon":"&#xe699;","nav":[{"key":"10518","title":"栏目列表","value":"42","icon":""}]},{"name":"互动管理","icon":"&#xe69b;","nav":[{"key":"11832","title":"留言列表","value":"22","icon":""},{"key":"11262","title":"评论列表","value":"16","icon":""}]},{"name":"SEO设置","icon":"&#xe6b3;","nav":[{"key":"16628","title":"TAG列表","value":"147","icon":""},{"key":"16214","title":"友情链接","value":"95","icon":""},{"key":"16254","title":"网站地图","value":"153","icon":""},{"key":"16917","title":"内链列表","value":"210","icon":""}]},{"name":"用户管理","icon":"&#xe6b8;","nav":[{"key":"11957","title":"会员列表","value":"2","icon":""},{"key":"15086","title":"会员分组","value":"118","icon":""},{"key":"10618","title":"会员权限","value":"123","icon":""},{"key":"17578","title":"管理员列表","value":"54","icon":""},{"key":"19552","title":"角色管理","value":"49","icon":""},{"key":"10895","title":"权限列表","value":"66","icon":""},{"key":"12582","title":"订单列表","value":"129","icon":""},{"key":"17076","title":"充值列表","value":"177","icon":""}]},{"name":"系统设置","icon":"&#xe6ae;","nav":[{"key":"11314","title":"网站设置","value":"40","icon":""},{"key":"10572","title":"桌面设置","value":"70","icon":""},{"key":"18242","title":"导航设置","value":"190","icon":""},{"key":"13002","title":"轮播图","value":"83","icon":""},{"key":"15936","title":"轮播图分类","value":"89","icon":""},{"key":"19847","title":"清理缓存","value":"114","icon":""},{"key":"12739","title":"模板列表","value":"223","icon":""},{"key":"127391","title":"配置栏目","value":"240","icon":""}]},{"name":"扩展管理","icon":"&#xe6ce;","nav":[{"key":"11957","title":"插件列表","value":"76","icon":""},{"key":"13870","title":"图库管理","value":"116","icon":""},{"key":"12472","title":"模型列表","value":"61","icon":""},{"key":"15551","title":"数据库备份","value":"35","icon":""},{"key":"16311","title":"碎片化","value":"194","icon":""},{"key":"18982","title":"公众号菜单","value":"141","icon":""},{"key":"14568","title":"公众号素材","value":"142","icon":""},{"key":"13219","title":"模板制作","value":"143","icon":""},{"key":"17893","title":"生成静态文件","value":"154","icon":""},{"key":"16926","title":"登录日志","value":"115","icon":""}]},{"name":"回收站","icon":"&#xe8a3;","nav":[{"key":"17056","title":"回收站","value":"217","icon":""}]},{"name":"评价管理","icon":"&#xe717;","nav":[{"key":"16835","title":"用户评价","value":"227","icon":""}]}]','0','CMS默认配置,不可删除!','1','1'); INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('2','旧版桌面','[]','[{"name":"网站管理","icon":"&#xe699;","nav":["42","9","95","83","147","22"]},{"name":"商品管理","icon":"&#xe698;","nav":["105","129","2","118","123","16","177"]},{"name":"扩展管理","icon":"&#xe6ce;","nav":["76","116","141","142","143","194","35","61","154","153"]},{"name":"系统设置","icon":"&#xe6ae;","nav":["40","54","49","190","70","115","114","66"]}]','0','旧版本配置','0','0'); -- ---------------------------- -- Records of jz_level -- ---------------------------- INSERT INTO `jz_level` (`id`,`name`,`pass`,`tel`,`gid`,`email`,`regtime`,`logintime`,`status`) VALUES ('1','admin','0acdd3e4a8a2a1f8aa3ac518313dab9d','13600136000','1','123456@qq.com','1635997469','1643156842','1'); -- ---------------------------- -- Records of jz_level_group -- ---------------------------- INSERT INTO `jz_level_group` (`id`,`name`,`isadmin`,`ischeck`,`classcontrol`,`paction`,`tids`,`isagree`,`description`) VALUES ('1','超级管理员','1','0','0',',Fields,', NULL,'1', NULL); -- ---------------------------- -- Records of jz_likes -- ---------------------------- -- ---------------------------- -- Records of jz_link_type -- ---------------------------- -- ---------------------------- -- Records of jz_links -- ---------------------------- -- ---------------------------- -- Records of jz_member -- ---------------------------- -- ---------------------------- -- Records of jz_member_group -- ---------------------------- INSERT INTO `jz_member_group` (`id`,`name`,`description`,`paction`,`pid`,`isagree`,`iscomment`,`ischeckmsg`,`addtime`,`orders`,`discount`,`discount_type`) VALUES ('1','注册会员','前台会员分组,最低等级分组',',Message,Comment,User,Order,Home,Common,Uploads,','0','1','1','1','0','0','0.00','0'); -- ---------------------------- -- Records of jz_menu -- ---------------------------- -- ---------------------------- -- Records of jz_message -- ---------------------------- -- ---------------------------- -- Records of jz_molds -- ---------------------------- INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('1','内容','article','1','1','1','1','1','1','article-list.html','article-details.html','100','0','1'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('2','栏目','classtype','1','1','1','1','1','1','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('3','会员','member','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('4','订单','orders','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('5','商品','product','1','1','1','1','1','1','list.html','details.html','100','0','1'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('6','会员分组','member_group','1','1','0','0','1','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('7','评论','comment','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('8','留言','message','1','1','0','0','1','1','message.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('9','轮播图','collect','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('10','友情链接','links','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('11','管理员','level','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('12','TAG','tags','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('13','单页','page','1','1','1','1','1','1','page.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('14','推荐属性','attr','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('15','用户评价','pingjia','0','1','0','1','1','1','lists.html','details.html','100','0','0'); -- ---------------------------- -- Records of jz_orders -- ---------------------------- -- ---------------------------- -- Records of jz_page -- ---------------------------- -- ---------------------------- -- Records of jz_pictures -- ---------------------------- -- ---------------------------- -- Records of jz_pingjia -- ---------------------------- -- ---------------------------- -- Records of jz_plugins -- ---------------------------- -- ---------------------------- -- Records of jz_power -- ---------------------------- INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('1','Common','公共权限','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('2','Home','前台网站','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('3','User','个人中心','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('4','Login','会员登录','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('5','Message','站内留言','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('6','Comment','会员评论','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('7','Screen','网站筛选','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('8','Order','会员下单','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('9','Mypay','网站支付','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('10','Jzpay','极致支付','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('11','Tags','TAG标签','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('12','Wechat','微信模块','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('13','Common/vercode','验证码生成','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('14','Common/checklogin','检查是否登录','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('15','Common/multiuploads','多附件上传','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('16','Common/uploads','单附件上传','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('17','Common/qrcode','二维码生成','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('18','Common/get_fields','获取扩展信息','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('19','Common/jizhi','链接错误提示','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('20','Common/error','报错提示','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('21','Home/index','网站首页','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('22','Home/jizhi','网站内容','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('23','Home/auto_url','自定义链接','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('24','Home/jizhi_details','详情内容','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('25','Home/search','网站搜索','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('26','Home/searchAll','网站多模块搜索','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('27','Home/start_cache','开启网站缓存','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('28','Home/end_cache','输出缓存','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('29','User/checklogin','检查是否登录','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('30','User/index','个人中心首页','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('31','User/userinfo','会员资料','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('32','User/orders','订单记录','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('33','User/orderdetails','订单详情','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('34','User/payment','订单支付','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('35','User/orderdel','删除订单','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('36','User/changeimg','上传头像','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('37','User/comment','评论列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('38','User/commentdel','删除评论','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('39','User/likesAction','点赞文章','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('40','User/likes','点赞列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('41','User/likesdel','取消点赞','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('42','User/collectAction','收藏文章','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('43','User/collect','收藏列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('44','User/collectdel','删除收藏','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('45','User/cart','购物车','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('46','User/addcart','添加购物车','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('47','User/delcart','删除购物车','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('48','User/posts','发布管理','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('49','User/release','会员发布','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('50','User/del','删除发布','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('51','User/uploads','会员上传附件','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('52','User/jizhi','404提示','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('53','User/follow','关注用户','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('54','User/nofollow','取消关注','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('55','User/fans','粉丝列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('56','User/notify','消息提醒','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('57','User/notifyto','查看消息','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('58','User/notifydel','删除消息','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('59','User/active','公共主页','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('60','User/setmsg','消息提醒设置','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('61','User/getclass','获取栏目列表','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('62','User/wallet','用户钱包','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('63','User/buy','会员充值','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('64','User/buylist','充值列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('65','User/buydetails','交易详情','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('66','Login/index','登录首页','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('67','Login/register','注册页面','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('68','Login/forget','忘记密码','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('69','Login/nologin','未登录页面','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('70','Login/loginout','退出登录','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('71','Message/index','发送留言','5','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('72','Comment/index','发表评论','6','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('73','Screen/index','筛选列表','7','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('74','Order/create','创建订单','8','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('75','Order/pay','订单支付','8','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('76','Tags/index','TAG标签列表','11','1'); -- ---------------------------- -- Records of jz_product -- ---------------------------- -- ---------------------------- -- Records of jz_recycle -- ---------------------------- -- ---------------------------- -- Records of jz_ruler -- ---------------------------- INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('1','会员管理','Member','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('2','会员列表','Member/index','1','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('3','添加会员','Member/memberadd','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('4','修改会员','Member/memberedit','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('5','删除会员','Member/member_del','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('6','批量删除','Member/deleteAll','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('7','修改状态','Member/change_status','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('8','内容管理','Article','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('9','内容列表','Article/articlelist','8','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('10','添加内容','Article/addarticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('11','修改内容','Article/editarticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('12','删除内容','Article/deletearticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('13','批量删除','Article/deleteAll','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('14','复制内容','Article/copyarticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('15','评论管理','Comment','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('16','评论列表','Comment/commentlist','15','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('17','添加评论','Comment/addcomment','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('18','修改评论','Comment/editcomment','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('19','删除评论','Comment/deletecomment','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('20','批量删除','Comment/deleteAll','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('21','留言管理','Message','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('22','留言列表','Message/messagelist','21','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('23','修改留言','Message/editmessage','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('24','删除留言','Message/deletemessage','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('25','批量删除','Message/deleteAll','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('26','字段管理','Fields','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('27','字段列表','Fields/index','26','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('28','新增字段','Fields/addFields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('29','修改字段','Fields/editFields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('30','删除字段','Fields/deleteFields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('31','获取字段','Fields/get_fields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('32','基本功能','Index','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('33','系统界面','Index/index','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('34','后台首页','Index/welcome','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('35','数据库备份','Index/beifen','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('36','数据库备份','Index/backup','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('37','数据库还原','Index/huanyuan','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('38','数据库删除','Index/shanchu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('39','系统功能','Sys','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('40','网站设置','Sys/index','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('41','栏目管理','Classtype','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('42','栏目列表','Classtype/index','41','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('43','新增栏目','Classtype/addclass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('44','修改栏目','Classtype/editclass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('45','删除栏目','Classtype/deleteclass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('46','修改排序','Classtype/editClassOrders','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('47','栏目隐藏','Classtype/change_status','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('48','管理员管理','Admin','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('49','角色管理','Admin/group','48','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('50','新增角色','Admin/groupadd','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('51','修改角色','Admin/groupedit','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('52','删除角色','Admin/group_del','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('53','角色状态','Admin/change_group_status','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('54','管理员列表','Admin/adminlist','48','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('55','新增管理员','Admin/adminadd','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('56','修改管理员','Admin/adminedit','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('57','管理员状态','Admin/change_status','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('58','删除管理员','Admin/admindelete','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('59','个人信息','Index/details','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('60','模型管理','Molds','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('61','模型列表','Molds/index','60','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('62','新增模型','Molds/addMolds','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('63','修改模型','Molds/editMolds','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('64','删除模型','Molds/deleteMolds','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('65','权限管理','Rulers','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('66','权限列表','Rulers/index','65','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('67','新增权限','Rulers/addrulers','65','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('68','修改权限','Rulers/editrulers','65','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('69','删除权限','Rulers/deleterulers','65','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('70','桌面设置','Index/desktop','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('71','新增桌面','Index/desktop_add','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('72','修改桌面','Index/desktop_edit','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('73','删除桌面','Index/desktop_del','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('74','图标库','Index/unicode','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('75','插件管理','Plugins','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('76','插件列表','Plugins/index','75','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('77','模块扩展','Extmolds','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('82','轮播图','Collect','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('83','轮播图','Collect/index','82','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('84','新增轮播图','Collect/addcollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('85','修改轮播图','Collect/editcollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('86','删除轮播图','Collect/deletecollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('87','复制轮播图','Collect/copycollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('88','批量删除轮播图','Collect/deleteAll','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('89','轮播图分类','Collect/collectType','82','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('90','新增轮播图分类','Collect/collectTypeAdd','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('91','修改轮播图分类','Collect/collectTypeEdit','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('92','删除轮播图分类','Collect/collectTypeDelete','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('93','批量复制','Article/copyAll','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('94','批量修改栏目','Article/changeType','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('95','友情链接','Links/index','189','1','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('96','新增友链','Links/addlinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('97','修改友链','Links/editlinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('98','复制友链','Links/copylinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('99','删除友链','Links/deletelinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('100','批量删除友链','Links/deleteAll','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('101','通用模块','Common','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('102','上传文件','Common/uploads','101','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('103','更新cookie','Index/update_session_maxlifetime','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('104','商品管理','Product','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('105','商品列表','Product/productlist','104','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('106','新增商品','Product/addproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('107','修改商品','Product/editproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('108','删除商品','Product/deleteproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('109','复制商品','Product/copyproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('110','批量删除','Product/deleteAll','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('111','批量复制','Product/copyAll','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('112','修改栏目','Product/changeType','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('113','修改排序','Product/editProductOrders','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('114','清理缓存','Index/cleanCache','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('115','登录日志','Sys/loginlog','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('116','图库管理','Sys/pictures','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('117','修改排序','Extmolds/editOrders','77','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('118','会员分组','Member/membergroup','1','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('119','新增分组','Member/groupadd','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('120','修改分组','Member/groupedit','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('121','更改分组状态','Member/change_group_status','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('122','删除分组','Member/group_del','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('123','会员权限','Member/power','1','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('124','添加权限','Member/addrulers','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('125','修改权限','Member/editrulers','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('126','删除权限','Member/deleterulers','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('127','修改分组排序','Member/editOrders','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('128','订单管理','Order','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('129','订单列表','Order/index','128','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('130','订单详情','Order/details','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('131','批量删除','Order/deleteAll','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('132','上传支付证书','Sys/uploadcert','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('133','更改状态','Plugins/change_status','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('134','安装卸载','Plugins/action_do','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('223','模板列表','Template/index','222','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('222','模板管理','Template','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('137','删除图库图片','Sys/deletePic','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('138','批量删除图库','Sys/deletePicAll','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('139','安装说明','Plugins/desc','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('140','微信公众号','Wechat','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('141','公众号菜单','Wechat/wxcaidan','140','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('142','公众号素材','Wechat/sucai','140','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('143','模板制作','Index/showlabel','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('144','获取首字母拼音','Classtype/get_pinyin','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('145','批量新增栏目','Classtype/addmany','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('146','自定义配置删除','Sys/custom_del','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('147','TAG列表','Extmolds/index/molds/tags','77','1','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('148','新增TAG','Extmolds/addmolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('149','修改TAG','Extmolds/editmolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('150','复制TAG','Extmolds/copymolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('151','删除TAG','Extmolds/deletemolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('152','批量删除TAG','Extmolds/deleteAll/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('153','网站地图','Index/sitemap','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('154','生成静态文件','Index/tohtml','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('155','更新栏目HTML','Index/html_classtype','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('156','更新模块HTML','Index/html_molds','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('157','批量修改推荐属性','Article/changeAttribute','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('158','批量修改推荐属性','Product/changeAttribute','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('159','批量修改友链栏目','Links/changeType','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('160','批量修改TAG栏目','Extmolds/changeType/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('161','批量复制友链','Links/copyAll','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('162','批量复制TAG','Extmolds/copyAll/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('163','批量修改友链排序','Links/editOrders','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('164','批量修改TAG排序','Extmolds/editOrders/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('165','删除订单','Order/deleteorder','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('166','批量删除','Admin/deleteAll','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('167','高级设置','Sys/ctype/type/high-level','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('168','邮箱订单','Sys/ctype/type/email-order','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('169','支付配置','Sys/ctype/type/payconfig','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('170','公众号配置','Sys/ctype/type/wechatbind','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('171','批量审核','Article/checkAll','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('172','批量审核','Product/checkAll','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('173','批量审核','Message/checkAll','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('174','批量审核','Comment/checkAll','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('175','批量审核友链','Links/checkAll','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('176','批量审核TAG','Extmolds/checkAll/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('177','充值列表','Order/czlist','128','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('178','手动充值','Order/chongzhi','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('179','删除记录','Order/delbuylog','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('180','批量删除记录','Order/delAllbuylog','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('181','积分配置','Sys/ctype/type/jifenset','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('182','插件更新','Plugins/update','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('183','获取栏目模板','Classtype/get_html','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('184','批量修改栏目','Classtype/changeClass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('185','友链分类','Links/linktype','189','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('186','新增友链分类','Links/linktypeadd','189','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('187','修改友链分类','Links/linktypeedit','189','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('188','删除友链分类','Links/linktypedelete','189','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('189','友情链接','Links','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('190','导航设置','Index/menu','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('191','新增导航','Index/addmenu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('192','修改导航','Index/editmenu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('193','删除导航','Index/delmenu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('194','碎片化','Sys/datacache','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('195','新增碎片','Sys/addcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('196','修改碎片','Sys/editcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('197','删除碎片','Sys/delcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('198','预览SQL','Sys/viewcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('199','搜索配置','Sys/ctype/type/searchconfig','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('200','修改字段属性','Fields/editFieldsValue','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('201','推荐属性','Jzattr','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('202','推荐属性','Jzattr/index','201','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('203','新增推荐属性','Jzattr/addAttr','201','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('204','修改推荐属性','Jzattr/editAttr','201','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('205','删除推荐属性','Jzattr/delAttr','201','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('206','修改状态','Jzattr/changeStatus','201','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('207','列表设置','Fields/fieldsList','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('208','获取列表字段','Fields/fieldsList','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('209','内链模块','Jzchain','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('210','内链列表','Jzchain/index','209','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('211','新增内链','Jzchain/addchain','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('212','修改内链','Jzchain/editchain','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('213','删除内链','Jzchain/delchain','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('214','批量删除','Jzchain/delAll','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('215','修改状态','Jzchain/changeStatus','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('216','回收站','Recycle','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('217','回收站','Recycle/index','216','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('218','恢复数据','Recycle/restore','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('219','删除数据','Recycle/del','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('220','批量删除','Recycle/delAll','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('221','批量恢复','Recycle/restoreAll','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('224','安装卸载','Template/actionDo','222','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('225','安装说明','Template/desc','222','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('226','模板更新','Template/update','222','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('227','用户评价列表','Extmolds/index/molds/pingjia','77','1','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('228','新增用户评价','Extmolds/addmolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('229','修改用户评价','Extmolds/editmolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('230','复制用户评价','Extmolds/copymolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('231','删除用户评价','Extmolds/deletemolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('232','批量删除用户评价','Extmolds/deleteAll/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('233','批量修改用户评价栏目','Extmolds/changeType/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('234','批量复制用户评价','Extmolds/copyAll/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('235','批量修改用户评价列表','Extmolds/editOrders/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('236','批量审核用户评价','Extmolds/checkAll/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('237','重构字段','Molds/restrucFields','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('238','基本配置','Sys/ctype/type/base','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('239','批量修改评价推荐属性','Extmolds/changeAttribute/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('240','配置栏目','Sys/systype','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('241','设置配置状态','Sys/systypestatus','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('242','修改配置分组','Sys/editctype','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('243','新增配置分组','Sys/addctype','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('244','全局配置','Sys/ctype','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('245','修改配置字段','Sys/setfield','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('246','绑定模块数据获取','Fields/getSelect','26',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('247','编辑器上传','Uploads','0',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('248','上传功能','Uploads/index','247',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('249','获取子栏目','Classtype/getchildren','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('250','获取联动数据','Fields/getliandong','26','0','1'); -- ---------------------------- -- Records of jz_shouchang -- ---------------------------- -- ---------------------------- -- Records of jz_sysconfig -- ---------------------------- INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('1','web_version','系统版号','版本号是系统自带,请勿改动','0','2.5.6','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('2','web_name','网站SEO名称','控制在25个字、50个字节以内','2','极致CMS建站系统','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('3','web_keyword','网站SEO关键词','5个左右,8汉字以内,用英文逗号隔开','2','极致建站,cms,开源cms,免费cms,cms系统,phpcms,免费企业建站,建站系统,企业cms,jizhicms,极致cms,建站cms,建站系统,极致博客,极致blog,内容管理系统','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('4','web_desc','网站SEO描述','控制在80个汉字,160个字符以内','3','极致CMS是开源免费的PHPCMS网站内容管理系统,无商业授权,简单易用,提供丰富的插件,帮您实现零基础搭建不同类型网站(企业站,门户站,个人博客站等),是您建站的好帮手。极速建站,就选极致CMS。','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('5','web_js','统计代码','将百度统计、cnzz等平台的流量统计JS代码放到这里','8', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('6','web_copyright','底部版权','如:© 2016 xxx版权','2','@2020-2099','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('7','web_beian','备案号','如:京ICP备00000000号','2','冀ICP备88888号','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('8','web_tel','网站电话','网站联系电话','2','0666-8888888','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('9','web_tel_400','400电话','400电话','2','400-0000-000','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('10','web_qq','网站QQ','网站QQ','2','12345678','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('11','web_email','网站邮箱','网站邮箱','2','123456@qq.com','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('12','web_address','公司地址','公司地址','2','河北省廊坊市广阳区xxx大厦xx楼001号','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('13','pc_template','PC网站模板','将模板名称填写到此处','2','cms','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('14','wap_template','WAP网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板','2','cms','2',NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('15','weixin_template','微信网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板','2','cms','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('16','iswap','是否开启手机端','如果不开启手机端,则默认调用电脑端模板','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('17','isopenhomeupload','是否开启前台上传','关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('18','isopenhomepower','是否开启前台权限','开启后前台用户权限可以在后台控制','6','0','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('19','cache_time','缓存时间','单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。','2','0','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('20','fileSize','限制上传文件大小','0代表不限,单位kb','2','0','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('21','fileType','允许上传文件类型','请用|分割,如:pdf|jpg|png','2','pdf|jpg|jpeg|png|zip|rar|gzip|doc|docx|xlsx','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('22','ueditor_config','后台编辑器导航条配置', "后台UEditor编辑器导航条配置",'3','"fullscreen", "source","undo", "redo","bold", "italic", "underline", "fontborder", "strikethrough", "super", "removeformat", "formatmatch", "autotypeset", "blockquote", "pasteplain","forecolor", "backcolor", "insertorderedlist", "insertunorderedlist", "selectall", "cleardoc","rowspacingtop", "rowspacingbottom", "lineheight","customstyle", "paragraph", "fontfamily", "fontsize","directionalityltr", "directionalityrtl", "indent","justifyleft", "justifycenter", "justifyright", "justifyjustify","touppercase", "tolowercase","link", "unlink", "anchor", "imagenone", "imageleft", "imageright", "imagecenter","simpleupload", "insertimage", "emotion", "scrawl", "insertvideo", "music", "attachment", "map", "gmap", "insertframe", "insertcode", "webapp", "pagebreak","template", "background","horizontal", "date", "time", "spechars", "snapscreen", "wordimage","inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol", "mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "charts","print", "preview", "searchreplace", "help", "drafts"','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('23','search_table','允许前台搜索的表','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('24','imagequlity','上传图片压缩比例','100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80','6','75','2','不压缩使用原图=100,95%=95,90%=90,85%=85,80%=80,75%=75,70%=70,65%=65,60%=60,55%=55,50%=50','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('25','ispngcompress','PNG是否压缩','PNG压缩后容易变成背景黑色,关闭后,不会压缩。','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('26','email_server','邮件服务器','smtp.163.com,smtp.qq.com','2','smtp.163.com','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('27','email_port','邮件收发端口','163、126邮件端口(465),QQ邮件端口(587)','2','465','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('28','shou_email','收件人Email地址', NULL,'2', NULL,'4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('29','send_email','发件人Email地址','指邮件服务器发件邮箱','2', NULL,'4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('30','send_pass','发件人Email秘钥','这个秘钥不是登录密码','2', NULL,'4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('31','send_name','发件人昵称','发件邮箱会带一个昵称','2','极致建站系统','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('32','tj_msg','客户订单通知','购买商品的时候会发送的一条邮件信息','3','尊敬的{xxx},我们已经收到您的订单!请留意您的电子邮件以获得最新消息,谢谢您!','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('33','send_msg','订单出货通知','发货的时候发送给客户的通知','3','尊敬的{xxx},我们已确认了您的订单,请于3日内汇款,逾期恕不保留,不便请见谅。汇款完成后,烦请告知客服人员您的交易账号后五位,即完成下单手续,谢谢您。','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('34','yunfei','订单运费','购物下单时会加上这个运费','2','0.00','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('35','paytype','在线支付','0关闭支付,1自主平台支付','6','0','5','关闭=0,开启=1','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('40','alipay_partner','支付宝APPID','账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('41','alipay_key','支付宝key','MD5密钥,安全检验码,由数字和字母组成的32位字符串','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('42','alipay_private_key','支付宝私钥', NULL,'3', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('43','alipay_public_key','支付宝公钥', NULL,'3', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('44','wx_mchid','微信商户mchid','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('45','wx_key','微信商户key','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('46','wx_appid','微信公众号appid','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('47','wx_appsecret','微信公众号appsecret','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('48','wx_client_cert','微信apiclient_cert','支付相关','5', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('49','wx_client_key','微信apiclient_key','支付相关','5', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('50','wx_login_appid','公众号appid','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('51','wx_login_appsecret','公众号appsecret','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('52','wx_login_token','公众号token','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('53','huanying','公众号关注欢迎语','公众号关注时发送的第一句推送','3','欢迎关注公众号~','6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('54','wx_token','公众号token','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('55','web_logo','网站LOGO', NULL,'1','/static/cms/static/images/logo.png','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('56','admintpl','后台模板风格','内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。','6','default','2','内页弹窗=default,内嵌页面=tpl','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('59','domain','网站SEO网址','一般不填,全局网址,最后不带/,如:http://www.xxx.com','2', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('61','overtime','订单超时','按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制','2','4','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('62','islevelurl','开启层级URL','默认关闭层级URL,开启后URL会按照父类层级展现','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('63','iscachepage','缓存完整页面','前台完整页面缓存,结合缓存时间,可以提高访问速度','6','1','0','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('64','isautohtml','自动生成静态','前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面','0','0','0','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('65','pc_html','PC静态文件目录','电脑端静态HTML存放目录,默认根目录[ / ]','2','/','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('66','mobile_html','WAP静态文件目录','手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱','2','m','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('67','autocheckmessage','是否留言自动审核','开启后,留言自动审核(显示)','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('68','autocheckcomment','是否评论自动审核','开启后评论自动审核(显示)','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('69','mingan','网站敏感词过滤','将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容','3', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('70','iswatermark','是否开启水印','开启水印后水印图片优先,如果没有图片则使用水印文字','6','0','8','开启=1,关闭=0','100','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('71','watermark_file','水印图片','水印图片在250px以内','1', NULL,'8', NULL,'99','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('72','watermark_t','水印位置','参考键盘九宫格1-9','2','9','8', NULL,'98','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('73','watermark_tm','水印透明度','透明度越大,越难看清楚水印','6','0','8','不显示=0,10%=10,20%=20,30%=30,40%=40,50%=50,60%=60,70%=70,80%=80,90%=90','97','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('74','money_exchange','钱包兑换率','站内钱包与RMB的兑换率,即1元=多少金币','2','1','5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('75','jifen_exchange','积分兑换率','站内积分与RMB的兑换率,即1元=多少积分','2','100','5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('76','isopenjifen','积分支付','开启积分支付后,商品可以用积分支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('77','isopenqianbao','钱包支付','开启钱包支付后,商品可以用钱包支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('78','isopenweixin','微信支付','开启微信支付后,商品可以用微信支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('79','isopenzfb','支付宝支付','开启支付宝支付后,商品可以用支付宝支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('80','login_award','每次登录奖励','每天登录奖励积分数,最小为0,每天登录只奖励一次','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('81','login_award_open','登录奖励','开启登录奖励后,登录后就会获得积分奖励','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('82','release_award_open','发布奖励','开启后,发布内容会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('83','release_award','每次发布奖励','每次发布内容奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('84','release_max_award','每天发布最高奖励','每天奖励不超过积分上限,设置0则无上限','2','0','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('85','collect_award_open','收藏奖励','开启后,发布内容被收藏会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('86','collect_award','每次收藏奖励','每次发布内容被收藏奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('87','collect_max_award','每天收藏最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('88','likes_award_open','点赞奖励','开启后,发布内容被点赞会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('89','likes_award','每次点赞奖励','每次发布内容被点赞奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('90','likes_max_award','每天点赞最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('91','comment_award_open','评论奖励','开启后,发布内容被评论会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('92','comment_award','每次评论奖励','每次发布内容被评论奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('93','comment_max_award','每天评论最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('94','follow_award_open','关注奖励','开启后,用户被粉丝关注会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('95','follow_award','每次关注奖励','每次被关注奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('96','follow_max_award','每天关注最高奖励','每天关注奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('97','isopenemail','发送邮件','是否开启邮件发送','6','1','4','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('98','closeweb','关闭网站','关闭网站后,前台无法访问,后台可以进入','6','0','1','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('99','closetip','关站提示', NULL,'3','抱歉!该站点已经被管理员停止运行,请联系管理员了解详情!','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('100','admin_save_path','后台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('101','home_save_path','前台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('102','isajax','是否开启前台AJAX','开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据','6','0','2', '开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('104','invite_award_open','是否开启邀请奖励','开启邀请后则会奖励','6','0','7', '开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('105','invite_type','邀请奖励类型', NULL,'6','jifen','7', '积分=jifen,金币=money','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('106','invite_award','邀请奖励数量', NULL,'2','0','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('107','web_phone','网站手机', NULL,'2','0','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('108','web_weixin','站长微信', NULL,'1', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('110','isregister','前台用户注册','关闭前台注册后,前台无法进入注册页面','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('111','onlyinvite','仅邀请码注册','开启后,必须通过邀请链接才能注册!','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('112','release_table','允许前台发布模块','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割','2','article|product','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('113','search_words','前台搜索的字段','可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割','2','title','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('114','closehomevercode','前台验证码','关闭后,登录注册不需要验证码','6','0','2','关闭=1,开启=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('115','closeadminvercode','后台验证码','关闭后,后台管理员登录不需要验证码','6','0','2','关闭=1,开启=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('116','tag_table','TAG包含模型','在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product','2','article|product','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('118','isopendmf','支付宝当面付', NULL,'6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('119','search_words_muti','前台多模块搜索的字段','多个模块直接必须都有相同的字段,否则会报错','3','title','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('120','search_table_muti','多模块允许搜索的表','防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('121','search_fields_muti','允许查询显示的字段','多模块搜索允许查询显示的字段','3','id,tid,litpic,title,tags,keywords,molds,htmlurl,description,addtime,userid,member_id,hits,ownurl,target','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('122','ueditor_user_config','前台编辑器设置','前台的编辑器功能菜单设置','3','"undo", "redo", "|","paragraph","bold","forecolor","fontfamily","fontsize", "italic", "blockquote", "insertparagraph", "justifyleft", "justifycenter", "justifyright","justifyjustify","|","indent", "insertorderedlist", "insertunorderedlist","|", "insertimage", "inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol","mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "|","drafts", "|","fullscreen"','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('123','article_config','内容配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('124','product_config','商品配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('125','isdebug','PHP调试','测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('126','plugins_config','插件配置', NULL,'2','http://api.jizhicms.cn/plugins.php','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('127','template_config','插件配置', NULL,'2','http://api.jizhicms.cn/template.php','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('128','closesession','前台SESSION','关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以关闭,使用会员支付等必须开启','6','0','2','关闭=1,开启=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('129','messageyzm','留言验证码','开启后,前台留言需要填写验证码','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('130','homerelease','前台发布审核','开启后需要后台审核,关闭则不需要','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('131','hideclasspath','栏目隐藏.html','开启后栏目链接将没有.html后缀','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('132','classtypemaxlevel','栏目全局递归','默认开启,栏目超过20个,请关闭此选项,有一定程度提升访问速度!','6','0','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('133','hidetitleonliy','字段重复检测', '将【模块标识-检测字段】填写进去,用|进行分割,将会进行标题重复检测。如:article-title|product-title','2','article-title|product-title','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('134','onlyuserupload','会员上传限制','开启后,仅会员才可以上传!受会员上传大小限制!','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('135','cachefilenum','缓存文件数','0表示不限制,最大不超过500','2','100','0',null,0,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('136','watermark_word','水印文字','只有没有水印图片的时候才生效','2','这个是水印文字','8',null,96,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('137','watermark_font','水印字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,95,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('138','watermark_size','水印大小','默认24','2','24','8',null,94,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('139','watermark_h','水印行高','默认34','2','34','8',null,93,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('140','watermark_rgb','水印颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,92,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('141','watermark_x','水印微调X','相对水印位置再进行X轴微调,默认0','2','0','8',null,91,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('142','watermark_y','水印微调Y','相对水印位置再进行Y轴微调,默认0','2','10','8',null,90,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('143','text_waterlitpic','缩略图标题水印','文章缩略图进行水印文章标题,开启后生效','6','0','8','开启=1,关闭=0',89,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('144','text_litpic','默认缩略图','当文章没有缩略图的时候生效','1',null,'8',null,88,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('145','text_molds','支持模型','填写模型标识,如:article,product','2','article,product','8',null,87,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('146','text_num','每行文字数','默认10个字','2','10','8',null,86,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('147','text_size','文字大小','默认24','2','24','8',null,85,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('148','text_h','文字行高','默认34','2','34','8',null,84,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('149','text_rgb','文字颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,83,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('150','text_font','文字字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,82,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('151','text_wz','水印位置','九宫格1-9,默认5中间','2','5','8',null,81,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('152','text_x','微调X','相对于水印位置再进行X轴微调,默认0','2','0','8',null,80,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('153','text_y','微调Y','相对于水印位置再进行Y轴微调,默认0','2','0','8',null,79,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('154','islocal','是否开启图片本地化','图片本地化可以将内容的外网图片保存到服务器','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('155','openredis','是否开启Redis','开启Redis后可以使用token登录前台账户,但必须服务器安装了Redis,在config里面需要配置redis信息','6','0','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('156','sitemap_config','sitemap配置','用于sitemap生成','3','a:3:{s:9:"page_size";i:10000;s:7:"tagsurl";s:19:"/tags/index?id={id}";s:8:"filetype";s:3:"xml";}','0','','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('157','schedule_table','定时发布表','带有addtime发布时间字段的表才可以使用定时发布功能,用|分隔','3','article|product','2','','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('158','upload_file_name','上传文件重命名','上传文件后是否重命名,默认开启重命名,关闭后上传文件名不会变','6','1','2','开启=1,关闭=0','1','1'); -- ---------------------------- -- Records of jz_tags -- ---------------------------- -- ---------------------------- -- Records of jz_task -- ---------------------------- ================================================ FILE: install/index.php ================================================ // +---------------------------------------------------------------------- // | Date:2018/05 // +---------------------------------------------------------------------- //安装程序 //error_reporting(0); //检查是否已安装 if(file_exists('install.lock')){ exit('很抱歉,程序已安装,如需重新安装请删除install/install.lock'); } //状态 $errmsg=0; //相关方法 function check_disable(){ $string=ini_get("disable_functions"); if(strpos($string,'opendir')!==false){ $GLOBALS['errmsg']=1; return '关闭中!'; }else{ return '开启'; } } function check_chinese(){ if(preg_match('/[\x{4e00}-\x{9fa5}]/u', $_SERVER['DOCUMENT_ROOT'])>0){ $GLOBALS['errmsg']=1; return '网站路径中不能含有中文!'; }else{ return $_SERVER['DOCUMENT_ROOT']; } } function check_version(){ if (PHP_VERSION < 5.6) { $GLOBALS['errmsg']=1; return ''.PHP_VERSION.'不满足'; }else if(PHP_VERSION > 7.5){ $GLOBALS['errmsg']=1; return ''.PHP_VERSION.'不满足'; }else{ return PHP_VERSION; } } //检查目录是否可写入 function new_is_writeable($file) { if (is_dir($file)){ $dir = $file; if ($fp = @fopen("$dir/test.txt", 'w')) { @fclose($fp); @unlink("$dir/test.txt"); $writeable = 1; } else { $writeable = 0; $GLOBALS['errmsg']=1; } } else { if ($fp = @fopen($file, 'a+')) { @fclose($fp); $writeable = 1; } else { $writeable = 0; $GLOBALS['errmsg']=1; } } return $writeable; } //获取后台文件名 function get_admin_url(){ $data = file_get_contents("../index.php"); if(stripos($data,'ADMIN_MODEL')!==false){ $r = preg_match("/define\('ADMIN_MODEL',[\'|\"](.*?)[\'|\"]\)/",$data,$matches); if($r){ $admins = $matches[1]; }else{ $admins = 'admins'; } }else{ $admins = 'admins'; } return 'index.php/'.$admins; } //获取域名 function GetIP(){ static $ip = ''; $ip = $_SERVER['REMOTE_ADDR']; if(isset($_SERVER['HTTP_CDN_SRC_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CDN_SRC_IP'])) { $ip = $_SERVER['HTTP_CDN_SRC_IP']; } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) { foreach ($matches[0] AS $xip) { if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) { $ip = $xip; break; } } } return $ip; } //获取域名 function get_domain(){ if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') { $protocol = "https://"; } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $protocol = "https://"; } elseif ( ! empty($_SERVER['HTTP_FROM_HTTPS']) && strtolower($_SERVER['HTTP_FROM_HTTPS']) !== 'off') { $protocol = "https://"; } elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') { $protocol = "https://"; }else if(!empty($_SERVER['HTTP_X_CLIENT_SCHEME']) && $_SERVER['HTTP_X_CLIENT_SCHEME']=='https'){ $protocol = "https://"; }else{ $protocol = "http://"; } if(isset($_SERVER['SERVER_PORT'])) { $port = ':' . $_SERVER['SERVER_PORT']; if((':80' == $port && 'http://' == $protocol) || (':443' == $port && 'https://' == $protocol)) { $port = ''; } }else{ $port = ''; } if(isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { $host = $_SERVER['HTTP_X_FORWARDED_HOST'].$port; }else if (isset($_SERVER['HTTP_HOST'])) { $host = $_SERVER['HTTP_HOST'].$port; }else if(isset($_SERVER['SERVER_NAME'])) { $host = $_SERVER['SERVER_NAME'].$port; }else if(isset($_SERVER['SERVER_ADDR'])) { $host = $_SERVER['SERVER_ADDR'].$port; } return $protocol.$host; } /** * 解析SQL文件为SQL语句数组 * @param string $path * @return array|mixed|string */ function parseSQL($path = '') { $sql = file_get_contents($path); //替换掉15个字符串 $sql = substr($sql,14); $sql = explode("\r\n", $sql); //先消除--注释 $sql = array_filter($sql, function ($data) { if (empty($data) || preg_match('/^--.*/', $data)) { return false; } else { return true; } }); $sql = implode('', $sql); //删除/**/注释 $sql = preg_replace('/\/\*.*\*\//', '', $sql); return $sql; } //检查是否有模板v1.9.x版本新增 function checktemplate(){ $dir = '../static'; $fileArray=array(); if (false != ($handle = opendir ( $dir ))) { while ( false !== ($file = readdir ( $handle )) ) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != ".." && strpos($file,'.')===false && file_exists($dir.'/'.$file.'/info.php') && is_dir($dir.'/'.$file.'/backup')) { $fileArray[]=$file; } } //关闭句柄 closedir ( $handle ); } $dblist = []; foreach($fileArray as $v){ $dir = '../static/'.$v.'/backup'; if (false != ($handle = opendir ( $dir ))) { $i=0; while ( false !== ($file = readdir ( $handle )) ) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != ".."&& (strpos($file,".php")!==false) && (strpos($file,'_v')===false)) { $dblist[$i]=$file; $i++; } } //关闭句柄 closedir ( $handle ); } } return $dblist; } //检查安装进度 $act = isset($_GET['act'])?$_GET['act']:''; switch($act){ case 'step1': $tpl = include('tpl/step1.jizhi'); break; case 'step2': //检测是否有备份数据库 //读取备份数据库 $dir = '../backup'; $fileArray=array(); if (false != ($handle = opendir ( $dir ))) { $i=0; while ( false !== ($file = readdir ( $handle )) ) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != ".."&& (strpos($file,".php")!==false) && (strpos($file,'_v')===false)) { $fileArray[$i]=$file; $i++; } } //关闭句柄 closedir ( $handle ); } $dblists = $fileArray; $dblists2 = checktemplate(); if(count($dblists2)){ $dblists = array_merge($dblists,$dblists2); } $admin_url = get_admin_url(); $tpl = include('tpl/step2.jizhi'); break; case 'step3': try{ $pdo = new PDO("mysql:host=".$_POST['host'].";port=".$_POST['port'].";dbname=".$_POST['name'],$_POST['user'], $_POST['password']); //更新db.config.php $config['db']['host'] = $_POST['host']; $config['db']['dbname'] = $_POST['name']; $config['db']['username'] = $_POST['user']; $config['db']['password'] = $_POST['password']; $config['db']['prefix'] = $_POST['prefix']; $config['db']['port'] = $_POST['port']; $config['redis'] = array( 'SAVE_HANDLE' => 'Redis', 'HOST' => '127.0.0.1', 'PORT' => 6379, 'AUTH' => null, 'TIMEOUT' => 0, 'RESERVED' => null, 'RETRY_INTERVAL' => 100, 'RECONNECT' => false, 'EXPIRE'=>1800 ); $config['APP_DEBUG'] = true; $ress = file_put_contents('../conf/config.php', ''); }catch(PDOException $e){ echo ''; } $db = $_POST['go_backup']==1 ? $_POST['backup_db'] : ''; $admin_url = get_admin_url(); //传入管理员信息 $admin_name = $_POST['admin_name']; $admin_pass = $_POST['admin_pass']; $tpl = include('tpl/step3.jizhi'); break; case 'step4': $tpl = include('tpl/step4.jizhi'); break; case 'step5': $admin_url = get_domain().'/'.get_admin_url(); //生成安装锁定文件 $res = file_put_contents('install.lock',''); $tpl = include('tpl/step5.jizhi'); break; case 'install_testdb': $start= ((int)$_POST['start']==0)?1:$_POST['start']; $to=((int)$_POST['to']==0)?1:$_POST['to']; $config = include('../conf/config.php'); $db = new PDO("mysql:host=".$config['db']['host'].";port=".$config['db']['port'].";dbname=".$config['db']['dbname'],$config['db']['username'], $config['db']['password']); $sql = file_get_contents('test.php'); $sql = str_replace('jz_',$config['db']['prefix'],$sql); $count=100; $sql = substr($sql,14); $sql.="UPDATE `jz_level` SET `name`='".$_POST['admin_name']."',`pass`='".md5(md5($_POST['admin_pass']).'YF')."' , `regtime` = '".time()."' , `logintime` = ".time()." WHERE id=1"; $db->query("set names utf8mb4"); $db->exec($sql); echo json_encode(array('count'=>$count,"start"=>0,"to"=>$count)); exit; break; case 'go_install': $start= ((int)$_POST['start']==0)?1:$_POST['start']; $to=((int)$_POST['to']==0)?1:$_POST['to']; $config = include('../conf/config.php'); if($_GET['db']==''){ $sql = file_get_contents('db.php'); $sql.="UPDATE `jz_level` SET `name`='".$_POST['admin_name']."',`pass`='".md5(md5($_POST['admin_pass']).'YF')."' , `regtime` = '".time()."' , `logintime` = ".time()." WHERE id=1"; $sql = substr($sql,14); $sql = str_replace('jz_',$config['db']['prefix'],$sql); $count=100; $db = new PDO("mysql:host=".$config['db']['host'].";port=".$config['db']['port'].";dbname=".$config['db']['dbname'],$config['db']['username'], $config['db']['password']); $db->query("set names utf8mb4"); $r = $db->exec($sql); echo json_encode(array('count'=>$count,"start"=>0,"to"=>$count,'code'=>0)); exit; }else{ $db = new PDO("mysql:host=".$config['db']['host'].";port=".$config['db']['port'].";dbname=".$config['db']['dbname'],$config['db']['username'], $config['db']['password']); $db->query("set names utf8mb4"); //$sql = file_get_contents('../backup/'.$_GET['db']); $path = $_GET['db']; $filename_arr = explode('.php',$path); $filename = $filename_arr[0]; //读取备份数据库 $dir = '../backup'; $fileArray=array(); $fileArray[] = $dir.'/'.$filename.'.php'; for($i=1;file_exists($dir.'/'.$filename.'_v'.$i.'.php')===true;$i++){ $fileArray[]=$dir.'/'.$filename.'_v'.$i.'.php'; } foreach($fileArray as $path){ $sql = parseSQL($path); try{ $n = $db->exec($sql); if(!$n){ $msg = $db->errorInfo(); if($msg[2]){ echo json_encode(array('code'=>1,'msg'=>'数据库错误:' . $msg[2] . end($sql)));exit; } } }catch (PDOException $e){ echo json_encode(array('code'=>1,'msg'=>$e->getMessage())); exit; } } if($_POST['admin_pass']!='' && $_POST['admin_name']!=''){ $sql="UPDATE `jz_level` SET `name`='".$_POST['admin_name']."',`pass`='".md5(md5($_POST['admin_pass']).'YF')."' , `regtime` = '".time()."' , `logintime` = ".time()." WHERE id=1"; $sql = str_replace('jz_',$config['db']['prefix'],$sql); $db->exec($sql); } echo json_encode(array('count'=>100,"start"=>0,"to"=>100,'code'=>0)); exit; } break; case 'testdb': try{ //$_opts_values = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>2,PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8'); //$db = new PDO("mysql:host=".$_POST['host'].";port=".$_POST['port'].";dbname=".$_POST['name'],$_POST['user'], $_POST['password'],$_opts_values); $db = new PDO("mysql:host=".$_POST['host'].";port=".$_POST['port'],$_POST['user'], $_POST['password']); $newtable = "CREATE DATABASE IF NOT EXISTS `" . $_POST['name'] . "` DEFAULT CHARACTER SET utf8mb4;"; if($db->exec($newtable)){ $db->query("set names utf8mb4"); echo json_encode(['code'=>0,'msg'=>'success']); exit; }else{ echo json_encode(['code'=>1,'msg'=>'您没有创建数据库权限,请手动填写数据库!']); exit; } }catch(PDOException $e){ echo json_encode(['code'=>1,'msg'=>'数据库连接失败,请检查数据库配置!']); exit; } break; default: $tpl = include('tpl/index.jizhi'); break; } ================================================ FILE: install/test.php ================================================ /* MySQL Database Backup Tools Server:127.0.0.1:3306 Database:www.19x.mm Data:2022-01-26 13:48:01 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for jz_article -- ---------------------------- DROP TABLE IF EXISTS `jz_article`; CREATE TABLE `jz_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '文章标题', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目', `molds` varchar(50) DEFAULT 'article' COMMENT '模型标识', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `description` text COMMENT '简介', `seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID:0前台发布', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `body` mediumtext COMMENT '文章内容', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击次数', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否审核:1审核0未审2退回', `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0后台发布', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐', `tids` varchar(255) DEFAULT NULL COMMENT '副栏目', `zan` int(11) DEFAULT '0' COMMENT '点赞数', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='文章表'; -- ---------------------------- -- Table structure for jz_attr -- ---------------------------- DROP TABLE IF EXISTS `jz_attr`; CREATE TABLE `jz_attr` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'attr' COMMENT '模型标识', `name` varchar(50) DEFAULT NULL COMMENT '属性名', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='推荐属性'; -- ---------------------------- -- Table structure for jz_buylog -- ---------------------------- DROP TABLE IF EXISTS `jz_buylog`; CREATE TABLE `jz_buylog` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `aid` int(11) DEFAULT '0' COMMENT '内容ID', `userid` int(11) DEFAULT '0' COMMENT '会员ID', `orderno` varchar(255) DEFAULT NULL COMMENT '订单号', `type` tinyint(1) DEFAULT '1' COMMENT '交易类型:1购买商品0兑换金币', `buytype` varchar(20) DEFAULT NULL COMMENT '支付类型', `msg` varchar(255) DEFAULT NULL COMMENT '记录', `molds` varchar(255) DEFAULT NULL COMMENT '模型标识', `amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总计', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金额', `addtime` int(11) DEFAULT '0' COMMENT '添加时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='购买记录表'; -- ---------------------------- -- Table structure for jz_cachedata -- ---------------------------- DROP TABLE IF EXISTS `jz_cachedata`; CREATE TABLE `jz_cachedata` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `field` varchar(50) DEFAULT NULL COMMENT '字段', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `isall` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否输出所有:1是0否', `sqls` varchar(500) DEFAULT NULL COMMENT 'SQL', `orders` varchar(255) DEFAULT NULL COMMENT '排序', `limits` int(11) NOT NULL DEFAULT '10' COMMENT '输出条数', `times` int(11) NOT NULL DEFAULT '0' COMMENT '更新周期', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='数据缓存表'; -- ---------------------------- -- Table structure for jz_chain -- ---------------------------- DROP TABLE IF EXISTS `jz_chain`; CREATE TABLE `jz_chain` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL COMMENT '内链词', `newtitle` varchar(100) DEFAULT NULL COMMENT '替换词', `url` varchar(255) DEFAULT NULL COMMENT '链接', `num` int(11) NOT NULL DEFAULT '-1' COMMENT '替换次数', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='内链'; -- ---------------------------- -- Table structure for jz_classtype -- ---------------------------- DROP TABLE IF EXISTS `jz_classtype`; CREATE TABLE `jz_classtype` ( `id` int(11) NOT NULL AUTO_INCREMENT, `classname` varchar(50) DEFAULT NULL COMMENT '栏目名', `seo_classname` varchar(50) DEFAULT NULL COMMENT 'SEO栏目名', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `description` text COMMENT '描述', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `body` text COMMENT '内容', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序', `orderstype` int(4) NOT NULL DEFAULT '0' COMMENT '排序类型:1时间倒序2ID正序3点击量倒序4ID正序5时间正序6点击量正序', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', `iscover` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否覆盖下级', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '上级栏目ID', `gid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目权限:0不限制', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `lists_html` varchar(50) DEFAULT NULL COMMENT '栏目页模板', `details_html` varchar(50) DEFAULT NULL COMMENT '详情页模板', `lists_num` int(4) DEFAULT '0' COMMENT '列表数量', `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数', `gourl` varchar(255) DEFAULT NULL COMMENT '栏目外链', `ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许会员发布', `isclose` tinyint(1) NOT NULL DEFAULT '0' COMMENT '关闭栏目', `gids` varchar(255) DEFAULT NULL COMMENT '允许访问角色', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='栏目表'; -- ---------------------------- -- Table structure for jz_collect -- ---------------------------- DROP TABLE IF EXISTS `jz_collect`; CREATE TABLE `jz_collect` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `description` varchar(500) DEFAULT NULL COMMENT '简介', `tid` int(11) DEFAULT NULL COMMENT '所属栏目', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `w` varchar(10) NOT NULL DEFAULT '0' COMMENT '宽', `h` varchar(10) NOT NULL DEFAULT '0' COMMENT '高', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `url` varchar(255) DEFAULT NULL COMMENT '链接', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图'; -- ---------------------------- -- Table structure for jz_collect_type -- ---------------------------- DROP TABLE IF EXISTS `jz_collect_type`; CREATE TABLE `jz_collect_type` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '分类名', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='轮播图分类'; -- ---------------------------- -- Table structure for jz_comment -- ---------------------------- DROP TABLE IF EXISTS `jz_comment`; CREATE TABLE `jz_comment` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'comment' COMMENT '模型标识', `tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目tid', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章id', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '回复帖子id', `zid` int(11) NOT NULL DEFAULT '0' COMMENT '主回复帖子:同一层楼内回复,规定主回复id', `body` text COMMENT '评论内容', `reply` text COMMENT '回复内容', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员:0表示游客', `likes` int(11) NOT NULL DEFAULT '0' COMMENT '点赞数', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0隐藏2被删除', `isread` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已读:1已读0未读', PRIMARY KEY (`id`), KEY `tid` (`tid`), KEY `aid` (`aid`), KEY `pid` (`pid`), KEY `zid` (`zid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='评论表'; -- ---------------------------- -- Table structure for jz_ctype -- ---------------------------- DROP TABLE IF EXISTS `jz_ctype`; CREATE TABLE `jz_ctype` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) DEFAULT NULL COMMENT '配置栏名称', `action` varchar(255) DEFAULT NULL COMMENT '配置标识,用于权限控制', `sys` tinyint(1) DEFAULT 0 COMMENT '系统配置,1是0否', `isopen` tinyint(1) DEFAULT 1 COMMENT '是否启用,1启用0关闭', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统设置栏目名'; -- ---------------------------- -- Table structure for jz_customurl -- ---------------------------- DROP TABLE IF EXISTS `jz_customurl`; CREATE TABLE `jz_customurl` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `url` varchar(255) DEFAULT NULL COMMENT '自定义URL', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='自定义链接表'; -- ---------------------------- -- Table structure for jz_fields -- ---------------------------- DROP TABLE IF EXISTS `jz_fields`; CREATE TABLE `jz_fields` ( `id` int(11) NOT NULL AUTO_INCREMENT, `field` varchar(50) DEFAULT NULL COMMENT '字段标识', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `fieldname` varchar(100) DEFAULT NULL COMMENT '字段名称', `tips` varchar(100) DEFAULT NULL COMMENT '填写提示', `fieldtype` tinyint(2) NOT NULL DEFAULT '1' COMMENT '输入类型', `tids` text COMMENT '绑定栏目', `fieldlong` varchar(50) DEFAULT NULL COMMENT '字段长度', `body` text COMMENT '字段配置', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '表单排序', `ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否必填:1是0否', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台是否显示:1显示0隐藏', `isadmin` tinyint(1) NOT NULL DEFAULT '1' COMMENT '后台是否显示:1显示0隐藏', `issearch` tinyint(1) NOT NULL DEFAULT '0' COMMENT '搜索显示:1显示0隐藏', `islist` tinyint(1) NOT NULL DEFAULT '0' COMMENT '列表显示:1显示0隐藏', `format` varchar(50) DEFAULT NULL COMMENT '格式化', `vdata` varchar(50) DEFAULT NULL COMMENT '默认值', `isajax` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'AJAX显示:1显示0隐藏', `listorders` int(4) NOT NULL DEFAULT '0' COMMENT '列表排序', `isext` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否扩展信息', `width` varchar(50) DEFAULT NULL COMMENT '列表中显示宽度', `ishome` tinyint(1) NOT NULL DEFAULT '1' COMMENT '前台表单录入', `ldfield` varchar(255) DEFAULT NULL COMMENT '关联字段', `linkfield` varchar(255) DEFAULT NULL COMMENT '连接字段', `remote` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否远程数据', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Table structure for jz_hook -- ---------------------------- DROP TABLE IF EXISTS `jz_hook`; CREATE TABLE `jz_hook` ( `id` int(11) NOT NULL AUTO_INCREMENT, `module` varchar(50) DEFAULT NULL COMMENT '模块,Home/A', `namespace` varchar(100) DEFAULT NULL COMMENT '控制器命名空间', `controller` varchar(50) DEFAULT NULL COMMENT '控制器', `action` varchar(255) DEFAULT NULL COMMENT '执行函数:可同时注册多个方法,逗号拼接', `hook_namespace` varchar(100) DEFAULT NULL COMMENT '钩子控制器所在的命名空间', `hook_controller` varchar(50) DEFAULT NULL COMMENT '钩子控制器', `hook_action` varchar(50) DEFAULT NULL COMMENT '钩子执行方法', `all_action` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否全局控制器', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序:越大越靠前执行', `isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否关闭:1开启0关闭', `plugins_name` varchar(50) DEFAULT NULL COMMENT '关联插件名', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件钩子'; -- ---------------------------- -- Table structure for jz_layout -- ---------------------------- DROP TABLE IF EXISTS `jz_layout`; CREATE TABLE `jz_layout` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` varchar(200) DEFAULT NULL COMMENT '桌面名称', `top_layout` text COMMENT '顶部菜单', `left_layout` text COMMENT '左侧菜单', `gid` int(11) DEFAULT NULL COMMENT '所属角色', `ext` varchar(255) DEFAULT NULL COMMENT '备注', `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统配置:1是0否', `isdefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '默认配置:1是0否', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='桌面设置'; -- ---------------------------- -- Table structure for jz_level -- ---------------------------- DROP TABLE IF EXISTS `jz_level`; CREATE TABLE `jz_level` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'level' COMMENT '模型标识', `name` varchar(20) DEFAULT NULL COMMENT '管理员名称', `pass` varchar(100) DEFAULT NULL COMMENT '密码', `tel` varchar(20) DEFAULT NULL COMMENT '电话号码', `gid` int(4) NOT NULL DEFAULT '2' COMMENT '所属角色', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间', `logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='管理员表'; -- ---------------------------- -- Table structure for jz_level_group -- ---------------------------- DROP TABLE IF EXISTS `jz_level_group`; CREATE TABLE `jz_level_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'level_group' COMMENT '模型标识', `name` varchar(50) DEFAULT NULL COMMENT '角色名称', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', `isadmin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '超管:1是0否', `ischeck` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发布审核:1需要审核0不需要', `classcontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否配置栏目权限:1是0否', `paction` text COMMENT '权限列表', `tids` text COMMENT '拥有栏目权限', `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0冻结', `description` varchar(500) DEFAULT NULL COMMENT '描述', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; -- ---------------------------- -- Table structure for jz_likes -- ---------------------------- DROP TABLE IF EXISTS `jz_likes`; CREATE TABLE `jz_likes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`), KEY `tid` (`tid`,`aid`,`userid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='点赞表'; -- ---------------------------- -- Table structure for jz_link_type -- ---------------------------- DROP TABLE IF EXISTS `jz_link_type`; CREATE TABLE `jz_link_type` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '友链分类名', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接分类表'; -- ---------------------------- -- Table structure for jz_links -- ---------------------------- DROP TABLE IF EXISTS `jz_links`; CREATE TABLE `jz_links` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '友链名称', `molds` varchar(50) DEFAULT 'links' COMMENT '模型标识', `url` varchar(255) DEFAULT NULL COMMENT '链接', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='友情链接表'; -- ---------------------------- -- Table structure for jz_member -- ---------------------------- DROP TABLE IF EXISTS `jz_member`; CREATE TABLE `jz_member` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'member' COMMENT '模型标识', `username` varchar(50) DEFAULT NULL COMMENT '用户昵称', `openid` varchar(255) DEFAULT NULL COMMENT '微信OPENID', `pass` varchar(255) DEFAULT NULL COMMENT '密码', `token` varchar(255) DEFAULT NULL COMMENT 'Token', `sex` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性别:1男2女0未知', `gid` int(11) NOT NULL DEFAULT '1' COMMENT '会员分组ID', `litpic` varchar(255) DEFAULT NULL COMMENT '头像', `tel` varchar(50) DEFAULT NULL COMMENT '手机号码', `jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分数', `likes` text COMMENT '喜欢点赞(已废弃)', `collection` text COMMENT '收藏(已废弃)', `money` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '金币', `email` varchar(255) DEFAULT NULL COMMENT '邮箱', `address` varchar(255) DEFAULT NULL COMMENT '地址', `province` varchar(50) DEFAULT NULL COMMENT '省份', `city` varchar(50) DEFAULT NULL COMMENT '城市', `regtime` int(11) NOT NULL DEFAULT '0' COMMENT '注册时间', `hassendtime` int(11) NOT NULL DEFAULT '0' COMMENT '发送验证码时间', `logintime` int(11) NOT NULL DEFAULT '0' COMMENT '登录时间', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1正常0封禁', `signature` varchar(255) DEFAULT NULL COMMENT '个性签名', `birthday` varchar(25) DEFAULT NULL COMMENT '生日:2020-01-01', `follow` text COMMENT '关注列表', `fans` int(11) NOT NULL DEFAULT '0' COMMENT '粉丝数', `ismsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收消息提醒', `iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收评论消息提醒', `iscollect` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收收藏消息提醒', `islikes` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收点赞消息提醒', `isat` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收@消息提醒', `isrechange` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启接收交易消息提醒', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '推荐用户ID', `uploadsize` int(11) NOT NULL DEFAULT '50' COMMENT '上传大小限制', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员表'; -- ---------------------------- -- Table structure for jz_member_group -- ---------------------------- DROP TABLE IF EXISTS `jz_member_group`; CREATE TABLE `jz_member_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '分组名', `molds` varchar(50) DEFAULT 'member_group' COMMENT '模型标识', `description` varchar(255) DEFAULT NULL COMMENT '分组简介', `paction` text COMMENT '权限', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '分组上级', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示', `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许登录', `iscomment` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许评论', `ischeckmsg` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否需要审核评论', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣价:现金折扣或者百分比折扣', `discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型:0无折扣1现金折扣,1百分比折扣', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员分组'; -- ---------------------------- -- Table structure for jz_menu -- ---------------------------- DROP TABLE IF EXISTS `jz_menu`; CREATE TABLE `jz_menu` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL COMMENT '导航名称', `nav` text COMMENT '导航配置', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='导航表'; -- ---------------------------- -- Table structure for jz_message -- ---------------------------- DROP TABLE IF EXISTS `jz_message`; CREATE TABLE `jz_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `molds` varchar(50) DEFAULT 'message' COMMENT '模型标识', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员', `tid` int(4) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '文章ID', `user` varchar(255) DEFAULT NULL COMMENT '用户名', `ip` varchar(255) DEFAULT NULL COMMENT 'IP', `body` text COMMENT '留言内容', `reply` text COMMENT '回复内容', `tel` varchar(50) DEFAULT NULL COMMENT '电话', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `orders` int(4) NOT NULL DEFAULT '0' COMMENT '排序', `email` varchar(255) DEFAULT NULL COMMENT '邮箱', `isshow` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否审核:1审核0未审', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量', `tids` varchar(255) DEFAULT NULL COMMENT '副栏目', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='留言表'; -- ---------------------------- -- Table structure for jz_molds -- ---------------------------- DROP TABLE IF EXISTS `jz_molds`; CREATE TABLE `jz_molds` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '模型名称', `biaoshi` varchar(50) DEFAULT NULL COMMENT '模型标识', `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否系统:1是0否', `isopen` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开启:1开启0关闭', `iscontrol` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启权限:1开启权限0不开启', `ismust` tinyint(1) NOT NULL DEFAULT '0' COMMENT '栏目必选:1是0否', `isclasstype` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示栏目', `isshowclass` tinyint(1) DEFAULT '1' COMMENT '栏目绑定:1显示0隐藏', `list_html` varchar(50) DEFAULT 'list.html' COMMENT '默认列表模板', `details_html` varchar(50) DEFAULT 'details.html' COMMENT '默认详情模板', `orders` int(11) NOT NULL DEFAULT '100' COMMENT '排序', `ispreview` tinyint(1) DEFAULT '1' COMMENT '是否可以预览', `ishome` tinyint(1) DEFAULT '0' COMMENT '前台发布', PRIMARY KEY (`id`), KEY `biaoshi` (`biaoshi`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='模型表'; -- ---------------------------- -- Table structure for jz_orders -- ---------------------------- DROP TABLE IF EXISTS `jz_orders`; CREATE TABLE `jz_orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `orderno` varchar(255) DEFAULT NULL COMMENT '订单号', `molds` varchar(50) DEFAULT 'orders' COMMENT '模型标识', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '下单会员', `paytype` varchar(20) DEFAULT NULL COMMENT '支付方式', `ptype` tinyint(1) DEFAULT '1' COMMENT '交易类型:1商品购买2充值金额3充值积分', `tel` varchar(50) DEFAULT NULL COMMENT '电话', `username` varchar(50) DEFAULT NULL COMMENT '用户名', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `price` varchar(200) DEFAULT NULL COMMENT '价格', `jifen` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '积分', `qianbao` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '钱包', `body` text COMMENT '购买内容', `receive_username` varchar(50) DEFAULT NULL COMMENT '收件人', `receive_tel` varchar(20) DEFAULT NULL COMMENT '收件电话', `receive_email` varchar(50) DEFAULT NULL COMMENT '收件邮箱', `receive_address` varchar(255) DEFAULT NULL COMMENT '收件地址', `ispay` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否支付:1支付0未支付', `paytime` int(11) NOT NULL DEFAULT '0' COMMENT '支付时间', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '下单时间', `send_time` int(11) NOT NULL DEFAULT '0' COMMENT '发货时间', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '订单状态:1提交订单,2已支付,3超时,4已提交订单,5已发货,6已废弃失效,0删除订单', `discount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '折扣', `yunfei` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '运费', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; -- ---------------------------- -- Table structure for jz_page -- ---------------------------- DROP TABLE IF EXISTS `jz_page`; CREATE TABLE `jz_page` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `molds` varchar(50) DEFAULT 'page' COMMENT '模型标识', `htmlurl` varchar(50) DEFAULT NULL COMMENT '链接', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `tids` varchar(255) NOT NULL COMMENT '副栏目', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='单页模型'; -- ---------------------------- -- Table structure for jz_pictures -- ---------------------------- DROP TABLE IF EXISTS `jz_pictures`; CREATE TABLE `jz_pictures` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `molds` varchar(50) DEFAULT NULL COMMENT '模型标识', `path` varchar(20) DEFAULT 'Admin' COMMENT '板块:Admin后台Home前台', `filetype` varchar(20) DEFAULT NULL COMMENT '类型', `size` varchar(50) DEFAULT NULL COMMENT '大小', `litpic` varchar(255) DEFAULT NULL COMMENT '链接', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '管理员ID/发布会员ID', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='图片集'; -- ---------------------------- -- Table structure for jz_pingjia -- ---------------------------- DROP TABLE IF EXISTS `jz_pingjia`; CREATE TABLE `jz_pingjia` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) DEFAULT '0' COMMENT '所属栏目', `tids` varchar(255) DEFAULT NULL COMMENT '副栏目', `title` varchar(255) DEFAULT NULL COMMENT '标题', `litpic` varchar(255) DEFAULT NULL COMMENT '缩略图', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `description` varchar(500) DEFAULT NULL COMMENT '简介', `body` text COMMENT '内容', `molds` varchar(50) DEFAULT 'pingjia' COMMENT '模型标识', `userid` int(11) DEFAULT '0' COMMENT '发布管理员', `orders` int(11) DEFAULT '0' COMMENT '排序', `member_id` int(11) DEFAULT '0' COMMENT '前台用户', `comment_num` int(11) DEFAULT '0' COMMENT '评论数', `htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义URL', `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性', `hits` int(11) DEFAULT '0' COMMENT '点击量', `zan` int(11) DEFAULT '0' COMMENT '点赞数', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `addtime` int(11) DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `zhiye` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Table structure for jz_plugins -- ---------------------------- DROP TABLE IF EXISTS `jz_plugins`; CREATE TABLE `jz_plugins` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '插件名称', `filepath` varchar(50) DEFAULT NULL COMMENT '插件文件名', `description` varchar(255) DEFAULT NULL COMMENT '简介', `version` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '版本', `author` varchar(50) DEFAULT NULL COMMENT '作者', `update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `module` varchar(20) NOT NULL DEFAULT 'Home' COMMENT '模块', `isopen` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否开启:1开启0关闭', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '发布时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `config` text COMMENT '配置', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='插件表'; -- ---------------------------- -- Table structure for jz_power -- ---------------------------- DROP TABLE IF EXISTS `jz_power`; CREATE TABLE `jz_power` ( `id` int(11) NOT NULL AUTO_INCREMENT, `action` varchar(50) DEFAULT NULL COMMENT '函数名', `name` varchar(50) DEFAULT NULL COMMENT '权限名', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限ID', `isagree` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否开放', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户权限表'; -- ---------------------------- -- Table structure for jz_product -- ---------------------------- DROP TABLE IF EXISTS `jz_product`; CREATE TABLE `jz_product` ( `id` int(11) NOT NULL AUTO_INCREMENT, `molds` varchar(50) DEFAULT 'product' COMMENT '模型标识', `title` varchar(255) DEFAULT NULL COMMENT '商品名称', `seo_title` varchar(255) DEFAULT NULL COMMENT 'SEO标题', `tid` int(11) NOT NULL DEFAULT '0' COMMENT '所属栏目', `hits` int(11) NOT NULL DEFAULT '0' COMMENT '点击量', `htmlurl` varchar(50) DEFAULT NULL COMMENT '栏目链接', `keywords` varchar(255) DEFAULT NULL COMMENT '关键词', `description` varchar(255) DEFAULT NULL COMMENT '简介', `litpic` varchar(255) DEFAULT NULL COMMENT '首图', `stock_num` int(11) NOT NULL DEFAULT '0' COMMENT '库存', `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '价格', `pictures` text COMMENT '图集', `isshow` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否显示:1显示0不显示', `comment_num` int(11) NOT NULL DEFAULT '0' COMMENT '评论数', `body` mediumtext COMMENT '详情', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '录入管理员ID', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', `istop` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签', `member_id` int(11) NOT NULL DEFAULT '0' COMMENT '发布会员', `target` varchar(255) DEFAULT NULL COMMENT '外链', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `jzattr` varchar(50) DEFAULT NULL COMMENT '推荐属性:1置顶2热点3推荐', `tids` varchar(255) DEFAULT NULL, `zan` int(11) DEFAULT '0', `lx` varchar(2) DEFAULT NULL, `color` varchar(2) DEFAULT NULL, `hy` varchar(500) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='商品表'; -- ---------------------------- -- Table structure for jz_recycle -- ---------------------------- DROP TABLE IF EXISTS `jz_recycle`; CREATE TABLE `jz_recycle` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标记', `molds` varchar(50) DEFAULT NULL COMMENT '回收模型标志', `data` mediumtext COMMENT '回收数据', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '删除时间', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '关联删除', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='回收站'; -- ---------------------------- -- Table structure for jz_ruler -- ---------------------------- DROP TABLE IF EXISTS `jz_ruler`; CREATE TABLE `jz_ruler` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL COMMENT '权限名称', `fc` varchar(50) DEFAULT NULL COMMENT '函数', `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类权限', `isdesktop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否桌面配置显示(已废弃)', `sys` tinyint(1) NOT NULL DEFAULT '0' COMMENT '系统:1是0否', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色权限表'; -- ---------------------------- -- Table structure for jz_shouchang -- ---------------------------- DROP TABLE IF EXISTS `jz_shouchang`; CREATE TABLE `jz_shouchang` ( `id` int(11) NOT NULL AUTO_INCREMENT, `tid` int(11) NOT NULL DEFAULT '0' COMMENT '栏目ID', `aid` int(11) NOT NULL DEFAULT '0' COMMENT '内容ID', `userid` int(11) NOT NULL DEFAULT '0' COMMENT '会员ID', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='用户收藏表'; -- ---------------------------- -- Table structure for jz_sysconfig -- ---------------------------- DROP TABLE IF EXISTS `jz_sysconfig`; CREATE TABLE `jz_sysconfig` ( `id` int(11) NOT NULL AUTO_INCREMENT, `field` varchar(50) DEFAULT NULL COMMENT '配置字段', `title` varchar(255) DEFAULT NULL COMMENT '配置名称', `tip` varchar(255) DEFAULT NULL COMMENT '字段填写提示', `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '参数类型:1图片2单行文本3多行文本4编辑器5文件上传6下拉开启关闭选项7下拉是否选项8栏目选项9代码', `data` text COMMENT '配置内容', `typeid` tinyint(1) NOT NULL DEFAULT '0' COMMENT '配置栏ID', `config` text COMMENT '单选多选配置信息', `orders` int(11) NOT NULL DEFAULT '0' COMMENT '排序', `sys` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否系统字段', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='系统配置'; -- ---------------------------- -- Table structure for jz_tags -- ---------------------------- DROP TABLE IF EXISTS `jz_tags`; CREATE TABLE `jz_tags` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) DEFAULT '0' COMMENT '栏目ID', `tids` varchar(500) DEFAULT NULL COMMENT '相关栏目', `orders` int(11) DEFAULT '0' COMMENT '排序', `comment_num` int(11) DEFAULT '0' COMMENT '评论数', `molds` varchar(50) DEFAULT 'tags' COMMENT '模型标识', `htmlurl` varchar(100) DEFAULT NULL COMMENT '栏目链接', `keywords` varchar(50) DEFAULT NULL COMMENT '关键词', `newname` varchar(50) DEFAULT NULL COMMENT '替换词(已废弃)', `num` int(4) DEFAULT '-1' COMMENT '替换次数:-1不限制', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示隐藏', `target` varchar(50) DEFAULT '_blank' COMMENT '外链', `number` int(11) DEFAULT '0' COMMENT '数量', `member_id` int(11) DEFAULT '0' COMMENT '发布会员', `ownurl` varchar(255) DEFAULT NULL COMMENT '自定义链接', `tags` varchar(255) DEFAULT NULL COMMENT 'TAG标签', `istop` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否置顶:1是0否', `ishot` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否头条:1是0否', `istuijian` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否推荐:1是0否', `addtime` int(11) NOT NULL DEFAULT '0' COMMENT '添加时间', `updatetime` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='TAGS表'; -- ---------------------------- -- Table structure for jz_task -- ---------------------------- DROP TABLE IF EXISTS `jz_task`; CREATE TABLE `jz_task` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) DEFAULT '0' COMMENT '栏目ID', `aid` int(11) DEFAULT '0' COMMENT '文章ID', `userid` int(11) DEFAULT '0' COMMENT '发布会员', `puserid` int(11) DEFAULT '0' COMMENT '对象会员', `molds` varchar(50) DEFAULT NULL COMMENT '模块标识', `type` varchar(50) DEFAULT NULL COMMENT '消息类型', `body` varchar(255) DEFAULT NULL COMMENT '内容', `url` varchar(255) DEFAULT NULL COMMENT '链接', `isread` tinyint(1) DEFAULT '0' COMMENT '是否已读:1已读0未读', `isshow` tinyint(1) DEFAULT '1' COMMENT '是否显示:1显示0隐藏', `readtime` int(11) DEFAULT '0' COMMENT '阅读时间', `addtime` int(11) DEFAULT '0' COMMENT '发布时间', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='会员消息表'; -- ---------------------------- -- Records of jz_article -- ---------------------------- INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('1','如何有效的提高网站权重?','8', NULL,'znxw', NULL,'想要在搜索引擎的排名更靠前、提高整站的流量、提高用户对网站的信任度,所以提高网站的权重是相当重要。如何才能够快速的提高自己网站的权重,或者说哪些东西是决定网站权重的重要因素。','如何有效的提高网站权重?','1','/static/upload/2022/01/20/202201202461.jpg','

    如何有效的提高网站的权重?想要在搜索引擎的排名更靠前、提高整站的流量、提高用户对网站的信任度,所以提高网站的权重是相当重要。如何才能够快速的提高自己网站的权重,或者说哪些东西是决定网站权重的重要因素,网站合理的内链结构布局。

    目前来讲,外链的地位已不再像之前那样是SEO优化的核心,外链为皇的时代早就过去了,如今更为重要的就是网站内容,而内链就好比一张蜘蛛网一样,起着连接和传递网站系统化内容的作用。所以,内链设置必须注重合理、呼应,避免重复、堆积,这样更利于搜索引擎的抓取和收录。


    从目前掌握的情况而言,很多人都喜欢给首页做一个超链接,做回链是需要掌握一个度的,一般情况下,一个独立页面做上1-2个内链就可以了,导航以及面包屑导航就是最好的内链,因此,在做内链的时候千万别滥用,否则会被百度惩罚,认为你的网站是为了做排名而做排名,不具备用户搜索的参考价值。优化建议:做好具有引导性的内链,大量的回链犹如“七伤拳”,用得好利于排名,用不好则属于自残,在这里,建议广大的SEO千万不要在底部或者文章中做太多的内链,要做符合用户搜索的内容。


    好的域名及稳定的服务器和打开速度。


    对于优化而言,好的域名主要是指域名中包含关键词或者企业名称,最好简短易记。其次,就是老域名和新域名的区分,当然老域名更利于优化。域名只是影响优化的一小部分,而网站服务器的稳定性和打开速度却是极为重要的一部分。数据调查显示,通常一个打开速度较慢的站点会减少60%的流量,而且网站一旦出现服务器异常,打不开,可能就会造成对搜索引擎的不友好现象,收录成为困难。


    有规律的产生日常更新维护。


    如今的搜索引擎更注重高质量的原创内容,而高质量的标准取决于可读性、稀缺性、价值性三个方面。所以,大家在更新网站内容的时候要把握好这几点,高质量的原创内容一直是网站用户和搜索引擎喜欢的,当然这里说的原创也并非原创,很多朋友都能理解这块,比如某个网站发布一篇类似文章,但由于对方排版不清晰该插入图片或视频的地方未进行操作密密麻麻的文章给人的一种感觉都不是很友好,此时我们又需要这篇文章怎么办,解决对方未完成的细节问题再发布,搜索引擎依然会认为你的文章比你抄袭的文章更有价值意思。


    美观、有逻辑性的排版布局。


    因为现在的网民审美及网站功能各方面的要求提高,美观似乎已成为每个网站的基本要求,因为只有满足了用户的浏览及感官体验,才能达到所谓的用户体验和粘度。但是美观并不代表就一定有酷炫的功能和风格,因为JS、FLASH等特效方式的渲染力虽大于图片,但是搜索引擎是抓不到,对搜索引擎来说是不友好的。所以,在保证美观、逻辑性的排版布局的同时,JS等特殊效果尽量少用。但目前从泽民了解的情况而言JS百度也是可以抓取的。


    有些朋友每天更新文章,但排版乱七八糟,字体忽大忽小,要么就是文字过多,一张图片也没有,密密麻麻的文字,或者是文字小得可怜,正常情况下,14px-16px的字体是最适合用户阅读的,建议大家在为网站更新文章的时候,最好用图文并茂的模式,排版干净整洁,赢得客户的第一印象,搜索引擎也会根据页面的整洁度给予好的评分。


    合理利用优化标签。


    你是否合理的运用了这些标签?很多人不会用,也有很多人会用但使用过度了,标签是优化常用的一个标签,在单页面优化中,它的存在也是对页面优化起到了很大的促进作用,在最能突出页面内容的地方加上 会让搜索引擎优先抓取,然后在一层一层往下面抓取,会让搜索引擎更好的了解该页面的核心内容,但一个页面只能有一对 ,至于 可以使用多次,但要使用合理。


    三大标签TDK的正确写。


    我想这个时候肯定有人会问我为什么把标题写法最主要的一点写在最后,正因为重要我才写到最好,判断一个合格的SEO人员首先是看你写的标题是否完美,常见的标题写法就是把公司做的产品词全部写在标题上,这是百分之80SEO人员的通病,百度在之前对标题的写法做出的回应具体如下:


    网站首页title的写法:网站标题 ?或者 ?网站标题_服务词或者产品词;


    网站频道页title的写法:频道名称_网站名称;


    网站文章页title的写法:文章标题_频道名称_网站名称;


    这种写法符合重要的内容放在title前面,权重从左到右依次递减的规则。


    这里在补充一点,在写标题的时候一定要考虑到百度的分词算法,很多人都不知道,分词的规则:a,在百度搜索一个三个以三个以下汉字的关键词,百度不会对关键词进行分割,百度显示的是所有匹配完整关键词的搜索结果;b,在百度搜索四个汉字以上的关键词,百度会对关键词进行分割,百度会显示完整关键词和组合关键词的搜索结果;分词后组合的方式有非常多种,对我们SEO来说,最有价值的还是分词的正向最大匹配法以及逆向匹配法。说白一点,就是title在分词后,可以正向和反向的组合不同的关键词。


    优质的内外链接:我们的内链如果做得好话,让我们更加容易的找到自己想要的资料,让网民更好的阅读我们的文章,这样网民停留在我们网页的时间也变久了,对于权重的提升很有帮助优质是外链要从友情链接做起,不求多但求精,质量重于数量,多寻找一些高质量的友情链接,不仅能提升网站权重,还能辅助相关的关键字提升。


    ','1642639144','0','10','1','0','0','0','0','SEO','0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('2','SEO优化细节问题','8', NULL,'znxw', NULL,'我们可以发现,现在很多企业站都在做SEO优化,让自己的网站能让更多的人搜索到,但是当我们在优化的过程中,有时会由于一些操作而带来一些影响,有些细节问题大家一定要注意,我们一起来了解一下。','SEO优化细节问题','1','/static/upload/2022/01/20/202201206807.jpg','

    1.H1、H2、H3标签的使用,这个对于一个seo人员来说也是需要了解的基本功能。它可以加重对关键词的描述,通俗一点说就是能够更好的集中网站的权重。


    2.META标签是HTML标记头部区的一个关键标签,提供文档字符集、使用语言、作者等基本信息,以及对关键词和网页等级的设定等,最大的作用是能够做搜索引擎优化(SEO)。


    3.title标签能够让搜索引擎在栏目上显示你提交的文字,也就是咱们经常说到的标题前缀。


    4.处理图片Alt、title标签以及为页面添加元标记meta 网站经常都会更新图片,因此为图片增加alt是非常重要的,这样能够更好的让搜索引擎识别你网站上的图片。


    5.大家都知道人的搜索习惯是通过关键词、标题、描述来进行搜索,因此定位好你每个页面的标题、关键词、描述也是必不可少的一环。同时还需要注意的是个别关键词的密度问题。


    6.网站地图专业名字也叫做sitemap 这个可以通过一些专业的工具去生成,然后提交给搜索引擎,使得搜索引擎对你的网站更加友好。


    7.404页面设置、301重定向这两个主要在于提高网站体验度这方面,当你的网站出现死链,或者访问不了的情况那么就需要用到404跳转页面了。


    8.Robot.txt如果你没有接触过seo行业看起来一定很陌生,Robot.txt所起的作用是至关重要的,他能让搜索引擎更好的识别你的网站哪些内容是该抓取收录的,哪些内容是不能抓取收录的。

    seo-1.jpeg

    网站首页被K的原因


    在外链方面应当循序渐进.并且有规律的增长,如果突然之间失去了一些外链的话,就会造成网站降权或者被K,所以说要其有广泛性,不要在一个网站上拴住。当然做的外链在权重高的网站那是肯定的好了,但要注重质量,自己把握的住就好。


    使用了一些作弊手段,这也会导致你的站点被降权或K站。如果你没有做这些,也许是竟争对手用这些手段在陷害你的站,这得注意下,经常查查外链情况,如果有垃圾外链过来的话,就用百度外链工具屏蔽掉吧。


    服务器影响:如果使用的空间同IP中有大量博彩类网站,或者有网站被降权或被K,都有可能影响到同iP下你的网站,这个影响的程度我也说不好,这点可注意一下。服务器的不稳定因素也是排名提不上去或被降权的原因之一,服务器的不稳定,造成搜索无法正常访问,故而做出惩罚。


    关键词密度问题:并且要注意不要堆砌关键词,关键词的密度应当<8%,这个可以使用工具查询的到,其实这个关键词的密度,大家就仁者见仁智者见智了。


    网站内容问题:多写意些高质量的相关原创文章,增加搜索引擎的友好度,伪原创和转载的那肯定是不行的,尤其是新网站就更不能进行文章采集。同时要注重网站内部链优化,还要就是不要在网站不稳定期间更换模板,不然蜘蛛又需要重新抓取,影响不好。如果是新站的话,文章当中还不要放太多的链接,尤其是链接到首页的。


    ','1642640121','0','1','1','0','0','0','0','SEO','0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('3','如何正确选择关键词技巧?','8', NULL,'znxw', NULL,'一个要做SEO优化的网站,如果在之前不能够选择好适当的关键词的话,那么对网站的优化会造成很大的影响,因此就会一步走错,满盘皆输的窘境。结合网站本身从用户的角度出发选择优化词网站调整完毕以后主要的流量以及权...','如何正确选择关键词技巧?','1','/static/upload/2022/01/20/202201209692.jpg','

    一个要做SEO优化的网站,如果在之前不能够选择好适当的关键词的话,那么对网站的优化会造成很大的影响,因此就会一步走错,满盘皆输的窘境。结合网站本身从用户的角度出发选择优化词网站调整完毕以后主要的流量以及权重的来源便是用户,那么我们应该怎么去让用户精准的查询到网站呢?这就要我们去站到用户的角度去考虑网站产品本身需要拓展的关键词了,精准的抓住用户的需求是企业网站有价值体现的最要表现。


    合理的选择优化关键词


    合理选择优化关键词,主要针对于中小型企业网站来说,我们不能一味的去选择指数高、搜索量大的词,前期尽量去选择一些优化关键词的长尾关键词,通过不断的提升网站的基础从而提升选择关键词的优化难度。确定关键词方向,从百度下拉框中选择精准关键词我们在确定好客户网站关键词方针以后,将关键词输入到百度搜索框中,自动弹出下拉框,下拉框中的词就是我们日常用户搜索量比较大的词。


    根据客户网站内容进行关键词扩展


    我们在为客户的网站选择关键词的时候,要根据客户网站主要做的产品、服务内容来选定大的方针,在利用一些关键词扩展工具选择一些比较多的关键词,在从中筛选出有价值的关键词。企业在进行网站关键词优化的时候,应该注重一些网络优化的细节问题,不同的网站,其优化方式有很大的不同,对于一些优化细节的问题是不容忽视的。同时要做好网站优化数据的统计与分析,这将才能够更好的做好网站优化效果。


    企业在进行网络推广的时候,大部分企业网站的排名都不尽人意,同时网站优化的效果差,周期长,这是现今大多数企业的通病,长期如此的话,企业也就逐渐丧失了继续优化下去的信心。


    做网站推广的过程中,需要注重很多相关的细节,就好比网站锚文本建设,合理的运用网站锚文本,对搜索引擎进行引导,这样也就能够促进蜘蛛的更快更精准的抓取网站内容,从而提高长尾关键词的排名、增加网站的权重。但是做网站锚文本也不是随意增加的,网站页面的相关内容能够通过锚文本,精准地指向相关网站页面的内容,可以说是锚文本对网站页面所做的内容评价。


    锚文本在内外链的用处


    内部链接内部链接的作用是提高网站的网页和网页之间增加粘度,提高用户的体验度。文章包含其他文章的关键词,那都可以做锚文本链接。一定要注意锚文本链接的多样化,不要都是指向首页的锚文本链接,这样对你的网站也是没有好处的。(内部链接的规则)


    外部链接外链现如今越来越不好做,个人签名和网页的网址链接现在都被百度算作了垃圾外链。锚文本链接是权重最高的链接,但是一定不要优化过度了,否则会过犹不及。


    锚文本怎么做?


    锚文本运用的地方很广,我们要把它做到:网站导航、栏目、分类目录、次导航、外部链接、友情链接、文章内的锚文本。文章内锚文本频率:站内锚文本我们提倡是控制在1%频率就好;锚文本链接放置位置:我们一般在一篇文章第一次出现这个关键词时就做成锚文本;锚文本链接数量:一篇文章如果出现多次相同的关键词,我们只做一个就好。做网站锚文本建设其实难度并不大,关键是要掌握锚文本建设的方法,合理的运用,这样才能够个网站优化效果带来很大的助益。如果为了加快网站排名的提升,随意增加锚文本数量,同时链接的相关性也比较差,自然搜索引擎就会以为存在作弊行为,就会给予相应的惩罚。


    ','1642640201','0','5','1','0','0','0','0','SEO','0', NULL, NULL, NULL,',9,','0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('4','友链交换方法及友链交换平台有哪些?','9', NULL,'xyxw', NULL,'一些SEO经常咨询怎么换友链,我相信许多新手也会有这些问题。今天我分享友情链接交换的方法是什么,友情链接交换的平台是什么?','友链交换方法及友链交换平台有哪些?','1','/static/upload/2022/01/20/202201201293.jpg','

    一些SEO经常咨询怎么换友链,我相信许多新手也会有这些问题。今天我分享友情链接交换的方法是什么,友情链接交换的平台是什么?


    友情链接交换的方法是什么?


    方法1。对于QQ群来说,更换朋友是很常见的,但与彼此的站长交流非常有效和快捷。

    您可以去QQ群找到自己,并与合适的网站交流。或者把你想交流的网站和一些基本信息链接起来。


    方法2。好友链平台本身可以在互联网上找到好友链平台,查看其他站长发布的信息,如果觉得合适的话可以更换。


    方法3。在自己的网站上添加一个网站,看看彼此的网站上添加了哪些朋友链接。可以直接去网站找站长交流,有些网站有在线客服,遇到好的客服你很幸运,点低吗?让我们换一个。如果你有客户服务,就可以了。你们中的一些人会留下网站管理员的联系信息,并有申请朋友链接的功能。推荐阅读(深圳搜索引擎优化培训)


    方法4。注册更多的网站和论坛,为发布好友链找到一个特殊的目录区域,并把自己

    编辑后的网站好友链接信息应该随时发布。建议一些网站不能留下链接,所以不要留下它们,避免删除它们,并留下您的网站名称。关键词相关性,我们应该对这个频道感到满意,哈哈。留下你的微信

    一些QQ论坛仍然可以使用。百度贴吧是一部精彩的作品。让我们说点别的。


    方法5。购买好友链具有选择自由、重量大、流量大的优点。缺点:花钱多、长期提款多、流动性和风险不稳定。


    什么是友好的友情链接交换平台?


    滴滴友情链接网


    专为站长和SEOer交流和交易友好链接而开发的友好链接平台欢迎站长使用犀牛云链接。它拥有丰富的资源和交易,帮助您节省链交换时间和提高工作效率。


    云链接链接交换平台


    ','1642640580','0','3','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('5','什么是网站子域名对优化排名优缺点有哪些','8', NULL,'znxw', NULL,'对于刚刚接触到网站建设优化的网站管理员搜索引擎优化人员来说,他们可能不熟悉子域子目录,有些人可能没有听说过。今天将告诉你什么是子域子目录,优化排名的优缺点是什么?希望能够帮助那些新手站长搜索引擎优化人...','dasdsadsa','1','/static/upload/2022/01/19/202201192968.jpg','

    对于刚刚接触到网站建设优化的网站管理员搜索引擎优化人员来说,他们可能不熟悉子域子目录,有些人可能没有听说过。今天将告诉你什么是子域子目录,优化排名的优缺点是什么?


    希望能够帮助那些新手站长搜索引擎优化人员!


    什么是子域?


    子域名称(或子域;中文:子域)是域名系统级别中属于更高级别域的域。例如,mail.example.com和calendar.example.com是example.com的两个子域,而example.com是顶级域的子域。请访问。


    子域名:它是顶级域名的下一级(一级域名或父域名)。域名作为一个整体包括两个。或者包括一个”和一个“/”。


    什么是子目录?


    子目录:父目录中的目录。子目录也可以有子目录,子目录是无限的。推荐阅读(为什么不去网站关键词排名)


    我们说简单地理解它是在我们网站的根目录下建立的任何文件夹(我们公司用户网站的根目录是wwwroot,如果一个文件夹是在wwwroot下建立为abc,那么abc就是一个子目录,也就是说,这个子目录的名称是abc)。子目录技术可以将任何附加域放在这些任意建立的子目录下。


    子域有什么优点?


    1.使用过网站的人非常清楚,如果域名包含关键词,优化他们的网站是非常有帮助的。当列表出现时,如果你想提高你的瓶颈,你需要搜索引擎所需的权重。当然,这对小站长来说更难。如果我们使用子域,您的列表将翻倍。


    2.他的体重比目录重很多倍。经过仔细优化后,您的权重比子目录更容易获得排名。可以分成很多很多分类页面,也可以单独转移到服务器上,目录无法实现。


    3.如果大量的二级域名组成一个子域站组,这将大大有助于提升主域名的权重。


    4.该网站规模很大,获得了更多的选票。你也可以挂更多的友情链接。强大的品牌建设。推荐关注点(搜索引擎优化开始)


    子域有什么缺点?


    1.他最大的重量是他不能继承头版的重量,就像一个新网站一样。如果你的主域优化得很好,你可以考虑打开另一个网站。


    2.工作量将会增加,这与主站的内容不协调。内容差异很大,不相关。


    3.不要滥用子域。搜索引擎很容易将他们视为作弊。最好不要启用没有很多内容的子域。


    子目录有什么优点?


    子目录的优点是它们可以继承主域的权重。子目录。内容的质量会影响你网站的整体得分。为了更快的操作,只需要一个后台。


    子目录的缺点是什么?


    缺点是收集压力大,搜索次数少。子目录不利于良好的友谊链接。


    然而,如何使用它取决于您的应用程序对象。如果你想创建一个子域,首先要注意你的网站是否适合这样做。如果你是一个大网站,比如58、Ganji、腾讯、网易、新浪,你自然会选择子域,因为你的规模已经达到了一定的水平,这些网站的信息和资源是巨大而广泛的。使用单个子域名制作一个领域和行业的内容没有问题,也不需要坚持使用单个关键词,而是要考虑用户的习惯。


    如果您是一个中小型网站,此时不建议使用子域。我建议使用子目录更合适,因为子域相当于全新的网站,短期内不会给你带来高搜索引擎优化性能。此外,您自己的中小型网站的内容数据相对较少,不足以支持子域的数量。此外,子域增加了维护成本和工作量。如果你没有足够的诗句来管理,你的体重会导致水平的现象。


    ','1642641743','0','5','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('9','极致CMS不使用伪静态可以吗?','5', NULL,'faq', NULL,'不可以!极致CMS必须使用伪静态。因为在自定义链接上面做了一定的处理,所以必须使用伪静态。','极致CMS不使用伪静态可以吗?','1', NULL,'

    不可以!极致CMS必须使用伪静态。因为在自定义链接上面做了一定的处理,所以必须使用伪静态。

    ','1642943414','0','0','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('10','极致CMS框架是ThinkPHP吗?','5', NULL,'faq', NULL,'不是!是自主研发的FrPHP框架,仓库地址:https://gitee.com/Cherry_toto/FrPHP 也是免费使用的一个简单框架,只不过伪静态配置跟thinkphp一样。','极致CMS框架是ThinkPHP吗?','1', NULL,'

    不是!是自主研发的FrPHP框架,仓库地址:https://gitee.com/Cherry_toto/FrPHP

    也是免费使用的一个简单框架,只不过伪静态配置跟thinkphp一样。

    ','1642943502','0','58','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('11','平台靠什么盈利?是否会一直维护下去?','5', NULL,'faq', NULL,'目前平台是不盈利运营的,当然,说不盈利只不过是指不从极致CMS系统授权方面,而官方有应用市场(https://app.jizhicms.cn),还有极致云(https://idc.jizhicms.com/)平台,虽然两个平台没什么收入,但也算盈利的一...','平台靠什么盈利?是否会一直维护下去?','1', NULL,'

    目前平台是不盈利运营的,当然,说不盈利只不过是指不从极致CMS系统授权方面,而官方有应用市场(https://app.jizhicms.cn),还有极致云(https://idc.jizhicms.com/)平台,虽然两个平台没什么收入,但也算盈利的一部分。我只不过不希望从授权上盈利,我觉得开源免费就应该完全免费,让大家都能安心的用系统。

    只要不是特殊原因,我们都会一直维护下去。后续我们也会开发更多的产品,给大家使用。


    ','1642943612','0','11','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('7','新手零基础学SEO难吗?','9', NULL,'xyxw', NULL,'许多初学者学习搜索引擎优化大多是新手,新手学习搜索引擎优化更担心的问题是零基本搜索引擎优化难,零基本搜索引擎优化要学多久?今天,我想和你谈谈这个饥饿的问题。我希望我能帮助你!','新手零基础学SEO难吗?','1','/static/upload/2022/01/19/202201198505.jpg','

    许多初学者学习搜索引擎优化大多是新手,新手学习搜索引擎优化更担心的问题是零基本搜索引擎优化难,零基本搜索引擎优化要学多久?今天,我想和你谈谈这个饥饿的问题。我希望我能帮助你!


    零基础研究的搜索引擎优化困难吗?


    零基础的定义:零基础意味着搜索引擎优化一无所知。你经常浏览网页吗?你知道搜索引擎的投标位置和共同位置吗?你了解搜索引擎优化的基本定义和功能吗?或者你知道程序,但不知道搜索引擎优化?回答完这些问题后,我们可以定位自己,并确定我们是否真的从零开始。


    搜索引擎优化对零基础研究来说困难吗?事实上,这是一个错误的命题。大多数人认为搜索引擎优化很难学,因为学习搜索引擎优化的过程并不难,但大多数人仍然可以做得很好。认为搜索引擎优化不难学,已经在学搜索引擎优化,并且对搜索引擎优化有着深刻的理解,能够正确操作。


    零基础搜索引擎优化研究需要多长时间?


    准备加入搜索引擎优化专业的人,会考虑搜索引擎优化学习多长时间的实际问题,实际上学习搜索引擎优化多长时间是一个错误的命题。学习是无止境的,搜索引擎优化是一个持续的学习过程,几乎没有终点。再说,什么是“会议”?有几个层次。搜索引擎优化的基本学习时间大约是两个月,这两个月的每一天都需要固定的时间来学习和记忆。


    成为搜索引擎优化专家需要多长时间?


    答案是不确定的。没有必要花很多时间成为搜索引擎优化行业的大玩家。除了必要的时间投入,大量的独立思考,大量的实际网站优化,大量的参考优化技术和个人知识库的存储都是必要的。


    搜索引擎优化学习的基本内容是什么?


    1.关键词:分析、挖掘、密度分析、布局、查询和排名、长尾关键词排名


    2.站内优化:站内优化细节、网址优化、伪静态和动态、死链接查询和解决方案、链内优化、网站地图制作、301重定向设置、robots.txt、404错误页面设置、图片优化技术、网站内容策略。


    3.站外优化:站外优化策略、友谊链接交换、网站提交门户、站外软文章推广和高质量的站外链架设。


    ','1642645778','0','87','1','0','0','0','0','SEO','0', NULL, NULL,',3,', NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('8','极致CMS免费吗?','5', NULL,'faq', NULL,'极致CMS完全免费,不收取系统的授权费,且免费商用!但是,有的模板如果有标记授权或者付费的,另当别论,因为有的模板二开过,有些文件在系统内,可能整站出售。','极致CMS免费吗?','1', NULL,'

    极致CMS完全免费,不收取系统的授权费,且免费商用!

    但是,有的模板如果有标记授权或者付费的,另当别论,因为有的模板二开过,有些文件在系统内,可能整站出售。

    ','1642943290','0','32','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('6','网站死链接应该如何处理','8', NULL,'znxw', NULL,'网站死链接应该如何处理?当你的网站有了死链接之后,你觉得这些链接对网站的影响不是很大,那么就可以删除这些链接,但是在删除的过程中一定要注意不能扩大化删除链接,即删除链接不要太多,将死链接删除即可。而遇...','网站死链接应该如何处理','1','/static/upload/2022/01/19/202201199543.jpg','

    网站死链接应该如何处理?当你的网站有了死链接之后,你觉得这些链接对网站的影响不是很大,那么就可以删除这些链接,但是在删除的过程中一定要注意不能扩大化删除链接,即删除链接不要太多,将死链接删除即可。而遇到一些栏目链接的时候一定不要将之删除了,那样会造成网站栏目的缺乏,站在用户体验的角度上来讲无法对用户构成利好,可能用户这次进入了你的网站,下次看到你的网站就会直接关闭,不能够形成用户二次访问率。


    转化页面,当你检查到网站的页面不存在的时候就可以设置转化页面进行转化,不过这个过程比较复杂,如果网站的死链接过多,那么对站长的技术与耐心也是一个挑战。


    利用屏蔽方法,所谓的屏蔽方法就是通过robots.txt文档将死链接屏蔽掉,让搜索引擎蜘蛛不能发现这些链接的存在,从搜索引擎的角度来讲这个方法是有效的,它逃避了搜索引擎的处罚。但是这个方法却不能够长期的使用,因为这样会造成整个网站垃圾信息过多,还不如通过404引导页面进行引导点击,这种效果对用户与搜索引擎都友好。


    错误链接处理方法:


    当网站打不开的时候先不要着急,看看是否是你输入错误。最好的解决方法就是细心。由此导弹总结以下两点希望各位站长注意:总体来说死链接和错误链接都是一样的,都是打不开的页面。工作中多多细心尽量减少死链接页面,因为死链接越多对你的优化和用户体验越不利。减少客户操作失误造成的错误链接,最好的办法就是用一个简单易记,方便输入的域名。域名中最好不要带符号等。


    首先要明确自己建站的目的是什么?


    网站类型非常之多,每一种类型其建站的目的都是不一致的,我们以企业网站为例子,企业网站无疑就是品牌产品宣传的主要阵地,主要需要面度的是定向客户因为行业不一致导致用户细分也是有差异的,在比如一个个人站长资讯类站点挂百度或者谷歌广告,当然流量为王,越多的访问量才能增加广告被点击的几率可见两者的目的有着质的区别,这一点大家一定要弄清楚。


    网站上线之前的栏目策划是必须的。


    我们知道,一个裸站是没有任何价值和意义的,网站新上线我们首先要进行外包装,比如LOGO,网站导航的设置,网站界面美工的优化,然后针对自己站点的用户需求和关键词的竞争度分析,仔细做好网站栏目的添加,这些细节全部设置好之后,我们就要针对网站内容进行关键词的布局,合理的规划首页布局尽可能的囊括所有SEO优化细节。


    网站上线之后第一时间提交各大搜索引擎。


    作为一个站长,网站建设并不是我们的最终目的,我们的核心是关注网站的权重和排名,seo优化的思维是贯穿在整个网站建设的过程中的,网站上线之后一个非常重要的细节就是尽快提交至各大搜索引擎,提交之前我们要注意一个细节要点,就是尽可能的为网站更新2篇到三篇文章,文章一定要注意质量,新站上线一定要为用户和搜索引擎留下良好的第一印象才对,这个时候我们就可以登陆各大搜索引擎的提交入口了,接下来的工作我就不用在赘述了吧!内容、外链、关键词分析布局,坚持就这样把这些基础工作做精做细吧!


    ','1642644634','0','88','1','0','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0'); INSERT INTO `jz_article` (`id`,`title`,`tid`,`molds`,`htmlurl`,`keywords`,`description`,`seo_title`,`userid`,`litpic`,`body`,`addtime`,`orders`,`hits`,`isshow`,`comment_num`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`) VALUES ('12','网站SEO优化需要原创内容吗?','9','article','xyxw','seo', NULL,'网站SEO优化需要原创内容吗?','0','/static/upload/2022/01/26/202201267840.jpg','

    随着互联网发展的日渐成熟,越来越多人选择做百度自然排名SEO,那么,有很多人就疑惑了,网站SEO优化需要原创内容吗?答案是肯定的,原因如下:


      1、百度蜘蛛更喜欢原创文章


      原创文章很重要,特别是对于新站来说,因为百度蜘蛛对于抄袭的文章会厌恶,如果百度蜘蛛在爬取你的网站的时候,发现你的网站的内容是以前网上发布过的,那么收录你的网站的文章的可能性就会变得极低,百度蜘蛛不收录,你的网站被客户搜索到的几率也就会大大降低,当客户都没办法搜索到你的网站的时候,网站建设也就没有意义可言了。所以企业网站SEO优化的时候,一定要坚持写原创文章,而且需要持续性的更新,这虽然是一个漫长的过程,但是却非常重要。


      原创的内容,不仅受百度蜘蛛喜爱,也更受客户欢迎。如果客户在浏览你的网站的时候,发现你网站的内容是网上没有过的,比较新颖的,也会特别关注你的网站,浏览的时间也就会更长,交易的可能性也就越高。当客户都喜欢网站的内容的时候,搜索引擎也会了解到这一点,在爬取的时候也会收录更多的内容。所以,坚持原创内容的更新,是一个良性循环、一举两得的事情。


    网站质量


      2、内容原创很重要,价值更重要


      原创文章对于企业网站SEO优化是很重要,但是原创文章就一定可以吗?答案也是否定的,在做内容的时候,我们也不能因为原创而原创。很多站长为了原创,利用一些伪原创工具制造文章更新,这么做文章的原创度是提高了,但是内容却没有任何价值可言,没有价值的内容,不仅百度蜘蛛不会喜欢,用户更不会喜欢,长此以往,百度蜘蛛也就不会再来爬取你的站点了,收录只会越来越少。所以,站长在做企业网站的时候,万不能为了原创而丢了质量,要坚持带给客户原创,坚持文章内容的可读性,坚持具有价值的内容,牺牲网站内容质量去迎合百度蜘蛛是非常愚蠢的行为。


      3、伪原创是否可行?


      在某种意义上来说,伪原创也是可行的,转载也可以。但是一定要注意比例,原创文章为主,伪原创转载类文章为辅。如果伪原创或者转载的内容是质量高的,对用户非常有价值的,那么你的文章哪怕不是原创,百度蜘蛛也会很喜欢,会收录。当然,哪怕是伪原创或者转载的内容,也需要注意跟网站的相关性,不能随意转载。


      原创内容确实很重要,但是也需要掌握原创的方法,注重营销型网站内容的内容建设,重视内容的可读性,不能为了迎合百度蜘蛛忽略了用户,搜索引擎是根本,用户体验是未来发展的方向,二者不是独立的,需要相辅相成。


      以上就是《网站SEO优化需要原创内容吗?》的全部内容,仅供站长朋友们互动交流学习,SEO优化是一个需要坚持的过程,希望大家一起共同进步。


    ','1643161498','0','9','0','0','0','0','0', NULL,'1', NULL, NULL, NULL, NULL,'0'); -- ---------------------------- -- Records of jz_attr -- ---------------------------- INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('1','置顶','1'); INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('2','热点','1'); INSERT INTO `jz_attr` (`id`,`name`,`isshow`) VALUES ('3','推荐','1'); -- ---------------------------- -- Records of jz_buylog -- ---------------------------- INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('1','0','1','No20220123161635','3','jifen','登录奖励', NULL,'1.00','1.00','1642925795'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('2','9','0','No20220123220149','3','jifen','点赞奖励','product','1.00','1.00','1642946509'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('3','9','0','No20220123220206','3','jifen','取消点赞','product','-1.00','-1.00','1642946526'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('4','9','0','No20220123220209','3','jifen','点赞奖励','product','1.00','1.00','1642946529'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('5','9','0','No20220123220358','3','jifen','取消点赞','product','-1.00','-1.00','1642946638'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('6','10','0','No20220123220410','3','jifen','点赞奖励','product','1.00','1.00','1642946650'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('7','9','0','No20220123220413','3','jifen','点赞奖励','product','1.00','1.00','1642946653'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('8','8','0','No20220123220415','3','jifen','点赞奖励','product','1.00','1.00','1642946655'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('9','9','0','No20220123220441','3','jifen','收藏奖励','product','1.00','1.00','1642946681'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('10','9','0','No20220123220450','3','jifen','取消收藏','product','-1.00','-1.00','1642946690'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('11','9','0','No20220123220450','3','jifen','取消收藏','product','-1.00','-1.00','1642946690'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('12','9','0','No20220123220655','3','jifen','收藏奖励','product','1.00','1.00','1642946815'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('13','10','0','No20220123220726','3','jifen','收藏奖励','product','1.00','1.00','1642946846'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('14','7','0','No20220123220730','3','jifen','收藏奖励','product','1.00','1.00','1642946850'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('15','10','0','No20220123221918','3','jifen','取消收藏','product','-1.00','-1.00','1642947558'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('16','10','0','No20220123221918','3','jifen','取消收藏','product','-1.00','-1.00','1642947558'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('17','10','0','No20220123221923','3','jifen','收藏奖励','product','1.00','1.00','1642947563'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('18','9','0','No20220123224512','3','jifen','取消收藏','product','-1.00','-1.00','1642949112'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('19','9','0','No20220123224512','3','jifen','取消收藏','product','-1.00','-1.00','1642949112'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('20','10','0','No20220123224623','3','jifen','取消点赞','product','-1.00','-1.00','1642949183'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('21','0','1','No20220125083513','3','jifen','登录奖励', NULL,'1.00','1.00','1643070913'); INSERT INTO `jz_buylog` (`id`,`aid`,`userid`,`orderno`,`type`,`buytype`,`msg`,`molds`,`amount`,`money`,`addtime`) VALUES ('22','0','1','No20220126083805','3','jifen','登录奖励', NULL,'1.00','1.00','1643157485'); -- ---------------------------- -- Records of jz_cachedata -- ---------------------------- -- ---------------------------- -- Records of jz_chain -- ---------------------------- -- ---------------------------- -- Records of jz_classtype -- ---------------------------- INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('1','公司产品','公司产品','product', NULL, NULL, NULL, NULL,'0','1','1','1','0','0','product','list','details','9','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('2','公司新闻','公司新闻','article', NULL, NULL, NULL, NULL,'0','1','1','1','0','0','news','article-list','article-details','10','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('3','关于我们','关于我们','page', NULL, NULL, NULL,'

    极致CMS是一款免费开源的建站系统。具备基础的CMS模型,可以使用它进行发布更新,进行内容管理。

    而除此之外,它还有会员模块,支付模块,积分模块,不仅拥有丰富的插件,还可以自由扩展。

    简单的模板标签,使你能够更快更便捷的建站。强大的拓展性,让它能够胜任市场上绝大多数的功能开发。

    具备良好的SEO优化,更容易被浏览器抓取收录。毫秒级响应,百万数据承载,对大数据处理有非常丰富的经验。

    ','0','1','1','0','0','0','about-us','about-us','article-details','10','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('4','联系我们','联系我们','message','/static/cms/static/images/jizhicms.jpg', NULL, NULL, NULL,'0','1','1','0','0','0','contact','contact-us', NULL,'10','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('5','常见问题','常见问题','article', NULL, NULL, NULL, NULL,'0','1','1','0','0','0','faq','faq','article-details','10','0', NULL,'0','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('6','免费模板','免费模板','product', NULL, NULL, NULL, NULL,'0','1','1','0','1','0','free','list','details','9','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('7','商业模板','商业模板','product', NULL, NULL, NULL, NULL,'0','1','1','0','1','0','business','list','details','9','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('8','站内新闻','站内新闻','article', NULL, NULL, NULL, NULL,'0','1','1','0','2','0','znxw','article-list','article-details','10','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('9','行业新闻','行业新闻','article', NULL, NULL, NULL, NULL,'0','1','1','0','2','0','xyxw','article-list','article-details','10','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('10','用户评价','用户评价','pingjia', NULL, NULL, NULL, NULL,'0','1','0','0','0','0','yhpj','lists','details','10','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('11','技术支持','技术支持','page', NULL, NULL, NULL, NULL,'0','1','1','0','3','0','support','page','details','10','0','https://www.jizhicms.cn','1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('12','隐私协议','隐私协议','page', NULL, NULL, NULL,'

    极致CMS遵循 MIT协议!

    除此外,极致CMS不允许做违纪违法的事情,如果有参与,一律自行负责,与极致CMS无关!

    ','0','1','1','0','3','0','privacy-agreement','page','details','10','0', NULL,'1','0', NULL); INSERT INTO `jz_classtype` (`id`,`classname`,`seo_classname`,`molds`,`litpic`,`description`,`keywords`,`body`,`orders`,`orderstype`,`isshow`,`iscover`,`pid`,`gid`,`htmlurl`,`lists_html`,`details_html`,`lists_num`,`comment_num`,`gourl`,`ishome`,`isclose`,`gids`) VALUES ('13','广告合作','广告合作','page', NULL, NULL, NULL,'

    极致CMS由开发者 留恋风(如沐春)[ 25841047041@qq.com ] 独立开发完成!

    Gitee :https://gitee.com/Cherry_toto/jizhicms

    Github :https://github.com/Cherry-toto/jizhicms


    邮箱 :2581047041@qq.com

    QQ :2581047041

    微信 :TF-2581047041


    极致CMS源码不会携带任何广告,如果有广告合作的朋友,暂时不会在系统上加,十分抱歉!

    可以通过邮箱或者QQ联系(由于提问的人数过多,建议发送邮件咨询,QQ已加爆!),另外主要在QQ交流群内解答问题,如果你有问题,可以到QQ群里来提问。


    如果有其他项目合作的朋友,随时可以添加QQ微信联系我!

    ','0','1','1','0','3','0','cooperation','page','details','10','0', NULL,'1','0', NULL); -- ---------------------------- -- Records of jz_collect -- ---------------------------- -- ---------------------------- -- Records of jz_collect_type -- ---------------------------- -- ---------------------------- -- Records of jz_comment -- ---------------------------- INSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('1','8','6','0','0','很不错!', NULL,'1642931294','1','0','1','0'); INSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('2','8','6','1','0',' @iPHfa6 干得漂亮!', NULL,'1642932172','1','0','1','0'); INSERT INTO `jz_comment` (`id`,`tid`,`aid`,`pid`,`zid`,`body`,`reply`,`addtime`,`userid`,`likes`,`isshow`,`isread`) VALUES ('3','6','10','0','0','很不错哦!', NULL,'1643167629','1','0','1','0'); -- ---------------------------- -- Records of jz_ctype -- ---------------------------- INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('1','基本设置','base',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('2','高级设置','high-level',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('3','搜索配置','searchconfig',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('4','邮件订单','email-order',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('5','支付配置','payconfig',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('6','公众号配置','wechatbind',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('7','积分配置','jifenset',1,1); INSERT INTO `jz_ctype` (`id`,`title`,`action`,`sys`,`isopen`) VALUES ('8','图片水印','imagewatermark',1,1); -- ---------------------------- -- Records of jz_customurl -- ---------------------------- -- ---------------------------- -- Records of jz_fields -- ---------------------------- INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('1','url','links','链接地址', NULL,'1',',0,','255', NULL,'0','1','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('2','title','links','链接名称', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('3','email','message','联系邮箱', NULL,'1', NULL,'255', NULL,'0','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('4','keywords','tags','关键词','尽量简短,但不能重复','1', NULL,'50', NULL,'0','1','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('5','newname','tags','替换词','尽量简短,但不能重复,20字以内,可不填。【已废弃】','1', NULL,'50', NULL,'0','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('7','num','tags','替换次数','一篇文章内替换的次数,默认-1,全部替换【已废弃】','4', NULL,'4', NULL,'0','0','1','0','0','0', NULL,'-1','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('8','target','tags','打开方式', NULL,'7', NULL,'50','新窗口=_blank,本窗口=_self','0','0','1','0','0','0', NULL,'_blank','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('9','number','tags','标签数','无需填写,程序自动处理','4', NULL,'11', NULL,'0','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('10','member_id','article','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('11','member_id','product','用户','前台会员,无需填写','15', NULL,'11','3,username','0','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('12','member_id','links','发布用户','前台会员,无需填写','13', NULL,'11','3,username','0','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('13','target','links','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('14','ownurl','links','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('15','ownurl','tags','自定义URL','默认为空,自定义URL','1', NULL,'255', NULL,'0','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('16','addtime','links','添加时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('17','addtime','tags','添加时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('43','molds','product','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('19','title','article','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','0','0','250','1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('20','tid','article','所属栏目', NULL,'17', NULL,'13', NULL,'1','1','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('21','molds','article','模型', NULL,'15', NULL,'50', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('22','htmlurl','article','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('23','keywords','article','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('24','description','article','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('25','seo_title','article','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('26','userid','article','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('27','litpic','article','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('28','body','article','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('29','addtime','article','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('30','orders','article','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('31','hits','article','点击量', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('32','isshow','article','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','1','1', NULL,'1','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('33','comment_num','article','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('34','istop','article','是否置顶:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('35','ishot','article','是否头条:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('36','istuijian','article','是否推荐:1是0否', NULL,'1',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','2','是=1,否=0','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('37','tags','article','Tags', NULL,'19',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,','255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('38','target','article','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('39','ownurl','article','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','1', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('40','jzattr','article','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','0','0','150','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('41','tids','article','副栏目', NULL,'18', NULL,'255', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('42','zan','article','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('44','title','product','标题', NULL,'1', NULL,'255', NULL,'1','1','1','1','1','1', NULL, NULL,'1','100','0','300','1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('45','seo_title','product','SEO标题', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('46','tid','product','所属栏目', NULL,'17', NULL,'11', NULL,'1','0','1','1','1','1', NULL,'0','1','100','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('47','hits','product','点击量', NULL,'4',',0,10,','11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('48','htmlurl','product','栏目链接', NULL,'1', NULL,'255', NULL,'1','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('49','keywords','product','关键词', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('50','description','product','简介', NULL,'2', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('51','litpic','product','缩略图', NULL,'5', NULL,'255', NULL,'1','0','1','1','0','1', NULL, NULL,'1','100','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('52','stock_num','product','库存', NULL,'1', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('53','price','product','价格', NULL,'1', NULL,'10,2', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('54','pictures','product','图集', NULL,'6',',0,1,2,3,4,5,6,7,8,9,10,11,12,13,', NULL, NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('55','isshow','product','是否显示', NULL,'7',',0,','1','显示=1,未审=0,退回=2','1','0','1','1','0','1', NULL,'1','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('56','comment_num','product','评论数', NULL,'4', NULL,'11', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('57','body','product','内容', NULL,'3', NULL,'0', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('58','userid','product','管理员', NULL,'15', NULL,'11','11,name','1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('59','orders','product','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','100','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('60','addtime','product','发布时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('61','istop','product','是否置顶:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('62','ishot','product','是否头条:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('63','istuijian','product','是否推荐:1是0否', NULL,'1', NULL,'2', NULL,'1','0','1','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('64','tags','product','Tags', NULL,'19', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('65','target','product','外链', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('66','ownurl','product','自定义链接', NULL,'1', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('67','jzattr','product','推荐属性', NULL,'16', NULL,'255','14,name','1','0','1','1','1','1', NULL, NULL,'1','100','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('68','tids','product','副栏目', NULL,'18', NULL,'255', NULL,'1','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('69','zan','product','点赞数', NULL,'4', NULL,'11', NULL,'1','0','1','1','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('70','isshow','tags','是否显示', NULL,'7', NULL,'1','显示=1,隐藏=0,退回=2','0','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('71','lx','product','类型', NULL,'7',',1,6,7,','2','响应式=1,PC=2,手机=3,PC+手机=4,小程序=5','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('72','color','product','颜色', NULL,'7',',1,6,7,','2','红色=1,橙色=2,黄色=3,绿色=4,蓝色=5,紫色=6,粉色=7','2','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('73','hy','product','行业', NULL,'8',',1,6,7,','500','金融/证券=1,IT科技/软件=2,教育/培训=3,珠宝/工艺品=4,五金/机电=5,婚庆/摄影/美容=6,旅游/餐饮/美食=7,房产/汽车/运输=8,休闲/文化=9,医疗/生物/化工=10,儿童/游乐园=11,动物/宠物=12,鲜花/礼物=13,运动/俱乐部=14,生态/农业=15,建筑/装饰=16,广告/网站/设计=17,个人/导航/博客=18','2','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('74','title','pingjia','用户名','默认为空','1',',0,10,','255', NULL,'100','0','1','1','1','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('75','tid','pingjia','所属栏目','选择栏目','17',',10,','11', NULL,'100','0','1','1','1','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('76','tids','pingjia','副栏目','绑定后可以在当前模型的其他栏目中显示','18', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('77','keywords','pingjia','关键词','每个词用英文逗号(,)拼接','1', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('78','tags','pingjia','TAG','每个词用英文逗号(,)拼接','19', NULL,'255', NULL,'100','0','1','0','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('79','litpic','pingjia','头像','可留空','5',',0,10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('80','description','pingjia','简述','可留空','2',',0,10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('81','body','pingjia','内容','可留空','3',',10,','500', NULL,'100','0','1','1','0','0', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('82','member_id','pingjia','发布会员','前台发布会员ID记录','13', NULL,'11','3,username','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('83','userid','pingjia','管理员','后台发布管理员ID记录','13', NULL,'11','11,name','100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('84','target','pingjia','外链URL','默认为空,系统访问内容则直接跳转到此链接','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('85','ownurl','pingjia','自定义URL','默认为空,自定义URL','1', NULL,'255','11,name','100','0','0','0','0','0', NULL, NULL,'1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('86','hits','pingjia','点击量','系统自动添加','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('87','comment_num','pingjia','评论数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('88','zan','pingjia','点赞数','系统自带','4', NULL,'11', NULL,'100','0','0','0','0','0', NULL,'0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('89','addtime','pingjia','添加时间','选择时间','11',',10,','11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('90','jzattr','pingjia','推荐属性','1置顶2热点3推荐','16', NULL,'50','14,name','100','0','1','0','0','0', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('91','isshow','pingjia','是否显示','显示隐藏','7',',10,','1','显示=1,隐藏=0,退回=2','100','0','1','1','1','1', NULL,'1','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('92','zhiye','pingjia','职业', NULL,'1',',10,','255', NULL,'100','0','1','1','0','1', NULL, NULL,'1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('93','orders','pingjia','排序', NULL,'4', NULL,'4', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (94, 'username', 'member', '用户昵称', NULL, 1, ',0,', '255', NULL, 2, 1, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (95, 'openid', 'member', '微信OPENID', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (96, 'sex', 'member', '性别', NULL, 12, ',0,', '2', '男=1,女=2,未知=0', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (97, 'gid', 'member', '会员分组', NULL, 13, ',0,', '11', '6,name', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (98, 'litpic', 'member', '会员头像', NULL, 5, ',0,', '255', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (99, 'tel', 'member', '电话号码', NULL, 1, ',0,', '12', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (100, 'jifen', 'member', '积分', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (101, 'money', 'member', '金币', NULL, 14, ',0,', '10,2', NULL, 2, 0, 1, 1, 0, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (102, 'email', 'member', '邮箱', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (103, 'province', 'member', '省份', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (104, 'city', 'member', '城市', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (105, 'address', 'member', '详细地址', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (106, 'regtime', 'member', '注册时间', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (107, 'logintime', 'member', '最近登录', NULL, 11, ',0,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (108, 'signature', 'member', '个性签名', NULL, 1, ',0,', '255', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (109, 'birthday', 'member', '生日', NULL, 1, ',0,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (110, 'pid', 'member', '推荐人', NULL, 13, ',0,', '11', '3,username', 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (111, 'isshow', 'member', '状态', '封禁后不能登录', 7, ',0,', '2', '正常=1,封禁=0', 2, 0, 1, 1, 1, 1, NULL, '1', 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (112, 'title', 'message', '标题', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (113, 'user', 'message', '用户昵称', NULL, 1, ',4,', '255', NULL, 2, 0, 1, 0, 1, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (114, 'tid', 'message', '相关栏目', NULL, 13, ',4,', '11', '2,classname', 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (115, 'tel', 'message', '联系电话', NULL, 1, ',4,', '20', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (116, 'ip', 'message', '留言IP', NULL, 1, ',4,', '50', NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (117, 'body', 'message', '留言内容', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (118, 'isshow', 'message', '是否审核', NULL, 7, ',4,', '1', '未审核=0,已审核=1', 2, 0, 1, 1, 1, 1, NULL, '0', 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (119, 'addtime', 'message', '提交时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (120, 'reply', 'message', '回复留言', NULL, 3, ',4,', NULL, NULL, 2, 0, 1, 1, 0, 0, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (121, 'uploadsize', 'member', '上传限制', '单位M,上传总文件大小限制,超过此大小不允许上传', 4, ',0,', '11', NULL, 2, 0, 0, 1, 0, 0, NULL, '0', 1, 0, 0, NULL, 0); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('122','updatetime','article','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','0','0','150','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('123','updatetime','product','更新时间', NULL,'11',NULL,'11', NULL,'1','0','1','1','0','1', NULL,'0','1','99','0','120','0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('124','updatetime','pingjia','更新时间','选择时间','11',NULL,'11', NULL,'100','0','1','1','0','1','date_2','0','1','0','0', NULL,'1'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES (125, 'updatetime', 'message', '更新时间', NULL, 11, ',4,', '11', NULL, 2, 0, 1, 1, 1, 1, NULL, NULL, 1, 0, 0, NULL, 1); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('126','updatetime','links','更新时间','系统自带','11', NULL,'11', NULL,'0','0','0','0','0','0','date_2','0','1','0','0', NULL,'0'); INSERT INTO `jz_fields` (`id`,`field`,`molds`,`fieldname`,`tips`,`fieldtype`,`tids`,`fieldlong`,`body`,`orders`,`ismust`,`isshow`,`isadmin`,`issearch`,`islist`,`format`,`vdata`,`isajax`,`listorders`,`isext`,`width`,`ishome`) VALUES ('127','updatetime','tags','更新时间','系统自带','11', NULL,'11', NULL,'0','0','1','1','0','0','date_2','0','1','0','0', NULL,'1'); -- ---------------------------- -- Records of jz_hook -- ---------------------------- -- ---------------------------- -- Records of jz_layout -- ---------------------------- INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('1','系统默认','[]','[{"name":"内容管理","icon":"&#xe6b4;","nav":[{"key":"16948","title":"内容列表","value":"9","icon":""},{"key":"12349","title":"商品列表","value":"105","icon":""},{"key":"19748","title":"推荐属性","value":"202","icon":""}]},{"name":"栏目管理","icon":"&#xe699;","nav":[{"key":"10518","title":"栏目列表","value":"42","icon":""}]},{"name":"互动管理","icon":"&#xe69b;","nav":[{"key":"11832","title":"留言列表","value":"22","icon":""},{"key":"11262","title":"评论列表","value":"16","icon":""}]},{"name":"SEO设置","icon":"&#xe6b3;","nav":[{"key":"16628","title":"TAG列表","value":"147","icon":""},{"key":"16214","title":"友情链接","value":"95","icon":""},{"key":"16254","title":"网站地图","value":"153","icon":""},{"key":"16917","title":"内链列表","value":"210","icon":""}]},{"name":"用户管理","icon":"&#xe6b8;","nav":[{"key":"11957","title":"会员列表","value":"2","icon":""},{"key":"15086","title":"会员分组","value":"118","icon":""},{"key":"10618","title":"会员权限","value":"123","icon":""},{"key":"17578","title":"管理员列表","value":"54","icon":""},{"key":"19552","title":"角色管理","value":"49","icon":""},{"key":"10895","title":"权限列表","value":"66","icon":""},{"key":"12582","title":"订单列表","value":"129","icon":""},{"key":"17076","title":"充值列表","value":"177","icon":""}]},{"name":"系统设置","icon":"&#xe6ae;","nav":[{"key":"11314","title":"网站设置","value":"40","icon":""},{"key":"10572","title":"桌面设置","value":"70","icon":""},{"key":"18242","title":"导航设置","value":"190","icon":""},{"key":"13002","title":"轮播图","value":"83","icon":""},{"key":"15936","title":"轮播图分类","value":"89","icon":""},{"key":"19847","title":"清理缓存","value":"114","icon":""},{"key":"12739","title":"模板列表","value":"223","icon":""},{"key":"127391","title":"配置栏目","value":"240","icon":""}]},{"name":"扩展管理","icon":"&#xe6ce;","nav":[{"key":"11957","title":"插件列表","value":"76","icon":""},{"key":"13870","title":"图库管理","value":"116","icon":""},{"key":"12472","title":"模型列表","value":"61","icon":""},{"key":"15551","title":"数据库备份","value":"35","icon":""},{"key":"16311","title":"碎片化","value":"194","icon":""},{"key":"18982","title":"公众号菜单","value":"141","icon":""},{"key":"14568","title":"公众号素材","value":"142","icon":""},{"key":"13219","title":"模板制作","value":"143","icon":""},{"key":"17893","title":"生成静态文件","value":"154","icon":""},{"key":"16926","title":"登录日志","value":"115","icon":""}]},{"name":"回收站","icon":"&#xe8a3;","nav":[{"key":"17056","title":"回收站","value":"217","icon":""}]},{"name":"评价管理","icon":"&#xe717;","nav":[{"key":"16835","title":"用户评价","value":"227","icon":""}]}]','0','CMS默认配置,不可删除!','1','1'); INSERT INTO `jz_layout` (`id`,`name`,`top_layout`,`left_layout`,`gid`,`ext`,`sys`,`isdefault`) VALUES ('2','旧版桌面','[]','[{"name":"网站管理","icon":"&#xe699;","nav":["42","9","95","83","147","22"]},{"name":"商品管理","icon":"&#xe698;","nav":["105","129","2","118","123","16","177"]},{"name":"扩展管理","icon":"&#xe6ce;","nav":["76","116","141","142","143","194","35","61","154","153"]},{"name":"系统设置","icon":"&#xe6ae;","nav":["40","54","49","190","70","115","114","66"]}]','0','旧版本配置','0','0'); -- ---------------------------- -- Records of jz_level -- ---------------------------- INSERT INTO `jz_level` (`id`,`name`,`pass`,`tel`,`gid`,`email`,`regtime`,`logintime`,`status`) VALUES ('1','admin','0acdd3e4a8a2a1f8aa3ac518313dab9d','13600136000','1','123456@qq.com','1635997469','1643156842','1'); -- ---------------------------- -- Records of jz_level_group -- ---------------------------- INSERT INTO `jz_level_group` (`id`,`name`,`isadmin`,`ischeck`,`classcontrol`,`paction`,`tids`,`isagree`,`description`) VALUES ('1','超级管理员','1','0','0',',Fields,', NULL,'1', NULL); -- ---------------------------- -- Records of jz_likes -- ---------------------------- INSERT INTO `jz_likes` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('4','6','9','1','1642946653'); INSERT INTO `jz_likes` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('5','7','8','1','1642946655'); -- ---------------------------- -- Records of jz_link_type -- ---------------------------- INSERT INTO `jz_link_type` (`id`,`name`,`addtime`) VALUES ('1','首页','1642818560'); -- ---------------------------- -- Records of jz_links -- ---------------------------- INSERT INTO `jz_links` (`id`,`title`,`molds`,`url`,`isshow`,`tid`,`userid`,`htmlurl`,`orders`,`member_id`,`target`,`ownurl`,`addtime`) VALUES ('1','极致CMS','links','https://www.jizhicms.cn','1','1','1', NULL,'0','0', NULL, NULL,'0'); INSERT INTO `jz_links` (`id`,`title`,`molds`,`url`,`isshow`,`tid`,`userid`,`htmlurl`,`orders`,`member_id`,`target`,`ownurl`,`addtime`) VALUES ('2','极致应用市场','links','https://app.jizhicms.cn','1','1','1', NULL,'0','0', NULL, NULL,'0'); -- ---------------------------- -- Records of jz_member -- ---------------------------- INSERT INTO `jz_member` (`id`,`username`,`openid`,`pass`,`token`,`sex`,`gid`,`litpic`,`tel`,`jifen`,`likes`,`collection`,`money`,`email`,`address`,`province`,`city`,`regtime`,`logintime`,`isshow`,`signature`,`birthday`,`follow`,`fans`,`ismsg`,`iscomment`,`iscollect`,`islikes`,`isat`,`isrechange`,`pid`) VALUES ('1','极致用户', NULL,'1321321321312', NULL,'0','1','/static/upload/user/head_1.jpeg','13600136000','3.00', NULL, NULL,'0.00', NULL, NULL, NULL, NULL,'1642925638','1643157485','1', NULL, NULL, NULL,'0','1','1','1','1','1','1','0'); -- ---------------------------- -- Records of jz_member_group -- ---------------------------- INSERT INTO `jz_member_group` (`id`,`name`,`description`,`paction`,`pid`,`isagree`,`iscomment`,`ischeckmsg`,`addtime`,`orders`,`discount`,`discount_type`) VALUES ('1','注册会员','前台会员分组,最低等级分组',',Message,Comment,User,Order,Home,Common,Uploads,','0','1','1','1','0','0','0.00','0'); -- ---------------------------- -- Records of jz_menu -- ---------------------------- -- ---------------------------- -- Records of jz_message -- ---------------------------- INSERT INTO `jz_message` (`id`,`title`,`userid`,`tid`,`aid`,`user`,`ip`,`body`,`tel`,`addtime`,`orders`,`email`,`isshow`,`istop`,`hits`,`tids`) VALUES ('1','联系我们','0','0','0','测试客户','127.0.0.1','

    这是一条测试留言

    ','13600136000','1643100950','0','123456@qq.com','0','0','0', NULL); INSERT INTO `jz_message` (`id`,`title`,`userid`,`tid`,`aid`,`user`,`ip`,`body`,`tel`,`addtime`,`orders`,`email`,`isshow`,`istop`,`hits`,`tids`) VALUES ('2','联系我们','0','0','0','测试123','127.0.0.1','

    这是一条测试留言

    ','13600136000','1643102345','0','2311232131@qq.com','0','0','0', NULL); -- ---------------------------- -- Records of jz_molds -- ---------------------------- INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('1','内容','article','1','1','1','1','1','1','article-list.html','article-details.html','100','0','1'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('2','栏目','classtype','1','1','1','1','1','1','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('3','会员','member','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('4','订单','orders','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('5','商品','product','1','1','1','1','1','1','list.html','details.html','100','0','1'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('6','会员分组','member_group','1','1','0','0','1','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('7','评论','comment','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('8','留言','message','1','1','0','0','1','1','message.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('9','轮播图','collect','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('10','友情链接','links','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('11','管理员','level','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('12','TAG','tags','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('13','单页','page','1','1','1','1','1','1','page.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('14','推荐属性','attr','1','1','0','0','0','0','list.html','details.html','100','1','0'); INSERT INTO `jz_molds` (`id`,`name`,`biaoshi`,`sys`,`isopen`,`iscontrol`,`ismust`,`isclasstype`,`isshowclass`,`list_html`,`details_html`,`orders`,`ispreview`,`ishome`) VALUES ('15','用户评价','pingjia','0','1','0','1','1','1','lists.html','details.html','100','0','0'); -- ---------------------------- -- Records of jz_orders -- ---------------------------- INSERT INTO `jz_orders` (`id`,`orderno`,`userid`,`paytype`,`ptype`,`tel`,`username`,`tid`,`price`,`jifen`,`qianbao`,`body`,`receive_username`,`receive_tel`,`receive_email`,`receive_address`,`ispay`,`paytime`,`addtime`,`send_time`,`isshow`,`discount`,`yunfei`) VALUES ('1','No20220125084425','1', NULL,'1','13600136000','iPHfa6','0','0.01','1.00','0.01','||7-6-1-0.01||', NULL, NULL, NULL, NULL,'0','0','1643071465','0','1','0.00','0.00'); INSERT INTO `jz_orders` (`id`,`orderno`,`userid`,`paytype`,`ptype`,`tel`,`username`,`tid`,`price`,`jifen`,`qianbao`,`body`,`receive_username`,`receive_tel`,`receive_email`,`receive_address`,`ispay`,`paytime`,`addtime`,`send_time`,`isshow`,`discount`,`yunfei`) VALUES ('2','No20220125151109','1', NULL,'1','13600136000','iPHfa6','0','0.02','2.00','0.02','||7-7-2-0.01||', NULL, NULL, NULL, NULL,'0','0','1643094669','0','1','0.00','0.00'); -- ---------------------------- -- Records of jz_page -- ---------------------------- -- ---------------------------- -- Records of jz_pictures -- ---------------------------- INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('1','1','0','product','Admin','jpg','14.24','/static/upload/2022/01/19/202201199543.jpg','1642592754','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('2','1','0','product','Admin','jpg','17.91','/static/upload/2022/01/19/202201194641.jpg','1642593917','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('3','1','0','product','Admin','jpg','12.47','/static/upload/2022/01/19/202201198505.jpg','1642594016','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('4','1','0','product','Admin','jpg','10.41','/static/upload/2022/01/19/202201192886.jpg','1642594063','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('5','1','0','product','Admin','jpg','11.62','/static/upload/2022/01/19/202201192968.jpg','1642594125','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('6','8','0','article','Admin','png','79.87','/static/upload/2022/01/20/202201202799.png','1642639629','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('7','8','0','article','Admin','jpg','9.66','/static/upload/2022/01/20/202201202461.jpg','1642639668','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('8','0','0', NULL,'Admin','jpeg','122.31','/static/upload/image/20220120/1642640161966799.jpeg','1642640161','0'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('9','8','0','article','Admin','jpg','13.05','/static/upload/2022/01/20/202201206807.jpg','1642640183','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('10','8','0','article','Admin','jpg','17.91','/static/upload/2022/01/20/202201209692.jpg','1642640284','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('11','9','0','article','Admin','jpg','11.62','/static/upload/2022/01/20/202201201293.jpg','1642640663','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('12','10','0','pingjia','Admin','jpeg','22.38','/static/upload/2022/01/20/202201207970.jpeg','1642678774','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('13','10','0','pingjia','Admin','jpeg','34.07','/static/upload/2022/01/20/202201202736.jpeg','1642678847','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('14','10','0','pingjia','Admin','jpeg','25.34','/static/upload/2022/01/20/202201207507.jpeg','1642679235','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('15','10','0','pingjia','Admin','jpeg','19.63','/static/upload/2022/01/20/202201209411.jpeg','1642679469','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('16','10','0','pingjia','Admin','jpeg','25.94','/static/upload/2022/01/20/202201201541.jpeg','1642679928','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('17','10','0','pingjia','Admin','jpeg','18.82','/static/upload/2022/01/20/202201205173.jpeg','1642680404','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('18','10','0','pingjia','Admin','jpeg','16.53','/static/upload/2022/01/22/202201226081.jpeg','1642817000','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('19','6','0','product','Admin','jpg','11.43','/static/upload/2022/01/24/202201248147.jpg','1643024022','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('20','6','0','product','Admin','jpg','11.04','/static/upload/2022/01/24/202201248943.jpg','1643024022','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('21','6','0','product','Admin','jpg','17.91','/static/upload/2022/01/24/202201244087.jpg','1643024023','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('22','6','0','product','Admin','jpg','14.24','/static/upload/2022/01/24/202201247813.jpg','1643024023','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('23','9','0','article','Home','jpg','16.44','/static/upload/2022/01/26/202201267840.jpg','1643161485','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('24','6','0','product','Home','jpg','41.2','/static/upload/2022/01/26/202201263577.jpg','1643161953','1'); INSERT INTO `jz_pictures` (`id`,`tid`,`aid`,`molds`,`path`,`filetype`,`size`,`litpic`,`addtime`,`userid`) VALUES ('27','0','0','member','Home','jpeg','30.93','/static/upload/user/head_1.jpeg','1643163524','1'); -- ---------------------------- -- Records of jz_pingjia -- ---------------------------- INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('1','10', NULL,'杜*小','/static/upload/2022/01/20/202201207970.jpeg', NULL,'简单、方便,还免费!','

    相比于其他的cms,极致CMS就特别简洁,后台进去没有什么多余的广告信息,清爽简洁!

    ','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642678180','个人博主'); INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('2','10', NULL,'慕*文','/static/upload/2022/01/20/202201202736.jpeg', NULL,'功能强大,免费开源,搞钱神器!','

    找了很多网上的“免费”CMS,除了免费给你看,其他很多都要付费,后台各种广告,随便找个插件都要钱!而且还不能去版权,必须挂到主页底下,自从看到极致CMS后我再也不用担心了,出了功能强大之外,免费开源,想改哪里就改哪里,主页还不用挂版权,真的是业界良心!

    ','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642678780','自由职业'); INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('3','10', NULL,'王*鑫','/static/upload/2022/01/20/202201207507.jpeg', NULL,'开源免费!这个CMS是真的开源免费!','

    不说别人,就开源免费而言,就甩其他同类CMS几条街!什么是开源?有的CMS还加密一些文件。极致CMS不仅免费,而且各个地方都可以自由定义,真的做到了自主自由!群主还经常在群里热心回答,帮助我很多,非常感谢!

    ','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679206','互联网小白'); INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('4','10', NULL,'张小姐','/static/upload/2022/01/20/202201209411.jpeg', NULL,'群主热心,挺不错的cms!','

    刚接触cms时,群主远程手把手帮我安装,虽然我很笨,但是群里好多热心人帮我,帮我解决了一个大难题!

    ','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679458','网站运营'); INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('5','10', NULL,'程*安','/static/upload/2022/01/20/202201201541.jpeg', NULL,'好用,方便,简单。越用越是觉得这个CMS的强大!非常棒!','

    之前朋友推荐给我的这个CMS,当时还是觉得小众,感觉所有的cms都一个样。后面因为要做个站,就选用这个cms,不得不说一开始确实一脸懵逼,特别是他的逻辑跟织梦这些有区别,但是想法却很新颖。后面陆陆续续做了几个站,看了群主的视频教程,对cms也比较了解了,现在随便一个功能型的站,我都能用极致做出来!

    ','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642679894','SEO'); INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('7','10', NULL,'吴*强','/static/upload/2022/01/22/202201226081.jpeg', NULL,'开源免费,容易搞钱!','

    没有用极致CMS之前,都觉得网上的CMS基本上是简单的功能,要功能就得付费,而且对于不懂程序的人而言,那是相当难,自从用了极致之后,你会觉得每一天都在成长,能力越来越强,可以用它来做任何系统!

    ','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642816961','个人站长'); INSERT INTO `jz_pingjia` (`id`,`tid`,`tids`,`title`,`litpic`,`keywords`,`description`,`body`,`molds`,`userid`,`orders`,`member_id`,`comment_num`,`htmlurl`,`isshow`,`target`,`ownurl`,`jzattr`,`hits`,`zan`,`tags`,`addtime`,`zhiye`) VALUES ('6','10', NULL,'梁*宽','/static/upload/2022/01/20/202201205173.jpeg', NULL,'群主好人,免费开源,还经常回答问题!','

    个人觉得cms对新手有一定难度,不过当你真正做了几个站之后,你就会发现这个CMS是真的强大,每当我觉得做不出来功能的时候,群里一问,里面就有群友出一些解决方案,而且自己能完成!对于互联网小白而言,这个是不可思议的,因为我没学过编程,但完成了一个其他CMS需要花很多钱二开的功能!那一刻,很自豪!

    ','pingjia','1','0','0','0', NULL,'1', NULL, NULL,'0','0','0', NULL,'1642680280','博客小新人'); -- ---------------------------- -- Records of jz_plugins -- ---------------------------- -- ---------------------------- -- Records of jz_power -- ---------------------------- INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('1','Common','公共权限','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('2','Home','前台网站','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('3','User','个人中心','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('4','Login','会员登录','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('5','Message','站内留言','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('6','Comment','会员评论','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('7','Screen','网站筛选','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('8','Order','会员下单','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('9','Mypay','网站支付','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('10','Jzpay','极致支付','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('11','Tags','TAG标签','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('12','Wechat','微信模块','0','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('13','Common/vercode','验证码生成','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('14','Common/checklogin','检查是否登录','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('15','Common/multiuploads','多附件上传','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('16','Common/uploads','单附件上传','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('17','Common/qrcode','二维码生成','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('18','Common/get_fields','获取扩展信息','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('19','Common/jizhi','链接错误提示','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('20','Common/error','报错提示','1','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('21','Home/index','网站首页','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('22','Home/jizhi','网站内容','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('23','Home/auto_url','自定义链接','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('24','Home/jizhi_details','详情内容','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('25','Home/search','网站搜索','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('26','Home/searchAll','网站多模块搜索','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('27','Home/start_cache','开启网站缓存','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('28','Home/end_cache','输出缓存','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('29','User/checklogin','检查是否登录','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('30','User/index','个人中心首页','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('31','User/userinfo','会员资料','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('32','User/orders','订单记录','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('33','User/orderdetails','订单详情','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('34','User/payment','订单支付','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('35','User/orderdel','删除订单','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('36','User/changeimg','上传头像','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('37','User/comment','评论列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('38','User/commentdel','删除评论','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('39','User/likesAction','点赞文章','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('40','User/likes','点赞列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('41','User/likesdel','取消点赞','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('42','User/collectAction','收藏文章','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('43','User/collect','收藏列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('44','User/collectdel','删除收藏','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('45','User/cart','购物车','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('46','User/addcart','添加购物车','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('47','User/delcart','删除购物车','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('48','User/posts','发布管理','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('49','User/release','会员发布','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('50','User/del','删除发布','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('51','User/uploads','会员上传附件','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('52','User/jizhi','404提示','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('53','User/follow','关注用户','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('54','User/nofollow','取消关注','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('55','User/fans','粉丝列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('56','User/notify','消息提醒','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('57','User/notifyto','查看消息','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('58','User/notifydel','删除消息','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('59','User/active','公共主页','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('60','User/setmsg','消息提醒设置','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('61','User/getclass','获取栏目列表','2','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('62','User/wallet','用户钱包','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('63','User/buy','会员充值','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('64','User/buylist','充值列表','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('65','User/buydetails','交易详情','3','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('66','Login/index','登录首页','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('67','Login/register','注册页面','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('68','Login/forget','忘记密码','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('69','Login/nologin','未登录页面','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('70','Login/loginout','退出登录','4','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('71','Message/index','发送留言','5','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('72','Comment/index','发表评论','6','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('73','Screen/index','筛选列表','7','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('74','Order/create','创建订单','8','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('75','Order/pay','订单支付','8','1'); INSERT INTO `jz_power` (`id`,`action`,`name`,`pid`,`isagree`) VALUES ('76','Tags/index','TAG标签列表','11','1'); -- ---------------------------- -- Records of jz_product -- ---------------------------- INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('1','product','PC端橙色IT科技教育培训网站模板','PC端橙色IT科技教育培训网站模板','6','1','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201194641.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,', NULL,'0','2','2',',2,3,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('2','product','响应式红色软件公司网站模板','响应式红色软件公司网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201199543.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','1','1',',1,2,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('3','product','手机端黄色五金机电网站模板','手机端黄色五金机电网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201198505.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','3','3',',4,5,6,7,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('4','product','PC+手机绿色医疗生物化工网站模板','PC+手机绿色医疗生物化工网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192886.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','4','4',',10,11,12,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('5','product','蓝色小程序鲜花礼物广告设计网站模板','蓝色小程序鲜花礼物广告设计网站模板','7','0','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192968.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,', NULL,'0','5','5',',2,13,14,15,16,17,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('6','product','PC端橙色IT科技教育培训网站模板','PC端橙色IT科技教育培训网站模板','7','2','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201194641.jpg','99','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','2','2',',2,3,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('7','product','响应式红色软件公司网站模板','响应式红色软件公司网站模板','7','0','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201199543.jpg','98','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',2,2,', NULL,'0','1','1',',1,2,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('8','product','手机端黄色五金机电网站模板','手机端黄色五金机电网站模板','7','1','business', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201198505.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL,',3,', NULL,'0','3','3',',4,5,6,7,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('9','product','PC+手机绿色医疗生物化工网站模板','PC+手机绿色医疗生物化工网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192886.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','4','4',',10,11,12,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('10','product','蓝色小程序鲜花礼物广告设计网站模板','蓝色小程序鲜花礼物广告设计网站模板','6','0','free', NULL,'响应式网站模板源码自适应,同一个后台,数据即时同步,简单适用!附带测试数据!友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!后台:域名/admin.p...','/static/upload/2022/01/19/202201192968.jpg','100','0.01','/static/upload/2022/01/24/202201248147.jpg|A||/static/upload/2022/01/24/202201248943.jpg|B||/static/upload/2022/01/24/202201244087.jpg|C||/static/upload/2022/01/24/202201247813.jpg|D','1','0','

    响应式网站模板源码


    自适应,同一个后台,数据即时同步,简单适用!附带测试数据!

    友好的seo,所有页面均都能完全自定义标题/关键词/描述,PHP程序,安全、稳定、快速;用低成本获取源源不断订单!


    后台:域名/admin.php

    账号:admin

    密码:admin


    使用教程:xxxxx


    模板特点

    1:手工书写DIV+CSS、代码精简无冗余。

    2:自适应结构,全球先进技术,高端视觉体验。

    3:SEO框架布局,栏目及文章页均可独立设置标题/关键词/描述。

    4:附带测试数据、安装教程、入门教程、安全及备份教程。

    5:后台直接修改联系方式、传真、邮箱、地址等,修改更加方便。


    语言程序:PHP + SQLite

    前端规范:html+css+jQuery

    设备支持:PC端+手机端

    浏览器支持:兼容IE7+、Firefox、Chrome、360浏览器等主流浏览器

    最佳分辨率:1920px+1440px

    程序运行环境:linux+nginx/ linux+apache / windows + iis(支持php5.3+) / 其他支持php5.3+环境


    ','1','0','1642592648','0','0','0', NULL,'0', NULL, NULL, NULL, NULL,'0','5','5',',2,13,14,15,16,17,'); INSERT INTO `jz_product` (`id`,`molds`,`title`,`seo_title`,`tid`,`hits`,`htmlurl`,`keywords`,`description`,`litpic`,`stock_num`,`price`,`pictures`,`isshow`,`comment_num`,`body`,`userid`,`orders`,`addtime`,`istop`,`ishot`,`istuijian`,`tags`,`member_id`,`target`,`ownurl`,`jzattr`,`tids`,`zan`,`lx`,`color`,`hy`) VALUES ('11','product','响应式蓝色软件博客模板','响应式蓝色软件博客模板','6','3','free', NULL,'免费响应式蓝色软件博客模板','/static/upload/2022/01/26/202201263577.jpg','10','0.00', NULL,'1','0','

    1、安装教程:极致CMS网站安装教程


    2、网站安全设置教程:极致CMS网站安全设置教程


    3、非模板BUG修改另付费


    4、模板BUG修改请直接联系站长,验证信息请填写您的订单号


    5、不解答有关任何免费模板的问题(解答付费)


    6、后台已配置好,不要乱点,整出些妖蛾子,浪费彼此时间


    7、缩略图请按照源码示例进行制作,要不然又说图片变形什么的


    ','0','0','1643162020','0','0','0', NULL,'1', NULL, NULL, NULL, NULL,'0','1','5',',2,18,'); -- ---------------------------- -- Records of jz_recycle -- ---------------------------- -- ---------------------------- -- Records of jz_ruler -- ---------------------------- INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('1','会员管理','Member','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('2','会员列表','Member/index','1','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('3','添加会员','Member/memberadd','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('4','修改会员','Member/memberedit','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('5','删除会员','Member/member_del','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('6','批量删除','Member/deleteAll','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('7','修改状态','Member/change_status','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('8','内容管理','Article','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('9','内容列表','Article/articlelist','8','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('10','添加内容','Article/addarticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('11','修改内容','Article/editarticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('12','删除内容','Article/deletearticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('13','批量删除','Article/deleteAll','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('14','复制内容','Article/copyarticle','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('15','评论管理','Comment','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('16','评论列表','Comment/commentlist','15','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('17','添加评论','Comment/addcomment','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('18','修改评论','Comment/editcomment','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('19','删除评论','Comment/deletecomment','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('20','批量删除','Comment/deleteAll','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('21','留言管理','Message','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('22','留言列表','Message/messagelist','21','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('23','修改留言','Message/editmessage','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('24','删除留言','Message/deletemessage','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('25','批量删除','Message/deleteAll','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('26','字段管理','Fields','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('27','字段列表','Fields/index','26','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('28','新增字段','Fields/addFields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('29','修改字段','Fields/editFields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('30','删除字段','Fields/deleteFields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('31','获取字段','Fields/get_fields','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('32','基本功能','Index','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('33','系统界面','Index/index','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('34','后台首页','Index/welcome','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('35','数据库备份','Index/beifen','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('36','数据库备份','Index/backup','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('37','数据库还原','Index/huanyuan','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('38','数据库删除','Index/shanchu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('39','系统功能','Sys','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('40','网站设置','Sys/index','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('41','栏目管理','Classtype','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('42','栏目列表','Classtype/index','41','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('43','新增栏目','Classtype/addclass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('44','修改栏目','Classtype/editclass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('45','删除栏目','Classtype/deleteclass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('46','修改排序','Classtype/editClassOrders','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('47','栏目隐藏','Classtype/change_status','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('48','管理员管理','Admin','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('49','角色管理','Admin/group','48','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('50','新增角色','Admin/groupadd','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('51','修改角色','Admin/groupedit','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('52','删除角色','Admin/group_del','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('53','角色状态','Admin/change_group_status','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('54','管理员列表','Admin/adminlist','48','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('55','新增管理员','Admin/adminadd','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('56','修改管理员','Admin/adminedit','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('57','管理员状态','Admin/change_status','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('58','删除管理员','Admin/admindelete','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('59','个人信息','Index/details','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('60','模型管理','Molds','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('61','模型列表','Molds/index','60','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('62','新增模型','Molds/addMolds','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('63','修改模型','Molds/editMolds','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('64','删除模型','Molds/deleteMolds','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('65','权限管理','Rulers','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('66','权限列表','Rulers/index','65','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('67','新增权限','Rulers/addrulers','65','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('68','修改权限','Rulers/editrulers','65','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('69','删除权限','Rulers/deleterulers','65','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('70','桌面设置','Index/desktop','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('71','新增桌面','Index/desktop_add','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('72','修改桌面','Index/desktop_edit','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('73','删除桌面','Index/desktop_del','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('74','图标库','Index/unicode','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('75','插件管理','Plugins','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('76','插件列表','Plugins/index','75','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('77','模块扩展','Extmolds','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('82','轮播图','Collect','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('83','轮播图','Collect/index','82','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('84','新增轮播图','Collect/addcollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('85','修改轮播图','Collect/editcollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('86','删除轮播图','Collect/deletecollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('87','复制轮播图','Collect/copycollect','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('88','批量删除轮播图','Collect/deleteAll','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('89','轮播图分类','Collect/collectType','82','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('90','新增轮播图分类','Collect/collectTypeAdd','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('91','修改轮播图分类','Collect/collectTypeEdit','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('92','删除轮播图分类','Collect/collectTypeDelete','82','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('93','批量复制','Article/copyAll','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('94','批量修改栏目','Article/changeType','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('95','友情链接','Links/index','189','1','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('96','新增友链','Links/addlinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('97','修改友链','Links/editlinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('98','复制友链','Links/copylinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('99','删除友链','Links/deletelinks','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('100','批量删除友链','Links/deleteAll','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('101','通用模块','Common','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('102','上传文件','Common/uploads','101','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('103','更新cookie','Index/update_session_maxlifetime','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('104','商品管理','Product','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('105','商品列表','Product/productlist','104','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('106','新增商品','Product/addproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('107','修改商品','Product/editproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('108','删除商品','Product/deleteproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('109','复制商品','Product/copyproduct','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('110','批量删除','Product/deleteAll','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('111','批量复制','Product/copyAll','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('112','修改栏目','Product/changeType','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('113','修改排序','Product/editProductOrders','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('114','清理缓存','Index/cleanCache','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('115','登录日志','Sys/loginlog','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('116','图库管理','Sys/pictures','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('117','修改排序','Extmolds/editOrders','77','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('118','会员分组','Member/membergroup','1','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('119','新增分组','Member/groupadd','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('120','修改分组','Member/groupedit','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('121','更改分组状态','Member/change_group_status','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('122','删除分组','Member/group_del','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('123','会员权限','Member/power','1','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('124','添加权限','Member/addrulers','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('125','修改权限','Member/editrulers','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('126','删除权限','Member/deleterulers','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('127','修改分组排序','Member/editOrders','1','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('128','订单管理','Order','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('129','订单列表','Order/index','128','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('130','订单详情','Order/details','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('131','批量删除','Order/deleteAll','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('132','上传支付证书','Sys/uploadcert','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('133','更改状态','Plugins/change_status','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('134','安装卸载','Plugins/action_do','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('223','模板列表','Template/index','222','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('222','模板管理','Template','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('137','删除图库图片','Sys/deletePic','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('138','批量删除图库','Sys/deletePicAll','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('139','安装说明','Plugins/desc','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('140','微信公众号','Wechat','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('141','公众号菜单','Wechat/wxcaidan','140','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('142','公众号素材','Wechat/sucai','140','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('143','模板制作','Index/showlabel','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('144','获取首字母拼音','Classtype/get_pinyin','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('145','批量新增栏目','Classtype/addmany','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('146','自定义配置删除','Sys/custom_del','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('147','TAG列表','Extmolds/index/molds/tags','77','1','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('148','新增TAG','Extmolds/addmolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('149','修改TAG','Extmolds/editmolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('150','复制TAG','Extmolds/copymolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('151','删除TAG','Extmolds/deletemolds/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('152','批量删除TAG','Extmolds/deleteAll/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('153','网站地图','Index/sitemap','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('154','生成静态文件','Index/tohtml','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('155','更新栏目HTML','Index/html_classtype','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('156','更新模块HTML','Index/html_molds','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('157','批量修改推荐属性','Article/changeAttribute','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('158','批量修改推荐属性','Product/changeAttribute','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('159','批量修改友链栏目','Links/changeType','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('160','批量修改TAG栏目','Extmolds/changeType/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('161','批量复制友链','Links/copyAll','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('162','批量复制TAG','Extmolds/copyAll/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('163','批量修改友链排序','Links/editOrders','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('164','批量修改TAG排序','Extmolds/editOrders/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('165','删除订单','Order/deleteorder','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('166','批量删除','Admin/deleteAll','48','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('167','高级设置','Sys/ctype/type/high-level','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('168','邮箱订单','Sys/ctype/type/email-order','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('169','支付配置','Sys/ctype/type/payconfig','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('170','公众号配置','Sys/ctype/type/wechatbind','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('171','批量审核','Article/checkAll','8','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('172','批量审核','Product/checkAll','104','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('173','批量审核','Message/checkAll','21','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('174','批量审核','Comment/checkAll','15','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('175','批量审核友链','Links/checkAll','189','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('176','批量审核TAG','Extmolds/checkAll/molds/tags','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('177','充值列表','Order/czlist','128','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('178','手动充值','Order/chongzhi','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('179','删除记录','Order/delbuylog','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('180','批量删除记录','Order/delAllbuylog','128','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('181','积分配置','Sys/ctype/type/jifenset','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('182','插件更新','Plugins/update','75','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('183','获取栏目模板','Classtype/get_html','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('184','批量修改栏目','Classtype/changeClass','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('185','友链分类','Links/linktype','189','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('186','新增友链分类','Links/linktypeadd','189','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('187','修改友链分类','Links/linktypeedit','189','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('188','删除友链分类','Links/linktypedelete','189','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('189','友情链接','Links','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('190','导航设置','Index/menu','32','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('191','新增导航','Index/addmenu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('192','修改导航','Index/editmenu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('193','删除导航','Index/delmenu','32','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('194','碎片化','Sys/datacache','39','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('195','新增碎片','Sys/addcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('196','修改碎片','Sys/editcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('197','删除碎片','Sys/delcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('198','预览SQL','Sys/viewcache','39','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('199','搜索配置','Sys/ctype/type/searchconfig','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('200','修改字段属性','Fields/editFieldsValue','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('201','推荐属性','Jzattr','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('202','推荐属性','Jzattr/index','201','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('203','新增推荐属性','Jzattr/addAttr','201','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('204','修改推荐属性','Jzattr/editAttr','201','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('205','删除推荐属性','Jzattr/delAttr','201','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('206','修改状态','Jzattr/changeStatus','201','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('207','列表设置','Fields/fieldsList','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('208','获取列表字段','Fields/fieldsList','26','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('209','内链模块','Jzchain','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('210','内链列表','Jzchain/index','209','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('211','新增内链','Jzchain/addchain','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('212','修改内链','Jzchain/editchain','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('213','删除内链','Jzchain/delchain','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('214','批量删除','Jzchain/delAll','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('215','修改状态','Jzchain/changeStatus','209','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('216','回收站','Recycle','0','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('217','回收站','Recycle/index','216','1','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('218','恢复数据','Recycle/restore','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('219','删除数据','Recycle/del','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('220','批量删除','Recycle/delAll','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('221','批量恢复','Recycle/restoreAll','216','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('224','安装卸载','Template/actionDo','222','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('225','安装说明','Template/desc','222','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('226','模板更新','Template/update','222','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('227','用户评价列表','Extmolds/index/molds/pingjia','77','1','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('228','新增用户评价','Extmolds/addmolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('229','修改用户评价','Extmolds/editmolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('230','复制用户评价','Extmolds/copymolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('231','删除用户评价','Extmolds/deletemolds/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('232','批量删除用户评价','Extmolds/deleteAll/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('233','批量修改用户评价栏目','Extmolds/changeType/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('234','批量复制用户评价','Extmolds/copyAll/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('235','批量修改用户评价列表','Extmolds/editOrders/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('236','批量审核用户评价','Extmolds/checkAll/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('237','重构字段','Molds/restrucFields','60','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('238','基本配置','Sys/ctype/type/base','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('239','批量修改评价推荐属性','Extmolds/changeAttribute/molds/pingjia','77','0','0'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('240','配置栏目','Sys/systype','39',1,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('241','设置配置状态','Sys/systypestatus','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('242','修改配置分组','Sys/editctype','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('243','新增配置分组','Sys/addctype','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('244','全局配置','Sys/ctype','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('245','修改配置字段','Sys/setfield','39',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('246','绑定模块数据获取','Fields/getSelect','26',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('247','编辑器上传','Uploads','0',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('248','上传功能','Uploads/index','247',0,'1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('249','获取子栏目','Classtype/getchildren','41','0','1'); INSERT INTO `jz_ruler` (`id`,`name`,`fc`,`pid`,`isdesktop`,`sys`) VALUES ('250','获取联动数据','Fields/getliandong','26','0','1'); -- ---------------------------- -- Records of jz_shouchang -- ---------------------------- INSERT INTO `jz_shouchang` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('5','6','10','1','1642947563'); INSERT INTO `jz_shouchang` (`id`,`tid`,`aid`,`userid`,`addtime`) VALUES ('4','7','7','1','1642946850'); -- ---------------------------- -- Records of jz_sysconfig -- ---------------------------- INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('1','web_version','系统版号','版本号是系统自带,请勿改动','0','2.5.6','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('2','web_name','网站SEO名称','控制在25个字、50个字节以内','2','极致CMS建站系统','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('3','web_keyword','网站SEO关键词','5个左右,8汉字以内,用英文逗号隔开','2','极致建站,cms,开源cms,免费cms,cms系统,phpcms,免费企业建站,建站系统,企业cms,jizhicms,极致cms,建站cms,建站系统,极致博客,极致blog,内容管理系统','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('4','web_desc','网站SEO描述','控制在80个汉字,160个字符以内','3','极致CMS是开源免费的PHPCMS网站内容管理系统,无商业授权,简单易用,提供丰富的插件,帮您实现零基础搭建不同类型网站(企业站,门户站,个人博客站等),是您建站的好帮手。极速建站,就选极致CMS。','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('5','web_js','统计代码','将百度统计、cnzz等平台的流量统计JS代码放到这里','8', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('6','web_copyright','底部版权','如:© 2016 xxx版权','2','@2020-2099','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('7','web_beian','备案号','如:京ICP备00000000号','2','冀ICP备88888号','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('8','web_tel','网站电话','网站联系电话','2','0666-8888888','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('9','web_tel_400','400电话','400电话','2','400-0000-000','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('10','web_qq','网站QQ','网站QQ','2','12345678','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('11','web_email','网站邮箱','网站邮箱','2','123456@qq.com','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('12','web_address','公司地址','公司地址','2','河北省廊坊市广阳区xxx大厦xx楼001号','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('13','pc_template','PC网站模板','将模板名称填写到此处','2','cms','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('14','wap_template','WAP网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板','2','1','2',NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('15','weixin_template','微信网站模板','开启了手机端,这个设置才会生效,否则调用电脑端模板。由于微信内有一些特殊的js,所以可以在这里单独设置微信模板','2','cms','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('16','iswap','是否开启手机端','如果不开启手机端,则默认调用电脑端模板','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('17','isopenhomeupload','是否开启前台上传','关闭后,前台无法上传文件。如果网站没有使用会员,建议关闭前台上传。','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('18','isopenhomepower','是否开启前台权限','开启后前台用户权限可以在后台控制','6','0','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('19','cache_time','缓存时间','单位:分钟,留空或0则不设置缓存。如果生成静态文件,静态文件清空后才生效。','2','0','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('20','fileSize','限制上传文件大小','0代表不限,单位kb','2','0','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('21','fileType','允许上传文件类型','请用|分割,如:pdf|jpg|png','2','pdf|jpg|jpeg|png|zip|rar|gzip|doc|docx|xlsx','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('22','ueditor_config','后台编辑器导航条配置', "后台UEditor编辑器导航条配置",'3','"fullscreen", "source","undo", "redo","bold", "italic", "underline", "fontborder", "strikethrough", "super", "removeformat", "formatmatch", "autotypeset", "blockquote", "pasteplain","forecolor", "backcolor", "insertorderedlist", "insertunorderedlist", "selectall", "cleardoc","rowspacingtop", "rowspacingbottom", "lineheight","customstyle", "paragraph", "fontfamily", "fontsize","directionalityltr", "directionalityrtl", "indent","justifyleft", "justifycenter", "justifyright", "justifyjustify","touppercase", "tolowercase","link", "unlink", "anchor", "imagenone", "imageleft", "imageright", "imagecenter","simpleupload", "insertimage", "emotion", "scrawl", "insertvideo", "music", "attachment", "map", "gmap", "insertframe", "insertcode", "webapp", "pagebreak","template", "background","horizontal", "date", "time", "spechars", "snapscreen", "wordimage","inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol", "mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "charts","print", "preview", "searchreplace", "help", "drafts"','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('23','search_table','允许前台搜索的表','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('24','imagequlity','上传图片压缩比例','100%则不压缩,如果PNG是透明图,压缩后背景变黑色。格式如:80','6','75','2','不压缩使用原图=100,95%=95,90%=90,85%=85,80%=80,75%=75,70%=70,65%=65,60%=60,55%=55,50%=50','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('25','ispngcompress','PNG是否压缩','PNG压缩后容易变成背景黑色,关闭后,不会压缩。','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('26','email_server','邮件服务器','smtp.163.com,smtp.qq.com','2','smtp.163.com','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('27','email_port','邮件收发端口','163、126邮件端口(465),QQ邮件端口(587)','2','465','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('28','shou_email','收件人Email地址', NULL,'2', NULL,'4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('29','send_email','发件人Email地址','指邮件服务器发件邮箱','2', NULL,'4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('30','send_pass','发件人Email秘钥','这个秘钥不是登录密码','2', NULL,'4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('31','send_name','发件人昵称','发件邮箱会带一个昵称','2','极致建站系统','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('32','tj_msg','客户订单通知','购买商品的时候会发送的一条邮件信息','3','尊敬的{xxx},我们已经收到您的订单!请留意您的电子邮件以获得最新消息,谢谢您!','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('33','send_msg','订单出货通知','发货的时候发送给客户的通知','3','尊敬的{xxx},我们已确认了您的订单,请于3日内汇款,逾期恕不保留,不便请见谅。汇款完成后,烦请告知客服人员您的交易账号后五位,即完成下单手续,谢谢您。','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('34','yunfei','订单运费','购物下单时会加上这个运费','2','0.00','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('35','paytype','在线支付','0关闭支付,1自主平台支付','6','0','5','关闭=0,开启=1','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('40','alipay_partner','支付宝APPID','账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('41','alipay_key','支付宝key','MD5密钥,安全检验码,由数字和字母组成的32位字符串','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('42','alipay_private_key','支付宝私钥', NULL,'3', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('43','alipay_public_key','支付宝公钥', NULL,'3', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('44','wx_mchid','微信商户mchid','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('45','wx_key','微信商户key','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('46','wx_appid','微信公众号appid','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('47','wx_appsecret','微信公众号appsecret','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('48','wx_client_cert','微信apiclient_cert','支付相关','5', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('49','wx_client_key','微信apiclient_key','支付相关','5', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('50','wx_login_appid','公众号appid','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('51','wx_login_appsecret','公众号appsecret','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('52','wx_login_token','公众号token','用户登录相关,如果跟支付的一样,那就再填写一遍','2', NULL,'6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('53','huanying','公众号关注欢迎语','公众号关注时发送的第一句推送','3','欢迎关注公众号~','6', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('54','wx_token','公众号token','支付相关','2', NULL,'5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('55','web_logo','网站LOGO', NULL,'1','/static/cms/static/images/logo.png','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('56','admintpl','后台模板风格','内页弹窗:点击新增/修改等操作,页面是一个弹出层,更美观。内嵌页面:点击新增/修改等操作,页面直接进入新页面,不会弹出层。','6','default','2','内页弹窗=default,内嵌页面=tpl','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('59','domain','网站SEO网址','一般不填,全局网址,最后不带/,如:http://www.xxx.com','2', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('61','overtime','订单超时','按小时计算,超过该小时订单过期,仅限于开启支付后,0代表不限制','2','4','4', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('62','islevelurl','开启层级URL','默认关闭层级URL,开启后URL会按照父类层级展现','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('63','iscachepage','缓存完整页面','前台完整页面缓存,结合缓存时间,可以提高访问速度','6','1','0','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('64','isautohtml','自动生成静态','前台访问网站页面,将自动生成静态HTML,下次访问直接进入静态HTML页面','0','0','0','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('65','pc_html','PC静态文件目录','电脑端静态HTML存放目录,默认根目录[ / ]','2','/','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('66','mobile_html','WAP静态文件目录','手机端静态HTML存放目录,默认[ m ],PC和WAP静态目录不能相同,否则文件会混乱','2','m','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('67','autocheckmessage','是否留言自动审核','开启后,留言自动审核(显示)','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('68','autocheckcomment','是否评论自动审核','开启后评论自动审核(显示)','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('69','mingan','网站敏感词过滤','将敏感词放到里面,用“,”分隔,用{xxx}代替通配内容','3', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('70','iswatermark','是否开启水印','开启水印后水印图片优先,如果没有图片则使用水印文字','6','0','8','开启=1,关闭=0','100','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('71','watermark_file','水印图片','水印图片在250px以内','1', NULL,'8', NULL,'99','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('72','watermark_t','水印位置','参考键盘九宫格1-9','2','9','8', NULL,'98','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('73','watermark_tm','水印透明度','透明度越大,越难看清楚水印','6','0','8','不显示=0,10%=10,20%=20,30%=30,40%=40,50%=50,60%=60,70%=70,80%=80,90%=90','97','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('74','money_exchange','钱包兑换率','站内钱包与RMB的兑换率,即1元=多少金币','2','1','5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('75','jifen_exchange','积分兑换率','站内积分与RMB的兑换率,即1元=多少积分','2','100','5', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('76','isopenjifen','积分支付','开启积分支付后,商品可以用积分支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('77','isopenqianbao','钱包支付','开启钱包支付后,商品可以用钱包支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('78','isopenweixin','微信支付','开启微信支付后,商品可以用微信支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('79','isopenzfb','支付宝支付','开启支付宝支付后,商品可以用支付宝支付','6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('80','login_award','每次登录奖励','每天登录奖励积分数,最小为0,每天登录只奖励一次','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('81','login_award_open','登录奖励','开启登录奖励后,登录后就会获得积分奖励','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('82','release_award_open','发布奖励','开启后,发布内容会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('83','release_award','每次发布奖励','每次发布内容奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('84','release_max_award','每天发布最高奖励','每天奖励不超过积分上限,设置0则无上限','2','0','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('85','collect_award_open','收藏奖励','开启后,发布内容被收藏会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('86','collect_award','每次收藏奖励','每次发布内容被收藏奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('87','collect_max_award','每天收藏最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('88','likes_award_open','点赞奖励','开启后,发布内容被点赞会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('89','likes_award','每次点赞奖励','每次发布内容被点赞奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('90','likes_max_award','每天点赞最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('91','comment_award_open','评论奖励','开启后,发布内容被评论会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('92','comment_award','每次评论奖励','每次发布内容被评论奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('93','comment_max_award','每天评论最高奖励','每天奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('94','follow_award_open','关注奖励','开启后,用户被粉丝关注会奖励积分','6','1','7','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('95','follow_award','每次关注奖励','每次被关注奖励积分数','2','1','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('96','follow_max_award','每天关注最高奖励','每天关注奖励不超过积分上限,设置0则无上限','2','1000','7', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('97','isopenemail','发送邮件','是否开启邮件发送','6','1','4','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('98','closeweb','关闭网站','关闭网站后,前台无法访问,后台可以进入','6','0','1','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('99','closetip','关站提示', NULL,'3','抱歉!该站点已经被管理员停止运行,请联系管理员了解详情!','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('100','admin_save_path','后台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('101','home_save_path','前台文件存储路径','默认static/upload/{yyyy}/{mm}/{dd},存储路径相对于根目录,最后不能带斜杠[ / ]','2','static/upload/{yyyy}/{mm}/{dd}','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('102','isajax','是否开启前台AJAX','开启后AJAX,前台可以通过栏目链接+ajax=1获取JSON数据','6','0','2', '开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('104','invite_award_open','是否开启邀请奖励','开启邀请后则会奖励','6','0','7', '开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('105','invite_type','邀请奖励类型', NULL,'6','jifen','7', '积分=jifen,金币=money','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('106','invite_award','邀请奖励数量', NULL,'0','0','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('107','web_phone','网站手机', NULL,'2','0','1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('108','web_weixin','站长微信', NULL,'1', NULL,'1', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('110','isregister','前台用户注册','关闭前台注册后,前台无法进入注册页面','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('111','onlyinvite','仅邀请码注册','开启后,必须通过邀请链接才能注册!','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('112','release_table','允许前台发布模块','防止数据泄露,填写允许发布模块标识,留空表示不允许发布,多个表可用|分割','2','article|product','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('113','search_words','前台搜索的字段','可以设置搜索表中的相关字段进行模糊查询,多个字段可用|分割','2','title','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('114','closehomevercode','前台验证码','关闭后,登录注册不需要验证码','6','0','2','关闭=1,开启=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('115','closeadminvercode','后台验证码','关闭后,后台管理员登录不需要验证码','6','0','2','关闭=1,开启=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('116','tag_table','TAG包含模型','在tag列表上查询的相关模型,多个模型标识可用|分割,如:article|product','2','article|product','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('118','isopendmf','支付宝当面付', NULL,'6','1','5','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('119','search_words_muti','前台多模块搜索的字段','多个模块直接必须都有相同的字段,否则会报错','3','title','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('120','search_table_muti','多模块允许搜索的表','防止数据泄露,填写允许搜索的表名,留空表示不允许搜索,多个表可用|分割,如:article|product','2','article|product','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('121','search_fields_muti','允许查询显示的字段','多模块搜索允许查询显示的字段','3','id,tid,litpic,title,tags,keywords,molds,htmlurl,description,addtime,userid,member_id,hits,ownurl,target','3', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('122','ueditor_user_config','前台编辑器设置','前台的编辑器功能菜单设置','3','"undo", "redo", "|","paragraph","bold","forecolor","fontfamily","fontsize", "italic", "blockquote", "insertparagraph", "justifyleft", "justifycenter", "justifyright","justifyjustify","|","indent", "insertorderedlist", "insertunorderedlist","|", "insertimage", "inserttable", "deletetable", "insertparagraphbeforetable", "insertrow", "deleterow", "insertcol", "deletecol","mergecells", "mergeright", "mergedown", "splittocells", "splittorows", "splittocols", "|","drafts", "|","fullscreen"','2', NULL,'1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('123','article_config','内容配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('124','product_config','商品配置', NULL,'3','{"seotitle":1,"litpic":1,"description":1,"tags":1,"filter":"title,keywords,body"}','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('125','isdebug','PHP调试','测试环境,开启调试,提示错误,实时更新模板。正式上线,请关闭调试,打开页面更快。','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('126','plugins_config','插件配置', NULL,'2','http://api.jizhicms.cn/plugins.php','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('127','template_config','插件配置', NULL,'2','http://api.jizhicms.cn/template.php','0', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('128','closesession','前台SESSION','关闭前台SESSION后,前台会员模块无法使用,但是可以减少session缓存文件。纯内容网站可以关闭,使用会员支付等必须开启','6','0','2','关闭=1,开启=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('129','messageyzm','留言验证码','开启后,前台留言需要填写验证码','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('130','homerelease','前台发布审核','开启后需要后台审核,关闭则不需要','6','1','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('131','hideclasspath','栏目隐藏.html','开启后栏目链接将没有.html后缀','6','0','2','开启=1,关闭=0','0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('132','classtypemaxlevel','栏目全局递归','默认开启,栏目超过20个,请关闭此选项,有一定程度提升访问速度!','6','0','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('133','hidetitleonliy','字段重复检测', '将【模块标识-检测字段】填写进去,用|进行分割,将会进行标题重复检测。如:article-title|product-title','2','article-title|product-title','2', NULL,'0','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('134','onlyuserupload','会员上传限制','开启后,仅会员才可以上传!受会员上传大小限制!','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('135','cachefilenum','缓存文件数','0表示不限制,最大不超过500','2','100','0',null,0,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('136','watermark_word','水印文字','只有没有水印图片的时候才生效','2','这个是水印文字','8',null,96,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('137','watermark_font','水印字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,95,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('138','watermark_size','水印大小','默认24','2','24','8',null,94,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('139','watermark_h','水印行高','默认34','2','34','8',null,93,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('140','watermark_rgb','水印颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,92,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('141','watermark_x','水印微调X','相对水印位置再进行X轴微调,默认0','2','0','8',null,91,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('142','watermark_y','水印微调Y','相对水印位置再进行Y轴微调,默认0','2','10','8',null,90,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('143','text_waterlitpic','缩略图标题水印','文章缩略图进行水印文章标题,开启后生效','6','0','8','开启=1,关闭=0',89,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('144','text_litpic','默认缩略图','当文章没有缩略图的时候生效','1',null,'8',null,88,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('145','text_molds','支持模型','填写模型标识,如:article,product','2','article,product','8',null,87,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('146','text_num','每行文字数','默认10个字','2','10','8',null,86,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('147','text_size','文字大小','默认24','2','24','8',null,85,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('148','text_h','文字行高','默认34','2','34','8',null,84,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('149','text_rgb','文字颜色','默认白色:#FFFFFF','2','#FFFFFF','8',null,83,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('150','text_font','文字字体','默认Alibaba-PuHuiTi-Bold.ttf,存放在static/common','2','Alibaba-PuHuiTi-Bold.ttf','8',null,82,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('151','text_wz','水印位置','九宫格1-9,默认5中间','2','5','8',null,81,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('152','text_x','微调X','相对于水印位置再进行X轴微调,默认0','2','0','8',null,80,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('153','text_y','微调Y','相对于水印位置再进行Y轴微调,默认0','2','0','8',null,79,'1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('154','islocal','是否开启图片本地化','图片本地化可以将内容的外网图片保存到服务器','6','1','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('155','openredis','是否开启Redis','开启Redis后可以使用token登录前台账户,但必须服务器安装了Redis,在config里面需要配置redis信息','6','0','2','开启=1,关闭=0','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('156','sitemap_config','sitemap配置','用于sitemap生成','3','a:3:{s:9:"page_size";i:10000;s:7:"tagsurl";s:19:"/tags/index?id={id}";s:8:"filetype";s:3:"xml";}','0','','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('157','schedule_table','定时发布表','带有addtime发布时间字段的表才可以使用定时发布功能,用|分隔','3','article|product','2','','1','1'); INSERT INTO `jz_sysconfig` (`id`,`field`,`title`,`tip`,`type`,`data`,`typeid`,`config`,`orders`,`sys`) VALUES ('158','upload_file_name','上传文件重命名','上传文件后是否重命名,默认开启重命名,关闭后上传文件名不会变','6','1','2','开启=1,关闭=0','1','1'); -- ---------------------------- -- Records of jz_tags -- ---------------------------- INSERT INTO `jz_tags` (`id`,`tid`,`orders`,`comment_num`,`molds`,`htmlurl`,`keywords`,`newname`,`num`,`isshow`,`target`,`number`,`member_id`,`ownurl`,`tags`,`addtime`) VALUES ('1','0','0','0','tags', NULL,'SEO', NULL,'-1','1','_blank','4','0', NULL, NULL,'0'); -- ---------------------------- -- Records of jz_task -- ---------------------------- INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('1','8','2','1','1','article','reply',' @iPHfa6 干得漂亮!','http://www.19x.mm/znxw.html','1','1','0','1642932172'); INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('5','6','9','0','1','product','likes','PC+手机绿色医疗生物化工网站模板','http://www.19x.mm/free/9.html','0','1','0','1642946653'); INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('6','7','8','0','1','product','likes','手机端黄色五金机电网站模板','http://www.19x.mm/business/8.html','0','1','0','1642946655'); INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('11','6','10','0','1','product','collect','蓝色小程序鲜花礼物广告设计网站模板','http://www.19x.mm/free/10.html','0','1','0','1642947563'); INSERT INTO `jz_task` (`id`,`tid`,`aid`,`userid`,`puserid`,`molds`,`type`,`body`,`url`,`isread`,`isshow`,`readtime`,`addtime`) VALUES ('10','7','7','0','1','product','collect','响应式红色软件公司网站模板','http://www.19x.mm/business/7.html','0','1','0','1642946850'); ================================================ FILE: install/tpl/css/ui.progress-bar.css ================================================ @-webkit-keyframes animate-stripes { from { background-position:0 0 } to { background-position: 44px 0 } } .ui-progress-bar { position: relative; height: 35px; padding-right: 2px; background-color: #abb2bc; border-radius: 35px; -moz-border-radius: 35px; -webkit-border-radius: 35px; background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #b6bcc6), color-stop(1, #9da5b0)); background: -moz-linear-gradient(#9da5b0 0, #b6bcc6 100%); -webkit-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF; -moz-box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF; box-shadow: inset 0 1px 2px 0 rgba(0,0,0,0.5), 0px 1px 0 0 #FFF } .ui-progress { position: relative; display: block; overflow: hidden; height: 33px; -moz-border-radius: 35px; -webkit-border-radius: 35px; border-radius: 35px; background-color: #74d04c; -webkit-box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a; -moz-box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a; box-shadow: inset 0 1px 0 0 #dbf383, inset 0 -1px 1px #58c43a; border: 1px solid #4c8932; -webkit-background-size: 30px 30px; -moz-background-size: 30px 30px; background-size: 30px 30px; background-image: -webkit-gradient(linear, left top, right bottom, color-stop(.25, rgba(255, 255, 255, .15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .15)), color-stop(.75, rgba(255, 255, 255, .15)), color-stop(.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -ms-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); background-image: linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -webkit-animation: animate-stripes 1s linear infinite; -moz-animation: animate-stripes 1s linear infinite; } .ui-progress span.ui-label { font-size: 1.2em; position: absolute; right: 0; line-height: 33px; padding-right: 12px; color: rgba(0,0,0,0.6); text-shadow: rgba(255,255,255,0.45) 0 1px 0; white-space: nowrap } ================================================ FILE: install/tpl/footer.tpl ================================================ ================================================ FILE: install/tpl/header.tpl ================================================ 极致建站系统安装向导 ================================================ FILE: install/tpl/index.jizhi ================================================

    极致CMS商业版系统安装向导

    前面的话

    欢迎您使用极致CMS商业版, 希望我们的建站系统能够让您在使用的时候感到快乐~

    郑重承诺极致CMS商业版程序无后门,无限制,全开源,不收授权费,长期运营至死方休。

    原极致CMS与现在的商业版源码结构不同,但功能相同,商业版出售的是商业服务,并不是源码授权。

    安装须知

    极致CMS商业版受到法律和国际公约保护。使用者:无论个人或组织、盈利与否、用途如何(包括以学习和研究为目的),均需仔细阅读本协议,在理解、同意、并遵守本协议的全部条款后,方可开始使用 极致CMS商业版 软件。

    I. 权利

    1. 您可以在完全遵守本最终用户授权协议的基础上使用本软件。
    2. 您可以在协议规定的约束和限制范围内修改 极致CMS商业版 源代码或界面风格以适应您的网站要求。
    3. 您拥有使用本软件构建的网站中全部会员资料、文章、商品及相关信息的所有权,并独立承担与之相关的法律义务。
    4. 您可以修改删除网页显示的版权信息,但不允许修改删除PHP源码中的版权信息。

    II. 义务

    1. 本软件为开源软件,您可以在遵循本授权协议的基础上使用此版本软件。
    2. 不得对本软件或与之关联的商业授权进行出租、出售、抵押。
    3. 不得利用本软件参与重大国际、国家等重点项目,发生一切安全、产权、事故等纠纷均由使用者承担。
    4. 禁止在 极致CMS商业版 的整体或任何部分基础上以发展任何衍生版本、修改版本或第三方版本用于重新分发。
    5. 禁止使用者在未经官方允许的情况下发布 极致CMS商业版 相关安全漏洞信息,取得官方授权并在官方修复漏洞后,可发布相关漏洞信息。

    III. 有限担保和免责声明

    1. 本软件及所附带的文件是不提供任何明确的或隐含的赔偿或担保的形式提供的。
    2. 用户出于自愿而使用本软件,您必须了解使用本软件的风险,在尚未购买产品技术服务之前,我们不承诺提供任何形式的技术支持、使用担保,也不承担任何因使用本软件而产生问题的相关责任。
    3. 极致CMS商业版官方不对使用本软件构建的网站中的文章、商品和其他信息承担责任。

    有关 极致CMS商业版 最终用户授权协议、商业授权与技术服务的详细内容,均由 极致CMS商业版 官方网站独家提供。

    电子文本形式的授权协议如同双方书面签署的协议一样,具有完全的和等同的法律效力。您一旦开始安装 极致CMS商业版,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的权力的同时,受到相关的约束和限制。协议许可范围以外的行为,将直接违反本授权协议并构成侵权,我们有权随时终止授权,责令停止损害,并保留追究相关责任的权力。

    作者:涂福
    时间:2021-01-26
    版权所有 (c) 2021-2099。

    ================================================ FILE: install/tpl/js/common.js ================================================ function TrBgChange(AreaId,OddClass,EvenClass){ var trs=document.getElementById(AreaId).getElementsByTagName("tr"); for(var i=1;i'+(e?n.title[0]:n.title)+"":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e=''+n.btn[0]+"",2===t&&(e=''+n.btn[1]+""+e),'
    '+e+"
    "):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='

    '+(n.content||"")+"

    "),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"
    ':"")+'
    "+l+'
    '+n.content+"
    "+c+"
    ",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;odiv{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} ================================================ FILE: install/tpl/layer/theme/default/layer.css ================================================ .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} ================================================ FILE: install/tpl/step1.jizhi ================================================

    极致建站系统安装向导

    20%

    运行环境需求

    1.要求PHP5.6以上,建议使用7.0以上版本,本系统已支持PHP7.2,支持Windows和Linux主机

    2.安装环境建议Linux服务器,当然Windows也是可以安装的,云服务器建议安装宝塔面板【查看

    3.无论是Windows还是Linux建议安装Apache、mysql、phpMyAdmin配件

    4.本系统目前仅支持mysql数据库,且数据库字符集必须是UTF-8或utf8_general_ci

    安装环境

    环境 当前 要求
    PHP 5.6 ~ 7.4
    路径 无中文字符
    权限 opendir

    目录权限

    目录 当前 所需
    安装目录/install/ 可写
    配置文件/conf/config.php 可写
    缓存文件/cache/ 可写
    资源文件夹/static/ 可写
    备份文件夹/backup/ 可写
    不符合要求,不能安装!'; }else{ echo ''; } ?>
    ================================================ FILE: install/tpl/step2.jizhi ================================================

    极致建站系统安装向导

    50%
    填写网站基本信息(默认系统会自动获取不用修改,如有错请修改.)
    网站网址:
    选择数据库类型:
    填写数据库信息
    数据库服务器:
    数据库端口号:
    数据库名称:
    数据库表前缀:
    数据库帐号:
    数据库密码:
    填写创始人信息
    管理员:
    密码:
    确认密码:
    0){?>
    检测到您存在备份数据库 如果是下载的网站源码,建议安装备份数据库,否则网站会报错!
    备份数据库列表:
    ================================================ FILE: install/tpl/step3.jizhi ================================================

    极致建站系统安装向导

    100%

    安装进度安装过程中请不要做其他操作,安装时间大约需要1分钟。

    正在载入...
    ================================================ FILE: install/tpl/step4.jizhi ================================================

    极致建站系统安装向导

    安装进度安装过程中请不要做其他操作,安装时间大约需要1分钟。

    正在载入...
    ================================================ FILE: install/tpl/step5.jizhi ================================================

    极致建站系统安装向导

    恭喜您,极致CMS的安装已经完成,网站上线要删除install文件夹

    ================================================ FILE: readme.txt ================================================ 极致CMS 2.5.4 release 更新时间:2024-12-16 更新内容如下: 1. 修复添加购物车错误问题 2. 优化后台字段添加列表 3. 优化上传文件重命名问题,支持开启关闭重命名 4. 优化redis配置错误导致打不开问题 5. 留言支持cookie存储,前台关闭session也可以提交表单 6. 新增模板标签支持非系统表数据输出(筛选标签不支持) 7. 新增定时发布功能,需要系统配置填写允许开启的模型表 8. 开放CommonController控制器,让系统更加自由 9. 安全加固加密前后台登录 极致CMS 2.5.3 release 更新时间:2024-09-17 更新内容如下: 1. 增加更新字段updatetime 2. 增加检查点赞和收藏的功能 3. 优化生成sitemap 4. 增加英文语言包 极致CMS 2.5.2 release 更新时间:2024-08-25 更新内容如下: 1. 优化字段绑定和图库列表 2. 图片本地可以配置里面控制 3. 增加APP和Vue项目支持 4. 修复https导致无法生成静态页面的问题 5. 更换编辑器 极致CMS 2.5.1 release 更新时间:2024-02-26 更新内容如下: 1. 优化字段排序问题 2. 优化栏目缓存 3. 优化数据库备份 4. 优化自定义字段 5. 更换编辑器 6. 修复水印功能 7. 增加图片本地化处理 极致CMS 2.5.0 release 更新时间:2023-10-03 更新内容如下: 1. 解决并发问题 2. 优化系统配置排序 3. 区分前后台上传功能 极致CMS 2.4.9 release 更新时间:2023-08-25 更新内容如下: 1. 优化上传文件安全 2. 优化图片水印文字水印 3. 增加缩略图标题水印 极致CMS 2.4.8 release 更新时间:2023-03-20 更新内容如下: 1. 优化系统配置 2. 优化批量生成栏目 3. 修复sitemap格式 极致CMS 2.4.7 release 更新时间:2023-02-25 更新内容如下: 1. 优化上传文件后缀 2. 修复字段类型问题 3. 可完全自定义系统函数[conf/Functions.php],写到 FunctionsExt.php 里面即可 极致CMS 2.4.6 release 更新时间:2023-02-23 更新内容如下: 1. 优化系统安全 2. 字段增加绑定栏目类型 极致CMS 2.4.5 release 更新时间:2023-02-18 更新内容如下: 1. 百度编辑器安全问题 2. 优化系统缓存 极致CMS 2.4.4 release 更新时间:2023-01-04 更新内容如下: 1. 优化生成xml网站地图功能 2. 升级文件上传功能 3. 优化备份数据库 极致CMS 2.4.3 release 更新时间:2022-11-19 更新内容如下: 1. 优化生成xml网站地图功能 2. 修复友情链接查询报错 3. 优化用户体验 极致CMS 2.4.2 release 更新时间:2022-11-13 更新内容如下: 1. 修复前台会员多图出错问题 2. 修复新增字段报错 3. 修复layui图片不能选择icon、webp的bug 4. 加强数据安全措施 极致CMS 2.4.1 release 更新时间:2022-10-23 更新内容如下: 1. 优化自定义字段功能 2. 优化标题重复检测功能 3. 修复碎片化时间过期不失效问题 4. 修复评论中加评论不显示问题 极致CMS 2.4.0 release 更新时间:2022-09-29 更新内容如下: 1. 优化部分系统配置 2. 优化代码结构,去除无用配置 极致CMS 2.3.9 release 更新时间:2022-09-25 更新内容如下: 1. 优化后台留言详情模板 2. 优化前台ajax显示字段 3. 修复后台留言回复字段不显示问题 4. 优化新增栏目时的字段绑定 5. 优化前台表单字段显示 极致CMS 2.3.8 release 更新时间:2022-08-30 更新内容如下: 1. 取消自定义模块标题重复检测 2. 优化后台模板列表样式 3. 修复前台用户头像上传问题 4. 优化前台会员注册 极致CMS 2.3.7 release 更新时间:2022-08-24 更新内容如下: 1. 修复公共页数据问题 2. 增加列表推荐属性筛选功能 极致CMS 2.3.6 release 更新时间:2022-08-18 更新内容如下: 1. 修复公共主页数据错误 2. 修复后台获取内容第一张图片失效问题 3. 优化模板列表 极致CMS 2.3.5 release 更新时间:2022-08-10 更新内容如下: 1. 加固数据安全 2. 修复公共主页数据错误 极致CMS 2.3.4 release 更新时间:2022-08-04 更新内容如下: 1. 删除多余代码 2. 优化微信扫码登录 3. 优化模型发布时间 4. 安全加固 极致CMS 2.3.3 release 更新时间:2022-07-28 更新内容如下: 1. 优化前台会员收藏和点赞删除的内容 2. 优化支付宝H5支付 3. 优化自定义字段创建默认小写字母 4. 优化后台列表按钮用户体验 极致CMS 2.3.2 release 更新时间:2022-07-20 更新内容如下: 1. 修复商品取消属性不成功的问题 2. 优化配置项 3. 优化数据库备份类 4. 修复后台评论安全问题 5. 修复模板嵌套不解析问题 极致CMS 2.3.1 release 更新时间:2022-07-13 更新内容如下: 1. 修复系统配置自定义编辑器出错 2. 修改回收站存储格式为序列化存储 3. 优化手机号正则验证 4. 检查标题重复 极致CMS 2.3.0 release 更新时间:2022-07-05 更新内容如下: 1. 修复会员中心会员信息字段重复问题 2. 优化系统配置功能,允许配置到菜单 3. 新增配置栏目功能 4. 去除关于javascript的过滤 极致CMS 2.2.9 release 更新时间:2022-06-30 更新内容如下: 1. 修复内容模型切换栏目无法更新字段的问题 2. 优化会员模块和留言模块 3. tags前台增加hits字段 4. 会员中心更换jquery版本 5. 优化模型创建时间字段 6. 去掉前台PHP版本标识 7. 前台禁止操作管理员相关表 极致CMS 2.2.8 release 更新时间:2022-06-16 更新内容如下: 1. 优化代码,去除多余代码 2. 修复安装时后台地址错误问题 3. 导航模块增加图片 4. 优化后台管理员角色权限 极致CMS 2.2.7 release 更新时间:2022-06-02 更新内容如下: 1. 优化网站地图生成页面 2. 增加评论安全 极致CMS 2.2.6 release 更新时间:2022-05-27 更新内容如下: 1. 优化自定义URL 2. 解决筛选异常报错 极致CMS 2.2.5 release 更新时间:2022-05-19 更新内容如下: 1. 修复百度编辑器无法保存微信图片问题 2. 修复个别字段类型修改错误问题 3. 优化后台入口地址报错问题 极致CMS 2.2.4 release 更新时间:2022-05-12 更新内容如下: 1. 后台留言权限修复 2. tags代码优化 3. 搜索模板优化 4. 修复二级评论时间问题 5. 优化分页 极致CMS 2.2.3 release 更新时间:2022-05-04 更新内容如下: 1. 增加自定义模块批量修改推荐属性 2. 增加删除评论时减少评论统计数 3. 发布一个免费小程序 极致CMS 2.2.2 release 更新时间:2022-04-28 更新内容如下: 1. 修复收藏点赞功能问题 2. 修复个人中心收藏点赞计算错误问题 3. 优化layui表格修改时HTML转译的问题 极致CMS 2.2.1 release 更新时间:2022-04-21 更新内容如下: 1. 修复前台购买记录分页错误 2. 修复后台回收站列表无法设置每页条数 3. 新增tags能够记录相关栏目,可以根据栏目输出tags 4. 新增回收站删除标记 极致CMS 2.2.0 release 更新时间:2022-04-14 更新内容如下: 1. 修复模板评论上一页下一页无法翻页问题 2. 修复收藏删除功能 3. 优化自定义字段样式 4. 新增单入口功能,同时兼容多入口 5. 做单入口功能兼容 > 单入口:进入前后台都通过`index.php`,也可以通过自定义入口文件进行指定,默认后台地址:`/index.php/admins` 在 `index.php` 里面可以修改 `admins` 后台模块标识 极致CMS 2.1.4 release 更新时间:2022-04-08 更新内容如下: 1. 修复后台会员列表时间查询没有效果 2. 修复前台收藏列表的删除链接错误 3. 优化后台模型新增修改预览效果显示问题 4. 增加栏目全局递归的控制,优化加载速度 极致CMS 2.1.3 release 更新时间:2022-03-31 更新内容如下: 1. 前台发布模型限制 2. 修复后台测试扩展类 3. 美化支付页面 4. 修复首页loop分页第一页链接错误问题 5. 优化多选绑定 6. loop增加notlike查询 7. 优化后台模板列表 8. 优化会员分组模板及扩展字段显示 9. 优化后台插件列表操作提示 极致CMS 2.1.2 release 更新时间:2022-03-24 更新内容如下: 1. 优化点赞功能 2. 优化后台模板缓存数据 3. 修复前台多选绑定不显示 4. 修改扩展模型字段列表排序 5. 修复后台商品列表审批错乱 极致CMS 2.1.1 release 更新时间:2022-03-17 更新内容如下: 1. 优化分页功能 2. 优化网站地图 3. 优化错误提示 4. 优化关联字段显示 5. 修复后台模型是否显示预览功能 极致CMS 2.1.0 release 更新时间:2022-03-10 更新内容如下: 1. 修复自定义模型自定义模板无法找到的问题 2. 修复系统配置web_js无法显示问题 3. 优化安装细节 4. 修复单页模型自定义模板无法找到问题 5. 优化搜索模板兼容问题 6. 优化后台管理员模板 7. 修复自定义字段小数创建不了问题 8. 修复后台友情链接模板 极致CMS 2.0.9 release 更新时间:2022-03-03 更新内容如下: 1. 修复管理员栏目权限问题 2. 修复模板变量换成全局变量 3. 修复article表molds默认值为article 4. 修复用户公共页 5. 兼容PHP5.6版本 6. 修复编辑器不能下载远程图片的问题 7. 修复模型列表排序 8. 优化缩略图代码 9. 优化手机号验证代码 极致CMS 2.0.8 release 更新时间:2022-02-24 更新内容如下: 1. 修复新增模型推荐属性类型问题 2. 修复留言验证码后台设置无效问题 3. 修复后台栏目角色权限设置无效问题 4. 优化前台控制器代码 5. 优化日志记录问题 6. 修复模板部分不显示问题 7. 修复扩展文件未引入问题,兼容多种情况 8. 去除栏目.html模板名过滤问题,兼容.html和自定义后缀 9. 修复后台评论修改提交报错问题 极致CMS 2.0.7 release 更新时间:2022-02-17 更新内容如下: 1、修复tags显示问题 2、优化系统配置点击复制功能 3、修复前台用户发布问题 4、修复推荐属性输出问题 5、修复桌面设置问题 6、修复插件列表显示问题 极致CMS 2.0 release 更新时间:2022-02-01 更新内容如下: 1.优化后端模板 2.增加后台安装模板模块 3.所有字段列表可以控制显示 4.多模块搜素可以指定字段 5.增加副栏目功能 6.自定义模型前台发布可以后台控制 7.文章/商品模型获取缩略图、tags和简介截取字段内容功能界面可以控制 8.网站地图生成,取消前台生成sitemap,只后台生成 9.前端编辑器设置 10.回收站 11.栏目权限控制 12.支持定义搜索不同模型不同结果页(全局搜索除外) 13.模块列表设置排序,字段管理设置是否显示 14.收藏点赞重构,增加两个表likes和shouchang 15.编辑器相对路径图片 16.缓存时间设置问题进行了优化 17.【已修复】自定义链接更改栏目的时候没有同步更改数据 18.用户头像固定格式存储,覆盖方式 19.置顶推荐热点等功能可以创建,增加了attr推荐属性表,原来的ishot,istuijian,istop字段已废弃,但是前台loop参数依旧可用 20.内链用新表,不要放到tags里面,增加了chain表 21.前台自定义模型发布内容有问题。自定义模型可以后台设置 22.栏目权限问题,可以选择多个 23.栏目排序已修复 24.评论点赞数类型换成int 25.【已修复】内容评论字符串小图标问题 26.【已修复】微信H5支付问题 27.安装进度条优化,完成后将进度条隐藏 28.系统配置增加了自定义配置栏问题 29.桌面设置重新处理,可以单独设置菜单的名称 30.增加了后台模板自定义配置的文件格式,可以自动调用自定义模板 31.增加了插件接口及模板接口自定义,可自由接入不同的供应商插件和模板接口 32.更换了layui框架版本v2.6.8,将后台的layui转移到了static/common/layui下面 33.调整系统目录结构 极致CMS Beta1.9.5 更新时间:2021-04-26 更新内容如下: 修复:后台管理安全问题 修复:开启httponly 修复:数据库备份大小计算不准确 修复:后台错误返回页叠加问题 修复:json数据返回中文乱码问题 修复:前台邀请注册无效及增加积分出错问题 修复:loop缓存设置失效问题 极致CMS Beta1.9.4 更新时间:2021-03-09 更新内容如下: 修复:静态HTML生成问题 修复:导航缓存问题 修复:管理员列表分页数无法设置 优化:session缓存时间 优化:404页面返回404状态 优化:模块中设置栏目不是必选,字段可以在全局栏目使用 优化:栏目模板可以手动填写 优化:图集多附件字段默认text类型 新增:后台角色可以设置发布审核 极致CMS Beta1.9.3 更新时间:2021-01-10 更新内容如下: 修复:后台订单计算错误问题 修复:面包屑导航错误 修复:立即支付积分钱包计算 修复:碎片化时间计算错误 修复:系统设置个别配置设置错误 修复:其他管理员会员分组无法看见 修复:微信支付提交模板错误 修复:字段列表全部显示错误 修复:多图字段左右排序错误 修复:静态HTML生成时分页链接错误 优化:插件安装及列表 优化:字段列表去除分页,过滤栏目 优化:自定义导航太多而溢出问题 优化:自定义图片截取 优化:入口文件错误提示 优化:删除大量重复代码 优化:栏目数据缓存 优化:后台可预览未审核的内容 优化:普通管理员不能查看超级管理员登录记录 优化:栏目缓存 新增:对模板助手插件内置函数支持 新增:可以设置js更新点击量 新增:可自定义设置后台主页模板 新增:支持PHP8 新增:分页可以使用$currentpage输出当前页码 极致CMS Beta1.9.2 更新时间:2020-12-02 更新内容如下: 修复:多模块搜索缺少litpic字段 修复:sqlite后台管理员无法编辑修改 修复:生成静态无法清理文件夹 修复:取消关注失败,计算关注数不对 修复:个人中心头像无法修改 优化:栏目支持动态更改排序规则,分页不会出错 优化:支持自定义模板存放目录 优化:栏目列表按权限输出 优化:后台导航增加删除按钮 新增:留言支持列表,支持查看详情 极致CMS Beta1.9.1 更新时间:2020-11-18 更新内容如下: 修复:后台自定义模块tags无法修改的问题 修复:桌面设置-新增的时候缺少栏目 修复:自定义链接修改问题 修复:后台验证码隐藏 修复:自定义栏目URL无法生产静态HTML 修复:关键词tags,中文逗号替换 优化:自定义模块时间参数默认显示 优化:新增模块想办法增加几个默认字段 优化:loop自定义分页标识jzpage需要更改 优化:检测插件安全目录 优化:前台个人主页支持ID传输 如:/user/active/uid/[会员ID] 新增:自定义字段增加动态多行输入 极致CMS Beta1.9 更新时间:2020-10-24 更新内容如下: 修复:友情链接权限 修复:积分金币充值问题 修复:面包屑导航错误 修复:自定义路由错误 修复:loop notempty查询问题 修复:后台插件数据保存不能获取数据 修复:购物车折扣错误 修复:百度编辑器无法自动下载图片 修复:百度编辑器多图上传bug 修复:生成静态HTML时出错 修复:后台无法下载插件问题 修复:前台图集问题 修复:后台录入英文不过滤空格 优化:图形验证码 优化:系统后台界面美化 优化:百度编辑器图片按时间排序 优化:系统配置加载太慢的问题 优化:后台模板多余内容 优化:前台搜索查询 优化:前台tag查询 优化:模板标签大小写不敏感问题 优化:自定义模块栏目未选显示所有字段 优化:分页页码输出 优化:系统菜单功能文字 优化:自定义路由?后面的参数加进来 优化:后台搜索 新增:图集可以进行排序 新增:大数据碎片化 新增:导航设置 新增:系统配置增加单选开关及栏目选项 新增:自定义缩略图功能 新增:前台点击量可以JS处理 新增:前台可以不登录点赞 新增:支付宝当面付功能 新增:网站可以跳过购物车直接购买 新增:前台搜索相关字段可以后台控制 新增:自定义模块可以添加TAG 新增:前后台验证码可以关闭 新增:桌面设置可以设置指定栏目到菜单 极致CMS Beta1.8.1 更新时间:2020-07-30 更新内容如下: 1、修复:前台自定义时间字段显示问题 2、修复:编辑器视频无法编辑 3、修复:批量删除时自定义URL未删除 4、修复:多附件字段只能上传图片 5、修复:前台注册后登录还跳到注册页面 6、修复:系统配置release_table模板写错参数 7、修复:支付宝支付回调检测错误 8、修复:友情链接分类删除出错 9、修复:tags表缺少member_id字段 10、修复:系统配置统计代码过滤问题 11、优化:友情链接权限分配 12、优化:过滤参数规则 13、优化:新增字段默认排序改为2 14、优化:留言自定义字段根据栏目区分 15、优化:订单内容可以修改自定义字段内容 16、优化:更改系统数组分页逻辑 17、新增:栏目可以设置关闭,关闭后前台不会显示也不能打开 极致CMS Beta1.8 更新时间:2020-06-30 更新内容如下: 1、修复:系统模板目录变更问题 2、修复:删除前台支付多余代码 3、修复:缓存域名唯一性 4、修复:数据库恢复在Linux存在报错 5、修复:自定义URL后面加参数报404错误 6、修复:文章字数限制错误提示 7、修复:官方模块默认模板 8、修复:官方模板个人中心自定义图片字段无法上传的问题 9、修复:官方自定义字段前台图片上传问题 10、修复:微信支付宝支付存在的bug 11、修复:修复分页列表数为0时报错问题 12、修复:sqlite版本字段修改失败的问题 13、修复:后台新增管理员字段报错 14、修复:多处存在XSS漏洞 15、优化:后台列表第一页与最后一页显示问题 16、优化:后台订单总金额显示异常 17、优化:数据库报错直接写入文件,不再显示页面 18、优化:点赞收藏积分奖励 19、优化:后台商品默认库存 20、优化:API数据插件增加发布和更新 21、新增:栏目SEO标题 22、新增:前台发布模块限制 23、新增:根目录robots 24、新增:QQ登录插件加入邮箱验证 25、新增:栏目列表增加发布快捷键 26、新增:前台模板标签loop增加分页标识 27、新增:独立友情链接模块,并增加友情链接分类 极致CMS Beta1.7.1 更新时间:2020-05-25 更新内容如下: 1、修复:开启层级URL后,自定内容URL报404 2、修复:检查默认字段是否存在 3、修复:栏目列表,新增下级栏目,无法关联上级 4、修复:后台列表修改退回选项 5、修复:前台发布数据库报错 6、修复:foreach计数时{foreach $list as $v} $v与}不能隔开 7、修复:后台栏目修改时,单页无法自动读取模板 8、修复:管理员回复评论后台编辑框丢失 9、修复:管理员回复不能通知前台用户 10、修复:后台栏目新增字段,新增栏目时不能直接显示字段 11、修复:新增自定义配置后,前台{$webconf}不能立即调用 12、修复:留言/评论数限制问题 13、修复:微信登录注册bug 14、修复:系统支付功能 15、修复:Screen标签View.php里面变量参数bug 16、修复:后台商品列表无法筛选子栏目 17、修复:前台发布提交相关问题 18、修复:验证码兼容大小写 19、修复:时间字段筛选不准确 20、优化:新增时间插件会无法选择时间 21、优化:后台子管理员创建角色可以选择角色 22、优化:去除安装时的修改后台文件名 23、优化:自定义模块编辑内容的时候栏目被编辑器挡住 24、优化:后台首页换一个列表 25、优化:系统兼容php7.4 26、优化:前台注册随机用户名,取消手机号作为用户名 27、新增:栏目修改也增加提示是否取消 28、新增:后台插件列表插件所属平台、插件搜索功能 29、新增:新增字段能列表更改排序 30、新增:前台邀请注册送奖励 31、新增:前台注册可以后台关闭 32、新增:前台注册仅限通过邀请链接进入注册 33、新增:其他平台支付接入点 34、新增:系统配置-增加手机号码、微信二维码 35、新增:系统模板目录可更改 36、新增:管理员模块按照分组输出扩展字段 37、新增:栏目增加关闭及批量处理功能 38、新增:分离编辑器,可扩展自定义编辑器 39、新增:图集/多附件增加文字描述 40、新增:桌面设置增加复制功能 41、新增:默认模板里增加tags相关页面 42、新增:loop增加sql参数,参考帮助文档了解使用 极致CMS Beta1.7 更新时间:2020-04-28 更新内容如下: 1、修复:后台订单支付状态修改无效 2、修复:前台不显示充值钱包记录 3、修复:商品库存下单不减少 4、修复:评论后台管理员无法回复 5、修复:ArrayPage修复next下一页链接 6、修复:自定义模块列表分页不受控制 7、修复:人性化时间显示问题 8、修复:新建栏目字段绑定会失效 9、修复:前台上传的图片没有记录文件后缀 10、修复:个人中心发布内容扩展信息无法记录 11、修复:去掉富文本截屏插件 12、修复:后台充值分页错误 13、修复:核心文件中配置读取有错误 14、修复:后台用户删除没有写返回 15、修复:后台评论栏目显示不全 16、修复:前台message ajax提交返回code=1为success 17、修复:顶部导航点击菜单不能新增tab 18、修复:后台列表分页数量设置无效 19、修复:新增模块列表未固定右侧编辑菜单 20、优化:插件模块 21、优化:系统配置模板可以下拉选择 22、优化:系统模块不允许修改模块标识 22、优化:批量新增栏目更改形式 23、优化:友情链接、TAG可以不受栏目权限限制 24、优化:错误信息提示隐藏路径问题 25、优化:更改系统文件上传处理 26、优化:统一配置输出,原$customconf依旧可以使用 27、优化:前台栏目发布检测分类授权 28、优化:商品表增加molds字段 29、优化:后台提交按钮部分页面浮动 30、优化:后台内容修改取消自动跳转 31、优化:sqlite版本链接数据库换用sqlite3 32、优化:文章商品简介过多提示修改 33、优化:静态HTML生成 34、优化:后台从内容获取简介优化去除空格 35、优化:后台编辑器转为static/common/user/uedit 36、优化:自动生成静态html 37、优化:系统生成缓存的方法 38、新增:关闭网站功能,关闭页面模板static/common/close.html 39、新增:自定义配置增加编辑器 40、新增:模块增加默认模板 41、新增:可控制栏目绑定模块 42、新增:可控制栏目是否受权限限制 43、新增:可控制栏目是否在该模块显示 44、新增:可控制栏目是否必选 45、新增:foreach标签加计数器 46、新增:可控制栏目是否在该模块显示 47、新增:上传文件目录更改,富文本编辑器上传需手动更改 48、新增:loop模板标签增加in字段,可范围内查询,支持变量 49、新增:增加ajax数据获取的安全性,后台可关闭 50、新增:增加字段安全性,可针对新增字段进行设置前台ajax获取权限 51、新增:文章/商品/自定义模块详情页均可自定义URL 52、新增:文章/商品/自定义模块详情页均可添加外链 53、新增:前台敏感词提示 54、新增:sitemap动态生成 55、新增:增加rss订阅,访问:http://域名/home/rss 56、新增:栏目列表页排序增加多种形式 57、新增:栏目列表页排序前台可提交对应的形式参数(orders:1~7)值进行动态设置 58、新增:新增模块增加多个默认字段[addtime:新增时间 hits:点击数 istop:是否置顶 target:外链 ownurl:自定义URL] 59、新增:默认字段不允许删除,可进行隐藏 60、新增:管理员角色组模块加上是否受栏目权限控制 61、新增:管理员列表加上所属角色组 62、新增:搜索页面数量控制,只需要提交参数时加上limit参数即可设置列表数 63、新增:栏目URL后缀.html可以去掉[系统设置-高级设置] 极致CMS Beta1.6.7 更新时间:2020-03-26 更新内容如下: 1、修复:内容页下一篇上一篇问题 2、修复:后台评论修改返回json 3、修复:前台提交的内容审核时报错 4、修复:前台发布退回改为未审核 5、修复:前台用户信息提醒页面 6、修复:本地自定义插件后台未引入 7、修复:后台创建用户分组时报错(sqlite) 8、修复:解决服务器多文件部署上传图片根目录问题 9、优化:引入模板文件报错提示 10、优化:后台个人信息修改页面 11、优化:前台登录返回登录的地方 12、优化:前台订单删除增加安全过滤 13、优化:前台评论删除增加安全过滤 14、优化:个人中心页面 15、优化:优化分页 16、优化:更改系统报错等级 17、优化:安装指引 18、优化:栏目模板选择 19、新增:后台LOGO系统配置项 极致CMS Beta1.6.6 更新时间:2020-03-07 更新内容如下: 1、修复扩展字段小数类型bug 2、修改模板缓存文件名为32位字符串 3、兼容links模块中url存在而导致链接覆盖的问题 4、修复前台留言无法获取扩展字段问题 5、修复前台ArrayPage数组分页类分页错误 6、实现后台插件列表在线下载安装插件 7、增加前台后台录入内容安全过滤 *8、sqlite版本修复内容样式无法保存的bug(实际上保存了,显示的时候有问题) 极致CMS Beta1.6.5 更新时间:2020-02-15 更新内容如下: 1、修复M函数传递表名问题 2、修复新增字段前台显示必选字段未验证问题 3、新增后台栏目权限设置,可以给管理员分组设置允许访问的栏目 极致CMS Beta1.6.4 更新时间:2020-01-02 更新内容如下: 1、修复手机模式下,后台首页提示报错 2、修复插件文件夹存在zip压缩包报错 3、修复后台定时器,保持后台session持续 4、修复后台留言详情页,提交时ip被修改的错误 5、修复后台模板风格-原始-关闭阴影点击触发关闭窗口 6、修复数据库新增内容的时候,不能录入空而导致无法新增的bug 7、更改hook方式,防止数据库反斜杠丢失带来错误 8、取消U方法首字母大写转换,按原字母大小写 9、截取字符串的时候,将 空格过滤 10、增加动态访问链接实现 11、修复empty和notempty不处理null的问题 12、修复loop中like查询,并增强like查询,支持格式:like='字段|关键词',like='字段1|关键词1,字段2|关键词2',like='字段1|变量1',like='字段1|变量1,字段2|变量2',like='字段1|关键词1,字段2|变量' 13、loop可以使用limit从第几条开始输出,如:limit="1,10",输出10条,从第2条开始输出,需要注意一点,limit="开始数,输出条数",数据库是从0开始计数的,也就是从第一条输出是这样的:limit="0,10" 14、修复开启层级URL后,栏目修改父类时,子栏目URL不更改 15、修改模板错误提示,去除绝对模板路径,只显示相对模板路径 16、loop标签新增一个day参数,按天调用数据,如:最近1天、3天、7天这种调用,可以{loop xxx day="1" as="$v"}【该方法由群友分享,昵称:MingTian】 17、修复栏目新增字段绑定bug,栏目页面没有新增字段显示问题 18、修复插件模块Home/plugins/HomeController->jizhi无效的bug 19、备份数据库列表不再显示副本 20、修复数据库导入副本顺序错误问题 21、修复tags分页及系统Page分页类优化 22、数组分页类增加自定义分页输出 23、多模块搜索和tags标签增加pagelist分页数组参数,可自定义输出分页 24、后台增加$classtypedata全局栏目 25、loop循环支持省略table参数,但必须同时要填写tid数值,tid可以写多个,但以第一个数值的栏目绑定模块为主。支持:{loop tid="2" isshow="1" as="v"}、{loop tid="2,3,4" isshow="1" as="v"}(table默认为栏目id=2的模块)、{loop tid="$tid" isshow="1" as="v"}(如果$tid为一个栏目ID数值) 26、修改清除静态文件按钮的颜色 27、修改网站上传大小限制,后台设定的大小单位为MB 28、修改上传文件功能,修改pictures表字段 30、增强缓存文件安全性 31、新增上传图片水印功能 32、增强系统安全 33、修复loop标签字符串变量传递报错问题 34、丰富完善个人中心模块(特别感谢:舒彬琪1651978720 提供的个人中心模板) 35、增加二级目录可执行功能 极致CMS Beta1.6.3 更新时间:2019-11-25 更新内容如下: 1、调试模式开关增加到后台系统配置 2、留言审核及评论审核权限增加到后台系统配置 3、文章/商品/留言/评论/自定义 五个模块增加批量审核功能 4、文章/商品/留言/评论/自定义 五个模块列表增加自适应屏幕界面美化(导出功能也美化下) 5、文章模块增加敏感词检测(标题,SEO标题,关键词,内容,简介),敏感词增加到系统配置 6、文章/商品 模块增加快速修改标题功能 7、自定义字段(select)增加输入检索功能,美化用户体验 8、修复支付页面提交缺少提交数据的HTML模板demo页 9、优化后台首页 10、修复管理员后台点击分组报错问题 11、修复数据库导出可能出现乱码bug 12、去除前台推荐属性置顶的全局置顶 13、美化后台界面 14、优化后台图片管理删除不存在的文件导致报错问题 15、增加统计点赞(jz_zan)收藏(jz_collect)的函数 极致CMS Beta1.6.2 更新时间:2019-11-13 更新内容如下: 1、修复栏目跳转链接修改时为空的bug 2、更改推荐属性字段类型为varchar 3、修复get_domain有时候ssl无法判断的bug 4、修复层级分类栏目的小bug 5、修改字段的时候,关联栏目数值未赋值的bug 6、修改插件的用户权限审核,多处文件修改 7、自动更新静态时,首页报错的bug 8、修复后台无法创建管理员账户的bug 9、修复手机模式栏目URL出错的bug 10、增强数据库数据承受能力及更新静态HTML时导致内存溢出的bug 11、修复数据库备份太多数据出错的bug 12、修复安装程序时出现数据库乱码的bug 13、修复安装时候填入账号密码无效的bug 14、修复session存储文件夹不存在导致的错误 15、FrPHP框架默认配置删除多余字符 16、新增tags详情输出 17、新增用户中心发布文章模块 18、新增安装cms时,可以自动创建数据库 19、修复拉栏目缓存问题 20、去除文章模块和商品模块的全局置顶 21、修复新增后台桌面时设置不生效的bug 22、修改关联字段格式化数据显示 极致CMS Beta1.6.1 更新时间:2019-10-19 更新内容如下: 1、去除多余InnoDB,有时候会导致数据库导入出错 2、修复留言json返回状态码code错误 3、修复ajax登录可能出现Notice:Undefined index:return_url错误 4、修改插件列表提示语 5、修改网站多域名绑定模板插件中模板显示不全问题,更改为手动填写 6、修复loop循环classtype表嵌套其他表循环时URL出错 7、增强TAG标签功能。 * 文章模块和商品模块发布时可以填写tags标签 * 前台具有标签聚合功能,标签聚合页tags.html,标签详情页tags-details.html,存放路径跟模板中主页index.html同级 * 标签控制器Home/TagsController.php * 标签列表跟栏目列表页一样,数据数组是$lists,默认每页数据是100条,可以在控制器中手动修改,建议tags.html中{fun dump($pages)}了解分页结构,也可以在扩展类FrPHP/Extend/ArrayPage.php中修改你想要的分页结构 8、修复自定义页面有时候无法正确读取的问题 9、美化自定义图集字段模板界面 极致CMS Beta1.6 更新时间:2019-10-10 更新内容如下: 1、修改后台列表为数据表格 2、加强生成静态文件功能,可以分别生成手机端和电脑端静态文件,可以自动生成静态文件 3、新增插件-系统API接口,实现API数据查询 4、新增插件-独立静态网站,生成独立静态网站,更加安全可靠! 5、美化后台界面,搜索栏可折叠 6、加强后台管理员权限分配功能 7、新增文章/商品模块置顶、推荐、热点三个内容属性 8、新增URL层级格式,新增栏目的时候自动添加层级,修改的时候会显示所有层级URL 9、新增扩展字段内容显示权限控制,可以在基础信息下显示扩展信息 10、新增缓存页面功能控制,可关闭以保证空间容量 11、修改前台缓存页面格式,增加安全性 12、修复新增桌面时前端js效果错误 13、新增自定义单页,将单页文件放置在模板内的page文件夹内,文件名即为访问链接 14、新增系统配置中高级配置、邮箱订单、支付配置、公众号绑定等权限设置 15、添加Blog桌面配置、基础建站桌面配置供大家参考 极致CMS Beta1.5.2 更新时间:2019-09-28 更新内容如下: 1、修复筛选字段bug 2、添加上传文件后缀限制 3、新增推荐属性功能 4、修复产品新增的时候,弹出窗口点击确认会跳转到错误页面的bug 5、修复栏目新增字段不受绑定栏目控制的bug 6、增加栏目外链功能 7、美化前台上传图片样式,修复多图上传删除按钮失效bug 8、增加js方法帮助删除自定义上传图片 9、美化自定义上传图片样式 10、删除栏目的时候没有判断子栏目是否存在 11、修复由于开启缓存导致ajax=1不返回json数据 12、修复批量添加栏目的时候没有限制隐藏模块,修复新增字段fieldtype=12时筛选未起作用 13、修复screen筛选链接出错问题 14、修复由于github打包存在空文件不打包而导致程序执行错误问题 15、修复缓存获取的时候文件找不到 16、解决install检测出不符合安装的条件还能继续安装,新增栏目、轮播图分类列表notice错误,系统设置扩展字段不能上传图片bug 17、修复轮播图不能修改扩展字段内容bug 18、新增系统配置网站SEO网址,便于SEO优化 19、修复修改详情时导致用户权限消失,优化功能 极致CMS Beta1.5 更新内容如下: 1、修复修改字段时无法更改字段内容bug 2、修改loop循环的时候page分页链接去除.html后缀 3、修复前台获取自定义字段有的字段没有被获取到 4、修复loop循环中$type['id']时报错 5、修复个人中心订单及评论数错误显示 6、新增字段增加关联模块类型,并修复新增字段时提示偶然错误bug[FieldsController.php] 7、修复安装时出现缓存文件夹不存在和数据库未创建而直接连接数据库导致的错误 8、美化textarea及修复新增字段bug 9、修复新增字段编辑器类型不显示bug 10、修复登录的时候如果没有HTTP_REFERER提示的Notice 11、修复后台新增用户没有用户分组选项 12、修复修改详情时导致用户权限消失,优化功能 13、修复详情页上一页下一页输出问题 14、配置文件新增domain网站SEO网址 15、安装数据库添加v1.5版本及相关sql 极致CMS Beta1.4 更新内容如下: 1、格式化时间显示 2、新增前台留言模块增加验证码插件 3、新增后台模板编辑插件 4、自定义文章/产品详情url 5、自定义模块新增isshow默认字段,判断是否显示内容,修复前台不显示内容也显示的bug 6、支付模块修复bug 极致CMS Dev1.3 更新功能如下: 1.修改A/t/tpl/welcome.html里的系统版本 2.修改GetIP方法更换,以兼容7.1和7.2有时报错问题 3.新增配置文件信息数据库sysconfig,存储配置,去除Conf/webconf.php和Conf/custom.php 4.新增字段,默认值填写 5.后台模板部分美化 6.栏目增加模板文件默认值 7.插件功能升级,增加hook表作为插件注册事件 8.批量创建栏目 9.loop加notempty,empty筛选 10.栏目loop的url问题 11.修复栏目当前位置$positions出现输出多个栏目问题 12.修复扩展模块分页出错问题 13.修复后台标签错误输出 14.修复前台评论接收自定义字段参数内容 15.数据备份存储加安全代码 16.数据存储加安全代码 17.修复系统控制器访问404页面错误处理 18.修改配置文件Config/db.config.php为Config/config.php,可以更灵活,多配置 19.自定义字段增加radio选项类 20.多语言功能(通用型) 21.域名绑定模板功能 22.重写session存储及增加redis存储session[备用] 23.支付功能完善 (已完善支付宝支付) 24.安装步骤优化 25.增强文件安全 26.自动内链 27.静态文件生成 28.网站地图生成 29.数据库表中默认值,注册用户的时候出现字段缺少默认值的情况 30.新增字段时,已存在的表内字段提示已有字段 极致CMS Dev1.2 更新时间:2019-08-24 1.删除可疑文件 FrPHP/Extend/wechat.php 2.修复插件列表不显示新增插件问题【手动修复,复制新系统里面的A/c/PluginsController.php覆盖一下】 极致CMS Dev1.1 更新时间:2019-08-23 23:45 1.修复目录中空数据库包db.sql存在gbk编码问题 ================================================ FILE: robots.txt ================================================ User-agent: * Disallow: Disallow: /app/ Disallow: /backup/ Disallow: /cache/ Disallow: /frphp/ Disallow: /install/ Disallow: /conf/ ================================================ FILE: static/cms/404.html ================================================ 404找不到页面 {include="style"} {include="header"}
    This Page is Not Found.

    很抱歉,找不到此页。

    {include="footer"} {include="js"} ================================================ FILE: static/cms/article/article-details.html ================================================ {$jz['seo_title']}-{$webconf['web_name']} {include="style"} {include="header"}
    {$jz['title']}
    热度 {$jz['hits']}

    {$jz['title']}

    {$jz['body']}
    {if($aprev)} 上一篇:{$aprev['title']} {/if} {if($anext)} 下一篇:{$anext['title']} {/if}

    相关文章

    {loop table="article" notempty="litpic" isshow="1" tid="$jz['tid']" isall="1" orderby="rand()" limit="4" as="v"}
    {$v['title']}
    {$v['title']}
    {/loop}
    {include="comment"}
    {if($jz['member_id'])}
    {php $user = memberInfo($jz['member_id']); /}
    {$user['username']}

    {$user['username']}

    {$user['email']}

    {$user['signature']}

    {/if}
    {include="latestpost"}

    热门标签

    {loop table="tags" isshow="1" orderby="num desc" limit="15" as="v"} {$v['keywords']} {/loop}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/article/article-list.html ================================================ {$type['seo_classname']}-{$webconf['web_name']} {include="style"} {include="header"}
    {if($lists)} {foreach $lists as $v}
    {$v['title']}

    {$v['title']}

    {$v['description']}

    {$v['zan']}
    {$v['comment_num']}
    阅 {$v['hits']}
    {/foreach} {else}
    This Page is Not Found.

    很抱歉,没有找到你要的信息。

    {/if}
    {include="searchform"} {include="latestpost"}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/article/faq.html ================================================ {$type['seo_classname']}-{$webconf['web_name']} {include="style"} {include="header"}

    一些问题和回答, 请看这里.

    {loop table="article" tid="$type['id']" isshow="1" orderby="orders desc,id asc" as="v"}

    {$v['body']}
    {/loop}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/backup/.gitkeep ================================================ ================================================ FILE: static/cms/comment.html ================================================

    评论 ({$jz['comment_num']})

    上一页 下一页

    我要点评

    {if($islogin)}
    {else} 您还未登录,无法发表评论! {/if}
    ================================================ FILE: static/cms/faq.html ================================================ Bunzo - Blog Bootstrap 5 HTML Template

    Some Question And Answer, Look’s here.

    Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.

    Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.

    Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.

    Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.

    Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.

    Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.

    Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.

    Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.

    Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.

    Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.

    Lorem Ipsum is simply dummy text of printing and typesetting industry. Lorem psum has been the dustry standard dummy text since the printer into electronic.

    Lorem Ipsum is simply dummy text offer printing and typeseting industry since the printer into electronic.

    ================================================ FILE: static/cms/footer.html ================================================
    ================================================ FILE: static/cms/func/functions.php ================================================
    {if($islogin)} {else} {/if}
    ================================================ FILE: static/cms/index.html ================================================ {$webconf['web_name']} {include="style"} {include="header"}

    极致建站系统

    建站、教程、资源

    热门模板

    最近更新

    {loop table="article" notempty="litpic" orderby="addtime desc" isshow="1" limit="6" as="v"}
    {$v['title']}

    {$v['title']}

    {fun newstr($v['description'],80)}

    {/loop}
    用户评价

    人们对我们的评价

    {loop table="pingjia" orderby="orders desc" isshow="1" as="v"}
    {$v['description']}

    {$v['body']}

    {/loop}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/info.php ================================================ '官方默认模板',//模板名称 'desc'=>'此模板拥有极致CMS所有功能,仅供参考和学习!',//模板介绍 'author'=>'留恋风2581047041@qq.com',//作者介绍,这里可以把自己的联系方式带上去,方便用户沟通 'version'=>'1.0',//模板版本,默认1.0为最低版本 'web'=>'https://www.jizhicms.cn', 'thumbnail'=>'/static/cms/thumbnail.png', 'update_time'=>'2022-01-20',//更新时间,格式:Y-m-d ]; ================================================ FILE: static/cms/install/TemplateController.php ================================================ // +---------------------------------------------------------------------- // | Date:2022/01 // +---------------------------------------------------------------------- use frphp\lib\Controller; use frphp\extend\Page; class TemplateController extends Controller { private $backupPath = ''; //自动执行 public function _init(){ /** 继承系统默认配置 **/ //检查当前账户是否合乎操作 if(!isset($_SESSION['admin']) || $_SESSION['admin']['id']==0){ Redirect(U('Login/index')); } $webconf = webConf(); $this->webconf = $webconf; $classtypedata = classTypeData(); $this->classtypedata = getclasstypedata($classtypedata,0); //当前模板目录 $this->tpl = '@'.dirname(__FILE__); //数据库备份目录 $this->backupPath = __DIR__ .'/backup'; //引入当前模板的配置文件 $this->templateconfig = include_once('../info.php'); /** 在下面添加自定义操作 **/ } //执行SQL语句在此处处理,或者移动文件也可以在此处理 public function install(){ //将一个文件覆盖另一个文件的方法 /*将当前模板目录的a.html复制到abc模板下面的index.html $dir = APP_PATH.'static/default'; copy($dir."/a.html",APP_PATH.'static/abc/index.html'); */ //插入一条SQL /* $sql.="INSERT INTO `".DB_PREFIX."sysconfig` (`field`,`title`,`tip`,`type`,`data`) VALUES ('closeweb','关闭网站', NULL,'0','0');"; M()->runSql($sql); */ return true; } //批量转移覆盖文件--子目录不会覆盖 //从一个目录$from转移到另一个目录$to //最好在这个目录中创建一个back文件夹,转移覆盖文件前会先备份原文件以防文件丢失 //eg: $from = APP_PATH.'static/backup' 转移到 $to = APP_PATH.'static/abc' //备份文件在 APP_PATH.'static/backup/back'中 private function removeFile($from,$to){ //移动后台插件控制器 $sourcefile = $from; $target = $to; if(is_dir($sourcefile) && is_dir($target)){ if (false != ($handle = opendir ( $sourcefile ))) { while ( false !== ($file = readdir ( $handle )) ) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != ".." && !is_dir($sourcefile.'/'.$file) ) { $fs = $sourcefile.'/'.$file; $ft = $target.'/'.$file; //备份源文件以防更新覆盖 if(!is_dir($sourcefile.'/back')){ mkdir($sourcefile.'/back',0777); } copy($ft, $sourcefile.'/back/'.$file); $r = $this->file2dir($fs,$ft); if(!$r){ JsonReturn(array('code'=>1,'msg'=>'文件转移失败!sourcefile:'.$fs.' targetfile:'.$ft)); } } } //关闭句柄 closedir ( $handle ); } } } //复制文件并转移与removeFile结合使用 private function file2dir($sourcefile, $filename){ if( !file_exists($sourcefile)){ return false; } return copy($sourcefile, $filename); } // 原目录复制到的目录,子目录也会转移 function recurse_copy($src,$dst) { $dir = opendir($src); @mkdir($dst); while(false !== ( $file = readdir($dir)) ) { if (( $file != '.' ) && ( $file != '..' )) { if ( is_dir($src . '/' . $file) ) { $this->recurse_copy($src . '/' . $file,$dst . '/' . $file); } else { copy($src . '/' . $file,$dst . '/' . $file); } } } closedir($dir); } //返回表字段 //$table不需要带表前缀 //返回字段数组 eg:['id','title','body',[...]] private function getTableFields($table){ if(defined('DB_TYPE') && DB_TYPE=='sqlite'){ $sql = "pragma table_info(".DB_PREFIX.$table.")"; $list = M()->findSql($sql); $fields = []; foreach($list as $v){ $fields[]=$v['name']; } }else{ $sql = 'SHOW COLUMNS FROM '.DB_PREFIX.$table; $list = M()->findSql($sql); $isgo = true; $fields = []; foreach($list as $v){ $fields[]=$v['Field']; } } return $fields; } //返回数据库表数组 //eg:['article','product',[...]] private function getTableData(){ if(defined('DB_TYPE') && DB_TYPE=='sqlite'){ $sql = "select name from sqlite_master where type='table' order by name"; }else{ $sql = "SHOW TABLES"; } $tables = M()->findSql($sql); $ttable = array(); foreach($tables as $value){ foreach($value as $vv){ $ttable[] = $vv; } } return $ttable; } //备份数据库 private function toBackup(){ $pconfig = array( 'host' =>DB_HOST, 'port' =>DB_PORT, 'user' =>DB_USER, 'password' =>DB_PASS, 'database' =>DB_NAME ); $this->config = array_merge($this->config, $pconfig); $this->handler = new \PDO("mysql:host=".$this->config['host'].";port={$this->config['port']};dbname={$this->config['database']}", $this->config['user'], $this->config['password']); $this->handler->query("set names utf8"); $this->backup(); } /** * 备份当前数据库 * @param array $tables * @return bool */ private function backup($tables = array()) { //存储表定义语句的数组 $ddl = array(); //存储数据的数组 $data = array(); $this->setTables($tables); if (!empty($this->tables)) { foreach ($this->tables as $table) { $ddl[] = $this->getDDL($table); $data[] = $this->getData($table); } //开始写入 $this->writeToFile($this->tables, $ddl, $data); } else { $this->error = '数据库中没有表!'; return false; } } /** * 设置要备份的表 * @param array $tables */ private function setTables($tables = array()) { if (!empty($tables) && is_array($tables)) { //备份指定表 $this->tables = $tables; } else { //备份全部表 $this->tables = $this->getTables(); } } /** * 查询 * @param string $sql * @return mixed */ private function query($sql = '') { $stmt = $this->handler->query($sql); $stmt->setFetchMode(\PDO::FETCH_NUM); $list = $stmt->fetchAll(); return $list; } /** * 获取全部表 * @return array */ private function getTables() { $sql = 'SHOW TABLES'; $list = $this->query($sql); $tables = array(); foreach ($list as $value) { $tables[] = $value[0]; } return $tables; } /** * 获取表定义语句 * @param string $table * @return mixed */ private function getDDL($table = '') { $sql = "SHOW CREATE TABLE `{$table}`"; $ddl = $this->query($sql)[0][1] . ';'; return $ddl; } /** * 获取表数据 * @param string $table * @return mixed */ private function getData($table = '') { $sql = "SHOW COLUMNS FROM `{$table}`"; $list = $this->query($sql); //字段 $columns = ''; //需要返回的SQL $query = []; foreach ($list as $value) { $columns .= "`{$value[0]}`,"; } $columns = substr($columns, 0, -1); $data = $this->query("SELECT * FROM `{$table}`"); foreach ($data as $value) { $dataSql = ''; foreach ($value as $v) { if($v==='' || $v===null){ $dataSql .= " NULL,"; }else{ $dataSql .= "'{$v}',"; } } $dataSql = substr($dataSql, 0, -1); $query[]= "INSERT INTO `{$table}` ({$columns}) VALUES ({$dataSql});\r\n"; } return $query; } /** * 写入文件 * @param array $tables * @param array $ddl * @param array $data */ private function writeToFile($tables = array(), $ddl = array(), $data = array()) { $public_str = "/*\r\nMySQL Database Backup Tools\r\n"; $public_str .= "Server:{$this->config['host']}:{$this->config['port']}\r\n"; $public_str .= "Database:{$this->config['database']}\r\n"; $public_str .= "Data:" . date('Y-m-d H:i:s', time()) . "\r\n*/\r\n"; $i = 0; //echo '备份数据库-'.$this->config['database'].'
    '; $countsql = 0;//记录sql数 $filenum = 0;//文件序号 $backfile = $this->config['target']==''? $this->config['database'].'_'.date('Y_m_d_H_i_s').'_'.rand(100000,999999): $this->config['target'].date('YmdHis');//文件名 $str = $public_str."SET FOREIGN_KEY_CHECKS=0;\r\n"; foreach ($tables as $table) { // echo '备份表:'.$table.'
    '; $str .= "-- ----------------------------\r\n"; $str .= "-- Table structure for {$table}\r\n"; $str .= "-- ----------------------------\r\n"; $str .= "DROP TABLE IF EXISTS `{$table}`;\r\n"; $str .= $ddl[$i] . "\r\n"; $i++; //echo '备份成功!
    '; } //优先备份表结构 $str = ''.$str; $isok = file_put_contents('backup/'.$backfile.'.php', $str); if(!$isok){ exit('[ backup/'.$backfile.'.php ] 写入文件失败!'); } $str = $public_str; $filenum = 1; $i = 0; foreach($tables as $table){ //echo '备份表数据:'.$table.'
    '; $str .= "-- ----------------------------\r\n"; $str .= "-- Records of {$table}\r\n"; $str .= "-- ----------------------------\r\n"; //$str .= $data[$i] . "\r\n"; foreach ($data[$i] as $v){ $str .= $v; $countsql++; if($countsql%($this->limit)==0){ $str = ''.$str; if($filenum==0){ $isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str); if(!$isok){ JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] 写入文件失败!']); } $filenum++; }else{ $isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str); if(!$isok){ JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败!']); } $filenum++; } $str = $public_str; } } $i++; } if($str!='' && $str != $public_str){ $str = ''.$str; if($filenum==0){ $isok = file_put_contents($this->backupPath.'/'.$backfile.'.php', $str); if(!$isok){ JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'.php ] 写入文件失败!']); } }else{ $isok = file_put_contents($this->backupPath.'/'.$backfile.'_v'.$filenum.'.php', $str); if(!$isok){ JsonReturn(['code'=>1,'msg'=>'[ '.$this->backupPath.'/'.$backfile.'_v'.$filenum.'.php ] 写入文件失败!']); } } } } } ================================================ FILE: static/cms/js.html ================================================ ================================================ FILE: static/cms/latestpost.html ================================================

    最新发布

    {loop table="article" notempty="litpic" jzcache="1" notempty="litpic" jzcachetime="60" orderby="addtime desc" isshow="1" limit="15" as="v"} {php //分3组 $n = $v_n%3; $newlist[$n][]=$v; /} {/loop} {foreach $newlist as $v}
    {foreach $v as $s}
    {$s['title']}
    {$s['title']}
    {/foreach}
    {/foreach}
    ================================================ FILE: static/cms/message/contact-us.html ================================================ {$type['seo_classname']}-{$webconf['web_name']} {include="style"} {include="header"}
    {if($type['litpic'])} {$type['classname']} {/if}

    给我们留言

    {include="footer"} {include="js"} ================================================ FILE: static/cms/page/about-us.html ================================================ {$type['seo_classname']}-{$webconf['web_name']} {include="style"} {include="header"}
    {$type['body']}
    用户评价

    人们对我们的评价

    {loop table="pingjia" orderby="orders desc" isshow="1" as="v"}
    {$v['description']}

    {$v['body']}

    {/loop}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/page/page.html ================================================ {$type['seo_classname']}-{$webconf['web_name']} {include="style"} {include="header"}
    {$type['body']}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/paytpl/alipay_in_weixin.html ================================================ 支付提示
    请在菜单中选择在浏览器中打开,
    以完成支付
    ================================================ FILE: static/cms/paytpl/dmf.html ================================================ 温馨提示

    应支付金额为

    ================================================ FILE: static/cms/paytpl/overpay.html ================================================ 温馨提示

    订单{$order['orderno']}支付成功!

    页面将在 3 秒后自动跳转

    返回首页 {if($order['ptype']!=1)} 返回钱包 {else} 立即跳转 {/if}

    ================================================ FILE: static/cms/paytpl/pay_form.html ================================================ 支付

    订单信息

    ================================================ FILE: static/cms/paytpl/wechat_h5_pay.html ================================================ 温馨提示

    等待支付......

    ================================================ FILE: static/cms/paytpl/wechat_pay.html ================================================ 温馨提示

    应支付金额为

    立即支付

    ================================================ FILE: static/cms/paytpl/wechat_scan.html ================================================ 温馨提示

    应支付金额为

    ================================================ FILE: static/cms/product/details.html ================================================ {$jz['seo_title']}-{$webconf['web_name']} {include="style"} {include="header"}

    {$jz['title']}

    {if($jz['tags'])} {foreach explode(',',$jz['tags']) as $v} {if($v)}{$v}{/if} {/foreach} {/if}

    ¥{$jz['price']} {if(checkCollect($type['id'],$jz['id']))} {else} {/if} {if(checkLikes($type['id'],$jz['id']))} {else} {/if}
    {foreach jz_show_fields($jz,'color,lx,hy') as $v} {/foreach}
    参数
    {$v['title']}{$v['data']}

    库存:{$jz['stock_num']} 件

    {$jz['description']}
    {$jz['body']}
    {if($aprev)} 上一篇:{$aprev['title']} {/if} {if($anext)} 下一篇:{$anext['title']} {/if}

    相关商品

    {loop table="product" notempty="litpic" tid="$jz['tid']" isshow="1" isall="1" orderby="rand()" limit="3" as="v"} {/loop}
    {include="comment"}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/product/list.html ================================================ {$type['seo_classname']}-{$webconf['web_name']} {include="style"} {include="header"}
      {screen molds="product" orderby="orders desc" as="s"}
    • 全部 {foreach $s['list'] as $ss} {$ss['value']} {/foreach}
    • {/screen}
    {if($lists)} {foreach $lists as $v}
    {$v['title']}
    ¥ {$v['price']} 元
    {$v['title']}
    {/foreach} {else}
    This Page is Not Found.

    很抱歉,没有找到你要的信息。

    {/if}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/search.html ================================================ 搜索 “{$word}” -{$webconf['web_name']} {include="style"} {include="header"}

    搜索 “{$word}” 结果如下:

    {if($lists)} {foreach $lists as $v}
    {$v['title']}
    {/foreach} {else}
    This Page is Not Found.

    很抱歉,没有找到你要的信息。

    {/if}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/searchall.html ================================================ 搜索 “{$word}” -{$webconf['web_name']} {include="style"} {include="header"}

    搜索 “{$word}” 结果如下:

    {if($lists)} {foreach $lists as $v}
    {$v['title']}
    {/foreach} {else}
    This Page is Not Found.

    很抱歉,没有找到你要的信息。

    {/if}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/searchform.html ================================================

    站内搜索

    ================================================ FILE: static/cms/static/css/aos.css ================================================ [data-aos][data-aos][data-aos-duration="50"],body[data-aos-duration="50"] [data-aos]{transition-duration:50ms}[data-aos][data-aos][data-aos-delay="50"],body[data-aos-delay="50"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="50"].aos-animate,body[data-aos-delay="50"] [data-aos].aos-animate{transition-delay:50ms}[data-aos][data-aos][data-aos-duration="100"],body[data-aos-duration="100"] [data-aos]{transition-duration:.1s}[data-aos][data-aos][data-aos-delay="100"],body[data-aos-delay="100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="100"].aos-animate,body[data-aos-delay="100"] [data-aos].aos-animate{transition-delay:.1s}[data-aos][data-aos][data-aos-duration="150"],body[data-aos-duration="150"] [data-aos]{transition-duration:.15s}[data-aos][data-aos][data-aos-delay="150"],body[data-aos-delay="150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="150"].aos-animate,body[data-aos-delay="150"] [data-aos].aos-animate{transition-delay:.15s}[data-aos][data-aos][data-aos-duration="200"],body[data-aos-duration="200"] [data-aos]{transition-duration:.2s}[data-aos][data-aos][data-aos-delay="200"],body[data-aos-delay="200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="200"].aos-animate,body[data-aos-delay="200"] [data-aos].aos-animate{transition-delay:.2s}[data-aos][data-aos][data-aos-duration="250"],body[data-aos-duration="250"] [data-aos]{transition-duration:.25s}[data-aos][data-aos][data-aos-delay="250"],body[data-aos-delay="250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="250"].aos-animate,body[data-aos-delay="250"] [data-aos].aos-animate{transition-delay:.25s}[data-aos][data-aos][data-aos-duration="300"],body[data-aos-duration="300"] [data-aos]{transition-duration:.3s}[data-aos][data-aos][data-aos-delay="300"],body[data-aos-delay="300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="300"].aos-animate,body[data-aos-delay="300"] [data-aos].aos-animate{transition-delay:.3s}[data-aos][data-aos][data-aos-duration="350"],body[data-aos-duration="350"] [data-aos]{transition-duration:.35s}[data-aos][data-aos][data-aos-delay="350"],body[data-aos-delay="350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="350"].aos-animate,body[data-aos-delay="350"] [data-aos].aos-animate{transition-delay:.35s}[data-aos][data-aos][data-aos-duration="400"],body[data-aos-duration="400"] [data-aos]{transition-duration:.4s}[data-aos][data-aos][data-aos-delay="400"],body[data-aos-delay="400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="400"].aos-animate,body[data-aos-delay="400"] [data-aos].aos-animate{transition-delay:.4s}[data-aos][data-aos][data-aos-duration="450"],body[data-aos-duration="450"] [data-aos]{transition-duration:.45s}[data-aos][data-aos][data-aos-delay="450"],body[data-aos-delay="450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="450"].aos-animate,body[data-aos-delay="450"] [data-aos].aos-animate{transition-delay:.45s}[data-aos][data-aos][data-aos-duration="500"],body[data-aos-duration="500"] [data-aos]{transition-duration:.5s}[data-aos][data-aos][data-aos-delay="500"],body[data-aos-delay="500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="500"].aos-animate,body[data-aos-delay="500"] [data-aos].aos-animate{transition-delay:.5s}[data-aos][data-aos][data-aos-duration="550"],body[data-aos-duration="550"] [data-aos]{transition-duration:.55s}[data-aos][data-aos][data-aos-delay="550"],body[data-aos-delay="550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="550"].aos-animate,body[data-aos-delay="550"] [data-aos].aos-animate{transition-delay:.55s}[data-aos][data-aos][data-aos-duration="600"],body[data-aos-duration="600"] [data-aos]{transition-duration:.6s}[data-aos][data-aos][data-aos-delay="600"],body[data-aos-delay="600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="600"].aos-animate,body[data-aos-delay="600"] [data-aos].aos-animate{transition-delay:.6s}[data-aos][data-aos][data-aos-duration="650"],body[data-aos-duration="650"] [data-aos]{transition-duration:.65s}[data-aos][data-aos][data-aos-delay="650"],body[data-aos-delay="650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="650"].aos-animate,body[data-aos-delay="650"] [data-aos].aos-animate{transition-delay:.65s}[data-aos][data-aos][data-aos-duration="700"],body[data-aos-duration="700"] [data-aos]{transition-duration:.7s}[data-aos][data-aos][data-aos-delay="700"],body[data-aos-delay="700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="700"].aos-animate,body[data-aos-delay="700"] [data-aos].aos-animate{transition-delay:.7s}[data-aos][data-aos][data-aos-duration="750"],body[data-aos-duration="750"] [data-aos]{transition-duration:.75s}[data-aos][data-aos][data-aos-delay="750"],body[data-aos-delay="750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="750"].aos-animate,body[data-aos-delay="750"] [data-aos].aos-animate{transition-delay:.75s}[data-aos][data-aos][data-aos-duration="800"],body[data-aos-duration="800"] [data-aos]{transition-duration:.8s}[data-aos][data-aos][data-aos-delay="800"],body[data-aos-delay="800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="800"].aos-animate,body[data-aos-delay="800"] [data-aos].aos-animate{transition-delay:.8s}[data-aos][data-aos][data-aos-duration="850"],body[data-aos-duration="850"] [data-aos]{transition-duration:.85s}[data-aos][data-aos][data-aos-delay="850"],body[data-aos-delay="850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="850"].aos-animate,body[data-aos-delay="850"] [data-aos].aos-animate{transition-delay:.85s}[data-aos][data-aos][data-aos-duration="900"],body[data-aos-duration="900"] [data-aos]{transition-duration:.9s}[data-aos][data-aos][data-aos-delay="900"],body[data-aos-delay="900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="900"].aos-animate,body[data-aos-delay="900"] [data-aos].aos-animate{transition-delay:.9s}[data-aos][data-aos][data-aos-duration="950"],body[data-aos-duration="950"] [data-aos]{transition-duration:.95s}[data-aos][data-aos][data-aos-delay="950"],body[data-aos-delay="950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="950"].aos-animate,body[data-aos-delay="950"] [data-aos].aos-animate{transition-delay:.95s}[data-aos][data-aos][data-aos-duration="1000"],body[data-aos-duration="1000"] [data-aos]{transition-duration:1s}[data-aos][data-aos][data-aos-delay="1000"],body[data-aos-delay="1000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1000"].aos-animate,body[data-aos-delay="1000"] [data-aos].aos-animate{transition-delay:1s}[data-aos][data-aos][data-aos-duration="1050"],body[data-aos-duration="1050"] [data-aos]{transition-duration:1.05s}[data-aos][data-aos][data-aos-delay="1050"],body[data-aos-delay="1050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1050"].aos-animate,body[data-aos-delay="1050"] [data-aos].aos-animate{transition-delay:1.05s}[data-aos][data-aos][data-aos-duration="1100"],body[data-aos-duration="1100"] [data-aos]{transition-duration:1.1s}[data-aos][data-aos][data-aos-delay="1100"],body[data-aos-delay="1100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1100"].aos-animate,body[data-aos-delay="1100"] [data-aos].aos-animate{transition-delay:1.1s}[data-aos][data-aos][data-aos-duration="1150"],body[data-aos-duration="1150"] [data-aos]{transition-duration:1.15s}[data-aos][data-aos][data-aos-delay="1150"],body[data-aos-delay="1150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1150"].aos-animate,body[data-aos-delay="1150"] [data-aos].aos-animate{transition-delay:1.15s}[data-aos][data-aos][data-aos-duration="1200"],body[data-aos-duration="1200"] [data-aos]{transition-duration:1.2s}[data-aos][data-aos][data-aos-delay="1200"],body[data-aos-delay="1200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1200"].aos-animate,body[data-aos-delay="1200"] [data-aos].aos-animate{transition-delay:1.2s}[data-aos][data-aos][data-aos-duration="1250"],body[data-aos-duration="1250"] [data-aos]{transition-duration:1.25s}[data-aos][data-aos][data-aos-delay="1250"],body[data-aos-delay="1250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1250"].aos-animate,body[data-aos-delay="1250"] [data-aos].aos-animate{transition-delay:1.25s}[data-aos][data-aos][data-aos-duration="1300"],body[data-aos-duration="1300"] [data-aos]{transition-duration:1.3s}[data-aos][data-aos][data-aos-delay="1300"],body[data-aos-delay="1300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1300"].aos-animate,body[data-aos-delay="1300"] [data-aos].aos-animate{transition-delay:1.3s}[data-aos][data-aos][data-aos-duration="1350"],body[data-aos-duration="1350"] [data-aos]{transition-duration:1.35s}[data-aos][data-aos][data-aos-delay="1350"],body[data-aos-delay="1350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1350"].aos-animate,body[data-aos-delay="1350"] [data-aos].aos-animate{transition-delay:1.35s}[data-aos][data-aos][data-aos-duration="1400"],body[data-aos-duration="1400"] [data-aos]{transition-duration:1.4s}[data-aos][data-aos][data-aos-delay="1400"],body[data-aos-delay="1400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1400"].aos-animate,body[data-aos-delay="1400"] [data-aos].aos-animate{transition-delay:1.4s}[data-aos][data-aos][data-aos-duration="1450"],body[data-aos-duration="1450"] [data-aos]{transition-duration:1.45s}[data-aos][data-aos][data-aos-delay="1450"],body[data-aos-delay="1450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1450"].aos-animate,body[data-aos-delay="1450"] [data-aos].aos-animate{transition-delay:1.45s}[data-aos][data-aos][data-aos-duration="1500"],body[data-aos-duration="1500"] [data-aos]{transition-duration:1.5s}[data-aos][data-aos][data-aos-delay="1500"],body[data-aos-delay="1500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1500"].aos-animate,body[data-aos-delay="1500"] [data-aos].aos-animate{transition-delay:1.5s}[data-aos][data-aos][data-aos-duration="1550"],body[data-aos-duration="1550"] [data-aos]{transition-duration:1.55s}[data-aos][data-aos][data-aos-delay="1550"],body[data-aos-delay="1550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1550"].aos-animate,body[data-aos-delay="1550"] [data-aos].aos-animate{transition-delay:1.55s}[data-aos][data-aos][data-aos-duration="1600"],body[data-aos-duration="1600"] [data-aos]{transition-duration:1.6s}[data-aos][data-aos][data-aos-delay="1600"],body[data-aos-delay="1600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1600"].aos-animate,body[data-aos-delay="1600"] [data-aos].aos-animate{transition-delay:1.6s}[data-aos][data-aos][data-aos-duration="1650"],body[data-aos-duration="1650"] [data-aos]{transition-duration:1.65s}[data-aos][data-aos][data-aos-delay="1650"],body[data-aos-delay="1650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1650"].aos-animate,body[data-aos-delay="1650"] [data-aos].aos-animate{transition-delay:1.65s}[data-aos][data-aos][data-aos-duration="1700"],body[data-aos-duration="1700"] [data-aos]{transition-duration:1.7s}[data-aos][data-aos][data-aos-delay="1700"],body[data-aos-delay="1700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1700"].aos-animate,body[data-aos-delay="1700"] [data-aos].aos-animate{transition-delay:1.7s}[data-aos][data-aos][data-aos-duration="1750"],body[data-aos-duration="1750"] [data-aos]{transition-duration:1.75s}[data-aos][data-aos][data-aos-delay="1750"],body[data-aos-delay="1750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1750"].aos-animate,body[data-aos-delay="1750"] [data-aos].aos-animate{transition-delay:1.75s}[data-aos][data-aos][data-aos-duration="1800"],body[data-aos-duration="1800"] [data-aos]{transition-duration:1.8s}[data-aos][data-aos][data-aos-delay="1800"],body[data-aos-delay="1800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1800"].aos-animate,body[data-aos-delay="1800"] [data-aos].aos-animate{transition-delay:1.8s}[data-aos][data-aos][data-aos-duration="1850"],body[data-aos-duration="1850"] [data-aos]{transition-duration:1.85s}[data-aos][data-aos][data-aos-delay="1850"],body[data-aos-delay="1850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1850"].aos-animate,body[data-aos-delay="1850"] [data-aos].aos-animate{transition-delay:1.85s}[data-aos][data-aos][data-aos-duration="1900"],body[data-aos-duration="1900"] [data-aos]{transition-duration:1.9s}[data-aos][data-aos][data-aos-delay="1900"],body[data-aos-delay="1900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1900"].aos-animate,body[data-aos-delay="1900"] [data-aos].aos-animate{transition-delay:1.9s}[data-aos][data-aos][data-aos-duration="1950"],body[data-aos-duration="1950"] [data-aos]{transition-duration:1.95s}[data-aos][data-aos][data-aos-delay="1950"],body[data-aos-delay="1950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="1950"].aos-animate,body[data-aos-delay="1950"] [data-aos].aos-animate{transition-delay:1.95s}[data-aos][data-aos][data-aos-duration="2000"],body[data-aos-duration="2000"] [data-aos]{transition-duration:2s}[data-aos][data-aos][data-aos-delay="2000"],body[data-aos-delay="2000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2000"].aos-animate,body[data-aos-delay="2000"] [data-aos].aos-animate{transition-delay:2s}[data-aos][data-aos][data-aos-duration="2050"],body[data-aos-duration="2050"] [data-aos]{transition-duration:2.05s}[data-aos][data-aos][data-aos-delay="2050"],body[data-aos-delay="2050"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2050"].aos-animate,body[data-aos-delay="2050"] [data-aos].aos-animate{transition-delay:2.05s}[data-aos][data-aos][data-aos-duration="2100"],body[data-aos-duration="2100"] [data-aos]{transition-duration:2.1s}[data-aos][data-aos][data-aos-delay="2100"],body[data-aos-delay="2100"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2100"].aos-animate,body[data-aos-delay="2100"] [data-aos].aos-animate{transition-delay:2.1s}[data-aos][data-aos][data-aos-duration="2150"],body[data-aos-duration="2150"] [data-aos]{transition-duration:2.15s}[data-aos][data-aos][data-aos-delay="2150"],body[data-aos-delay="2150"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2150"].aos-animate,body[data-aos-delay="2150"] [data-aos].aos-animate{transition-delay:2.15s}[data-aos][data-aos][data-aos-duration="2200"],body[data-aos-duration="2200"] [data-aos]{transition-duration:2.2s}[data-aos][data-aos][data-aos-delay="2200"],body[data-aos-delay="2200"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2200"].aos-animate,body[data-aos-delay="2200"] [data-aos].aos-animate{transition-delay:2.2s}[data-aos][data-aos][data-aos-duration="2250"],body[data-aos-duration="2250"] [data-aos]{transition-duration:2.25s}[data-aos][data-aos][data-aos-delay="2250"],body[data-aos-delay="2250"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2250"].aos-animate,body[data-aos-delay="2250"] [data-aos].aos-animate{transition-delay:2.25s}[data-aos][data-aos][data-aos-duration="2300"],body[data-aos-duration="2300"] [data-aos]{transition-duration:2.3s}[data-aos][data-aos][data-aos-delay="2300"],body[data-aos-delay="2300"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2300"].aos-animate,body[data-aos-delay="2300"] [data-aos].aos-animate{transition-delay:2.3s}[data-aos][data-aos][data-aos-duration="2350"],body[data-aos-duration="2350"] [data-aos]{transition-duration:2.35s}[data-aos][data-aos][data-aos-delay="2350"],body[data-aos-delay="2350"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2350"].aos-animate,body[data-aos-delay="2350"] [data-aos].aos-animate{transition-delay:2.35s}[data-aos][data-aos][data-aos-duration="2400"],body[data-aos-duration="2400"] [data-aos]{transition-duration:2.4s}[data-aos][data-aos][data-aos-delay="2400"],body[data-aos-delay="2400"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2400"].aos-animate,body[data-aos-delay="2400"] [data-aos].aos-animate{transition-delay:2.4s}[data-aos][data-aos][data-aos-duration="2450"],body[data-aos-duration="2450"] [data-aos]{transition-duration:2.45s}[data-aos][data-aos][data-aos-delay="2450"],body[data-aos-delay="2450"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2450"].aos-animate,body[data-aos-delay="2450"] [data-aos].aos-animate{transition-delay:2.45s}[data-aos][data-aos][data-aos-duration="2500"],body[data-aos-duration="2500"] [data-aos]{transition-duration:2.5s}[data-aos][data-aos][data-aos-delay="2500"],body[data-aos-delay="2500"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2500"].aos-animate,body[data-aos-delay="2500"] [data-aos].aos-animate{transition-delay:2.5s}[data-aos][data-aos][data-aos-duration="2550"],body[data-aos-duration="2550"] [data-aos]{transition-duration:2.55s}[data-aos][data-aos][data-aos-delay="2550"],body[data-aos-delay="2550"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2550"].aos-animate,body[data-aos-delay="2550"] [data-aos].aos-animate{transition-delay:2.55s}[data-aos][data-aos][data-aos-duration="2600"],body[data-aos-duration="2600"] [data-aos]{transition-duration:2.6s}[data-aos][data-aos][data-aos-delay="2600"],body[data-aos-delay="2600"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2600"].aos-animate,body[data-aos-delay="2600"] [data-aos].aos-animate{transition-delay:2.6s}[data-aos][data-aos][data-aos-duration="2650"],body[data-aos-duration="2650"] [data-aos]{transition-duration:2.65s}[data-aos][data-aos][data-aos-delay="2650"],body[data-aos-delay="2650"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2650"].aos-animate,body[data-aos-delay="2650"] [data-aos].aos-animate{transition-delay:2.65s}[data-aos][data-aos][data-aos-duration="2700"],body[data-aos-duration="2700"] [data-aos]{transition-duration:2.7s}[data-aos][data-aos][data-aos-delay="2700"],body[data-aos-delay="2700"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2700"].aos-animate,body[data-aos-delay="2700"] [data-aos].aos-animate{transition-delay:2.7s}[data-aos][data-aos][data-aos-duration="2750"],body[data-aos-duration="2750"] [data-aos]{transition-duration:2.75s}[data-aos][data-aos][data-aos-delay="2750"],body[data-aos-delay="2750"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2750"].aos-animate,body[data-aos-delay="2750"] [data-aos].aos-animate{transition-delay:2.75s}[data-aos][data-aos][data-aos-duration="2800"],body[data-aos-duration="2800"] [data-aos]{transition-duration:2.8s}[data-aos][data-aos][data-aos-delay="2800"],body[data-aos-delay="2800"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2800"].aos-animate,body[data-aos-delay="2800"] [data-aos].aos-animate{transition-delay:2.8s}[data-aos][data-aos][data-aos-duration="2850"],body[data-aos-duration="2850"] [data-aos]{transition-duration:2.85s}[data-aos][data-aos][data-aos-delay="2850"],body[data-aos-delay="2850"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2850"].aos-animate,body[data-aos-delay="2850"] [data-aos].aos-animate{transition-delay:2.85s}[data-aos][data-aos][data-aos-duration="2900"],body[data-aos-duration="2900"] [data-aos]{transition-duration:2.9s}[data-aos][data-aos][data-aos-delay="2900"],body[data-aos-delay="2900"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2900"].aos-animate,body[data-aos-delay="2900"] [data-aos].aos-animate{transition-delay:2.9s}[data-aos][data-aos][data-aos-duration="2950"],body[data-aos-duration="2950"] [data-aos]{transition-duration:2.95s}[data-aos][data-aos][data-aos-delay="2950"],body[data-aos-delay="2950"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="2950"].aos-animate,body[data-aos-delay="2950"] [data-aos].aos-animate{transition-delay:2.95s}[data-aos][data-aos][data-aos-duration="3000"],body[data-aos-duration="3000"] [data-aos]{transition-duration:3s}[data-aos][data-aos][data-aos-delay="3000"],body[data-aos-delay="3000"] [data-aos]{transition-delay:0}[data-aos][data-aos][data-aos-delay="3000"].aos-animate,body[data-aos-delay="3000"] [data-aos].aos-animate{transition-delay:3s}[data-aos][data-aos][data-aos-easing=linear],body[data-aos-easing=linear] [data-aos]{transition-timing-function:cubic-bezier(.25,.25,.75,.75)}[data-aos][data-aos][data-aos-easing=ease],body[data-aos-easing=ease] [data-aos]{transition-timing-function:ease}[data-aos][data-aos][data-aos-easing=ease-in],body[data-aos-easing=ease-in] [data-aos]{transition-timing-function:ease-in}[data-aos][data-aos][data-aos-easing=ease-out],body[data-aos-easing=ease-out] [data-aos]{transition-timing-function:ease-out}[data-aos][data-aos][data-aos-easing=ease-in-out],body[data-aos-easing=ease-in-out] [data-aos]{transition-timing-function:ease-in-out}[data-aos][data-aos][data-aos-easing=ease-in-back],body[data-aos-easing=ease-in-back] [data-aos]{transition-timing-function:cubic-bezier(.6,-.28,.735,.045)}[data-aos][data-aos][data-aos-easing=ease-out-back],body[data-aos-easing=ease-out-back] [data-aos]{transition-timing-function:cubic-bezier(.175,.885,.32,1.275)}[data-aos][data-aos][data-aos-easing=ease-in-out-back],body[data-aos-easing=ease-in-out-back] [data-aos]{transition-timing-function:cubic-bezier(.68,-.55,.265,1.55)}[data-aos][data-aos][data-aos-easing=ease-in-sine],body[data-aos-easing=ease-in-sine] [data-aos]{transition-timing-function:cubic-bezier(.47,0,.745,.715)}[data-aos][data-aos][data-aos-easing=ease-out-sine],body[data-aos-easing=ease-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.39,.575,.565,1)}[data-aos][data-aos][data-aos-easing=ease-in-out-sine],body[data-aos-easing=ease-in-out-sine] [data-aos]{transition-timing-function:cubic-bezier(.445,.05,.55,.95)}[data-aos][data-aos][data-aos-easing=ease-in-quad],body[data-aos-easing=ease-in-quad] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quad],body[data-aos-easing=ease-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quad],body[data-aos-easing=ease-in-out-quad] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-cubic],body[data-aos-easing=ease-in-cubic] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-cubic],body[data-aos-easing=ease-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-cubic],body[data-aos-easing=ease-in-out-cubic] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos][data-aos][data-aos-easing=ease-in-quart],body[data-aos-easing=ease-in-quart] [data-aos]{transition-timing-function:cubic-bezier(.55,.085,.68,.53)}[data-aos][data-aos][data-aos-easing=ease-out-quart],body[data-aos-easing=ease-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.25,.46,.45,.94)}[data-aos][data-aos][data-aos-easing=ease-in-out-quart],body[data-aos-easing=ease-in-out-quart] [data-aos]{transition-timing-function:cubic-bezier(.455,.03,.515,.955)}[data-aos^=fade][data-aos^=fade]{opacity:0;transition-property:opacity,transform}[data-aos^=fade][data-aos^=fade].aos-animate{opacity:1;transform:translateZ(0)}[data-aos=fade-up]{transform:translate3d(0,100px,0)}[data-aos=fade-down]{transform:translate3d(0,-100px,0)}[data-aos=fade-right]{transform:translate3d(-100px,0,0)}[data-aos=fade-left]{transform:translate3d(100px,0,0)}[data-aos=fade-up-right]{transform:translate3d(-100px,100px,0)}[data-aos=fade-up-left]{transform:translate3d(100px,100px,0)}[data-aos=fade-down-right]{transform:translate3d(-100px,-100px,0)}[data-aos=fade-down-left]{transform:translate3d(100px,-100px,0)}[data-aos^=zoom][data-aos^=zoom]{opacity:0;transition-property:opacity,transform}[data-aos^=zoom][data-aos^=zoom].aos-animate{opacity:1;transform:translateZ(0) scale(1)}[data-aos=zoom-in]{transform:scale(.6)}[data-aos=zoom-in-up]{transform:translate3d(0,100px,0) scale(.6)}[data-aos=zoom-in-down]{transform:translate3d(0,-100px,0) scale(.6)}[data-aos=zoom-in-right]{transform:translate3d(-100px,0,0) scale(.6)}[data-aos=zoom-in-left]{transform:translate3d(100px,0,0) scale(.6)}[data-aos=zoom-out]{transform:scale(1.2)}[data-aos=zoom-out-up]{transform:translate3d(0,100px,0) scale(1.2)}[data-aos=zoom-out-down]{transform:translate3d(0,-100px,0) scale(1.2)}[data-aos=zoom-out-right]{transform:translate3d(-100px,0,0) scale(1.2)}[data-aos=zoom-out-left]{transform:translate3d(100px,0,0) scale(1.2)}[data-aos^=slide][data-aos^=slide]{transition-property:transform}[data-aos^=slide][data-aos^=slide].aos-animate{transform:translateZ(0)}[data-aos=slide-up]{transform:translate3d(0,100%,0)}[data-aos=slide-down]{transform:translate3d(0,-100%,0)}[data-aos=slide-right]{transform:translate3d(-100%,0,0)}[data-aos=slide-left]{transform:translate3d(100%,0,0)}[data-aos^=flip][data-aos^=flip]{backface-visibility:hidden;transition-property:transform}[data-aos=flip-left]{transform:perspective(2500px) rotateY(-100deg)}[data-aos=flip-left].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-right]{transform:perspective(2500px) rotateY(100deg)}[data-aos=flip-right].aos-animate{transform:perspective(2500px) rotateY(0)}[data-aos=flip-up]{transform:perspective(2500px) rotateX(-100deg)}[data-aos=flip-up].aos-animate{transform:perspective(2500px) rotateX(0)}[data-aos=flip-down]{transform:perspective(2500px) rotateX(100deg)}[data-aos=flip-down].aos-animate{transform:perspective(2500px) rotateX(0)} ================================================ FILE: static/cms/static/css/gordita-fonts.css ================================================ @font-face{font-family:'Gordita';font-style:normal;font-weight:300;src:local('Gordita'),url('../fonts/gordita-light.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:300;src:local('Gordita-light-italic'),url('../fonts/gordita-light-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:400;src:local('Gordita-thin'),url('../fonts/gordita-thin.woff') format('woff')}@font-face{font-family:'Gordita Thin';font-style:italic;font-weight:400;src:local('Gordita Thin Italic'),url('../fonts/gordita-thin-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:500;src:local('Gordita-regular'),url('../fonts/gordita-regular.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:500;src:local('Gordita Regular Italic'),url('../fonts/gordita-regular-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:600;src:local('Gordita-medium'),url('../fonts/gordita-medium.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:600;src:local('Gordita-medium-italic'),url('../fonts/gordita-medium-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:700;src:local('Gorditabold'),url('../fonts/gordita-bold.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:700;src:local('Gordita-bold-italic'),url('../fonts/gordita-bold-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:800;src:local('Gordita-black'),url('../fonts/gordita-black.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:800;src:local('Gordita-black-italic'),url('../fonts/gordita-black-italic.woff') format('woff')}@font-face{font-family:'Gordita';font-style:normal;font-weight:900;src:local('Gordita-ultra'),url('../fonts/gordita-ultra.woff') format('woff')}@font-face{font-family:'Gordita';font-style:italic;font-weight:900;src:local('Gordita-ultra-italic'),url('../fonts/gordita-ultra-italic.woff') format('woff')} ================================================ FILE: static/cms/static/css/style.css ================================================ @charset "UTF-8";*,*::after,*::before{-webkit-box-sizing:border-box;box-sizing:border-box}html,body{height:100%}body{line-height:1.74;font-size:15px;font-style:normal;font-weight:500;visibility:visible;font-family:"Gordita";color:#333;position:relative;background-color:#fff}body.no-overflow{overflow:hidden}h1,h2,h3,h4,h5,h6{color:#000;font-family:"Gordita";font-weight:600;margin-top:0;margin-bottom:0;line-height:1.41}h1{font-size:56px}@media only screen and (min-width:992px) and (max-width:1199px){h1{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){h1{font-size:40px}}@media only screen and (max-width:767px){h1{font-size:34px}}h2{font-size:38px}@media only screen and (min-width:992px) and (max-width:1199px){h2{font-size:32px}}@media only screen and (min-width:768px) and (max-width:991px){h2{font-size:30px}}@media only screen and (max-width:767px){h2{font-size:26px}}h3{font-size:24px}@media only screen and (min-width:992px) and (max-width:1199px){h3{font-size:22px}}@media only screen and (min-width:768px) and (max-width:991px){h3{font-size:20px}}@media only screen and (max-width:767px){h3{font-size:20px}}h4{font-size:20px}@media only screen and (min-width:992px) and (max-width:1199px){h4{font-size:18px}}@media only screen and (min-width:768px) and (max-width:991px){h4{font-size:18px}}@media only screen and (max-width:767px){h4{font-size:18px}}h5{font-size:18px}@media only screen and (max-width:767px){h5{font-size:16px}}h6{font-size:16px}p:last-child{margin-bottom:0}a,button{color:inherit;display:inline-block;line-height:inherit;text-decoration:none;cursor:pointer}a,button,img,input{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}*:focus{outline:none!important}a:focus{color:inherit;outline:0;text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}a:hover{text-decoration:none;color:#ffc4a0}.theme-color-two a:hover{color:#ffc4a0}.theme-color-three a:hover{color:#a50eff}.theme-color-four a:hover{color:#5974ff}.theme-color-five a:hover{color:#5138ee}.theme-color-six a:hover{color:#5138ee}button,input[type="submit"]{cursor:pointer}ul{list-style:outside none none;margin:0;padding:0}.form-messege.success,.form-messege-2.success{color:green}.form-messege.error,.form-messege-2.error{color:red}.mark,mark{padding:0;background-color:transparent}.font-weight--bold{font-weight:800}.font-weight--reguler{font-weight:500}.font-weight--normal{font-weight:400}.font-weight--light{font-weight:300}.text-color-primary{color:#ffc4a0}.text-color-secondary{color:#f9c322}.text-black{color:#000!important}.bg-gray{background-color:#edf0f8}.bg-gray-1{background-color:#fafafa}.bg-gray-2{background-color:#f8f8f8}.bg-gradient{background:-webkit-linear-gradient(top,#FFF 0,#F5F5F5 100%)}select{padding:3px 20px;height:56px;max-width:100%;width:100%;outline:0;border:1px solid #f8f8f8;border-radius:5px;background:#f8f8f8 url("../images/selector-icon.png") no-repeat center right 20px;background-color:#f8f8f8;-moz-appearance:none;-webkit-appearance:none}select:focus{background:#f8f8f8 url("../images/selector-icon.png") no-repeat center right 20px!important}.fixed-bg{background-size:cover;background-repeat:no-repeat;background-attachment:fixed}.text-black{color:#333}.box-shadow-top{-webkit-box-shadow:0 10px 15px rgba(0,0,0,0.05);box-shadow:0 10px 15px rgba(0,0,0,0.05)}.border{border:1px solid #ededed!important}.border-top{border-top:1px solid #ededed!important}.border-right{border-right:1px solid #ededed!important}.border-bottom{border-bottom:1px solid #ededed!important}.border-left{border-left:1px solid #ededed!important}.border-top-dash{border-top:1px dashed #ddd!important}.border-bottom-dash{border-bottom:1px dashed #ddd!important}.border-top-thick{border-top:2px solid #ededed!important}.border-bottom-thick{border-bottom:2px solid #ededed!important}.border-top-drak{border-top:1px solid rgba(255,255,255,0.2)!important}.border-bottom-drak{border-bottom:1px solid rgba(255,255,255,0.2)!important}img{max-width:100%}.img-width{width:100%}::-moz-selection{color:#fff;background-color:#ffc4a0}::selection{color:#fff;background-color:#ffc4a0}form input:focus::-webkit-input-placeholder{color:transparent}form input:focus:-moz-placeholder{color:transparent}form input:focus::-moz-placeholder{color:transparent}form input:focus:-ms-input-placeholder{color:transparent}form input,form textarea{font-weight:500}form input::-webkit-input-placeholder,form textarea::-webkit-input-placeholder{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::-moz-placeholder,form textarea::-moz-placeholder{-moz-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input:-ms-input-placeholder,form textarea:-ms-input-placeholder{-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::-ms-input-placeholder,form textarea::-ms-input-placeholder{-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}form input::placeholder,form textarea::placeholder{-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}input[type="text"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="password"]:focus,input[type="search"]:focus,input[type="number"]:focus,input[type="tel"]:focus,input[type="range"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="color"]:focus,textarea:focus,select:focus,select:focus,textarea:focus{color:#ffc4a0;border-color:#ffc4a0}input[type="checkbox"]{position:relative;background:0;border-width:0;-webkit-box-shadow:none;box-shadow:none;margin:0 10px 0 3px;cursor:pointer}.navigation-button{height:40px;width:40px;text-align:center;line-height:38px;background-color:#f4f4f4;font-size:24px;border-radius:50000px;display:inline-block;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-button:hover{background-color:#ffc4a0;color:#fff}.navigation-button:last-child{margin-left:10px}.scroll-top{position:fixed;right:30px;bottom:-60px;z-index:999;-webkit-box-shadow:0 30px 50px rgba(0,0,0,0.03);box-shadow:0 30px 50px rgba(0,0,0,0.03);display:block;padding:0;width:60px;height:60px;border-radius:50%;text-align:center;font-size:25px;line-height:60px;cursor:pointer;opacity:0;visibility:hidden;background-color:#ffc4a0;background-size:200% auto;background-position:left center;color:#fff;-webkit-transition:all .5s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .5s cubic-bezier(0.645,0.045,0.355,1);transition:all .5s cubic-bezier(0.645,0.045,0.355,1);overflow:hidden}@media only screen and (max-width:479px){.scroll-top{width:50px;height:50px;line-height:50px;font-size:20px}}.scroll-top.show{visibility:visible;opacity:1;bottom:60px}.scroll-top i{position:absolute;top:50%;left:50%;color:#fff;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.scroll-top .arrow-top{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.scroll-top .arrow-bottom{-webkit-transform:translate(-50%,80px);-ms-transform:translate(-50%,80px);transform:translate(-50%,80px)}.scroll-top:hover{background-position:right center}.scroll-top:hover .arrow-top{-webkit-transform:translate(-50%,-80px);-ms-transform:translate(-50%,-80px);transform:translate(-50%,-80px)}.scroll-top:hover .arrow-bottom{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.section-space--pt_150{padding-top:150px}@media only screen and (min-width:992px) and (max-width:1199px){.section-space--pt_150{padding-top:100px}}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_150{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_150{padding-top:60px}}.section-space--ptb_120{padding-top:120px;padding-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_120{padding-top:80px;padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--ptb_120{padding-top:60px;padding-bottom:60px}}.section-space--pt_120{padding-top:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_120{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_120{padding-top:60px}}.section-space--pb_120{padding-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_120{padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--pb_120{padding-bottom:60px}}.section-space--ptb_100{padding-top:100px;padding-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_100{padding-top:80px;padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--ptb_100{padding-top:60px;padding-bottom:60px}}.section-space--pt_100{padding-top:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_100{padding-top:80px}}@media only screen and (max-width:767px){.section-space--pt_100{padding-top:60px}}.section-space--pb_100{padding-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_100{padding-bottom:80px}}@media only screen and (max-width:767px){.section-space--pb_100{padding-bottom:60px}}.section-space--ptb_90{padding-top:90px;padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_90{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_90{padding-top:40px;padding-bottom:40px}}.section-space--pt_90{padding-top:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_90{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_90{padding-top:40px}}.section-space--pb_90{padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_90{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_90{padding-bottom:40px}}.section-space--ptb_80{padding-top:80px;padding-bottom:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_80{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_80{padding-top:40px;padding-bottom:40px}}.section-space--pt_80{padding-top:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_80{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_80{padding-top:40px}}.section-space--pb_80{padding-bottom:90px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_80{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_80{padding-bottom:40px}}.section-space--ptb_70{padding-top:70px;padding-bottom:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_70{padding-top:40px;padding-bottom:40px}}@media only screen and (max-width:767px){.section-space--ptb_70{padding-top:30px;padding-bottom:30px}}.section-space--pt_70{padding-top:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_70{padding-top:40px}}@media only screen and (max-width:767px){.section-space--pt_70{padding-top:30px}}.section-space--pb_70{padding-bottom:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_70{padding-bottom:40px}}@media only screen and (max-width:767px){.section-space--pb_70{padding-bottom:30px}}.section-space--ptb_60{padding-top:60px;padding-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--ptb_60{padding-top:60px;padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--ptb_60{padding-top:60px;padding-bottom:60px}}.section-space--pt_60{padding-top:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_60{padding-top:60px}}@media only screen and (max-width:767px){.section-space--pt_60{padding-top:60px}}.section-space--pb_60{padding-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_60{padding-bottom:60px}}@media only screen and (max-width:767px){.section-space--pb_60{padding-bottom:60px}}.section-space--pt_40{padding-top:40px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pt_40{padding-top:30px}}@media only screen and (max-width:767px){.section-space--pt_40{padding-top:30px}}.section-space--pb_40{padding-bottom:40px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--pb_40{padding-bottom:30px}}@media only screen and (max-width:767px){.section-space--pb_40{padding-bottom:30px}}.section-space--ptb_30{padding-top:30px;padding-bottom:30px}.section-space--pt_30{padding-top:30px}.section-space--pb_30{padding-bottom:30px}.section-space--mt_15{margin-top:15px}.section-space--mt_20{margin-top:20px}.section-space--mt_30{margin-top:30px}.section-space--mt_40{margin-top:40px}.section-space--mt_50{margin-top:50px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_50{margin-top:40px}}@media only screen and (max-width:767px){.section-space--mt_50{margin-top:30px}}.section-space--mt_60{margin-top:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_60{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_60{margin-top:30px}}.section-space--mt_70{margin-top:70px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_70{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_70{margin-top:30px}}.section-space--mt_80{margin-top:80px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_80{margin-top:50px}}@media only screen and (max-width:767px){.section-space--mt_80{margin-top:30px}}.section-space--mt_100{margin-top:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_100{margin-top:80px}}@media only screen and (max-width:767px){.section-space--mt_100{margin-top:60px}}.section-space--mt_120{margin-top:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mt_120{margin-top:80px}}@media only screen and (max-width:767px){.section-space--mt_120{margin-top:60px}}.section-space--mb_15{margin-bottom:15px}.section-space--mb_20{margin-bottom:20px}.section-space--mb_30{margin-bottom:30px}.section-space--mb_40{margin-bottom:40px}@media only screen and (max-width:767px){.section-space--mb_40{margin-bottom:30px}}.section-space--mb_50{margin-bottom:50px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_50{margin-bottom:40px}}@media only screen and (max-width:767px){.section-space--mb_50{margin-bottom:30px}}.section-space--mb_60{margin-bottom:60px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_60{margin-bottom:50px}}@media only screen and (max-width:767px){.section-space--mb_60{margin-bottom:30px}}.section-space--mb_100{margin-bottom:100px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_100{margin-bottom:80px}}@media only screen and (max-width:767px){.section-space--mb_100{margin-bottom:60px}}.section-space--mb_120{margin-bottom:120px}@media only screen and (min-width:768px) and (max-width:991px){.section-space--mb_120{margin-bottom:80px}}@media only screen and (max-width:767px){.section-space--mb_120{margin-bottom:60px}}.mb-10{margin-bottom:10px}.mb-15{margin-bottom:15px}.mb-20{margin-bottom:20px}.mb-25{margin-bottom:25px}.mb-30{margin-bottom:30px}.mb-40{margin-bottom:40px}.mt-10{margin-top:10px}.mt-15{margin-top:15px}.mt-20{margin-top:20px}.mt-25{margin-top:25px}.mt-30{margin-top:30px}.mt-40{margin-top:40px}@media only screen and (max-width:767px){.small-mt__0{margin-top:0}.small-mt__10{margin-top:10px}.small-mt__20{margin-top:20px}.small-mt__30{margin-top:30px}.small-mt__40{margin-top:40px}.small-mt__50{margin-top:50px}.small-mt__60{margin-top:60px}.small-mb__30{margin-bottom:30px}.small-mb__40{margin-bottom:40px}.small-mb__50{margin-bottom:50px}.small-mb__60{margin-bottom:60px}}@media only screen and (min-width:768px) and (max-width:991px){.tablet-mt__0{margin-top:0}.tablet-mt__30{margin-top:30px}.tablet-mt__40{margin-top:40px}.tablet-mt__50{margin-top:50px}.tablet-mt__60{margin-top:60px}.tablet-mb__30{margin-bottom:30px}.tablet-mb__40{margin-bottom:40px}.tablet-mb__50{margin-bottom:50px}.tablet-mb__60{margin-bottom:60px}}@media(min-width:1200px){.container{max-width:1200px}}.container-custom-xl{max-width:1540px;width:100%}@media only screen and (min-width:1200px) and (max-width:1499px){.container-custom-xl{max-width:100%}}@media only screen and (min-width:992px) and (max-width:1199px){.container-custom-xl{max-width:100%;width:100%}}.container-custom-150{padding-right:115px;padding-left:115px}@media only screen and (min-width:1200px) and (max-width:1499px){.container-custom-150{padding-right:50px;padding-left:50px}}@media only screen and (min-width:992px) and (max-width:1199px){.container-custom-150{padding-right:15px;padding-left:15px}}@media only screen and (min-width:768px) and (max-width:991px){.container-custom-150{padding-right:15px;padding-left:15px}}@media only screen and (max-width:767px){.container-custom-150{padding-right:15px;padding-left:15px}}.row--35{margin-left:-35px;margin-right:-35px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--35{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--35{margin-left:-15px!important;margin-right:-15px!important}}.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:35px;padding-right:35px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--35>[class*="col"],.row--35>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}.row--30{margin-left:-30px;margin-right:-30px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--30{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--30{margin-left:-12px!important;margin-right:-12px!important}}.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:30px;padding-right:30px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--30>[class*="col"],.row--30>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}.row--17{margin-left:-17px;margin-right:-17px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--17{margin-left:-17px;margin-right:-17px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--17{margin-left:-15px;margin-right:-15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--17{margin-left:-15px;margin-right:-15px}}@media only screen and (max-width:767px){.row--17{margin-left:-15px!important;margin-right:-15px!important}}.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:17px;padding-right:17px}@media only screen and (min-width:1200px) and (max-width:1499px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px;padding-right:15px}}@media only screen and (min-width:768px) and (max-width:991px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}@media only screen and (max-width:767px){.row--17>[class*="col"],.row--17>[class*="col-"]{padding-left:15px!important;padding-right:15px!important}}.row--10{margin-left:-10px;margin-right:-10px}@media only screen and (min-width:992px) and (max-width:1199px){.row--10{margin-left:-10px;margin-right:-10px}}@media only screen and (min-width:768px) and (max-width:991px){.row--10{margin-left:-10px;margin-right:-10px}}@media only screen and (max-width:767px){.row--10{margin-left:-10px!important;margin-right:-10px!important}}.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px;padding-right:10px}@media only screen and (min-width:992px) and (max-width:1199px){.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px;padding-right:10px}}@media only screen and (min-width:768px) and (max-width:991px){.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px!important;padding-right:10px!important}}@media only screen and (max-width:767px){.row--10>[class*="col"],.row--10>[class*="col-"]{padding-left:10px!important;padding-right:10px!important}}.section-title-two{position:relative;margin-bottom:40px}.section-title-two::after{background-color:#e3e3e3;content:"";left:0;top:50%;position:absolute;height:1px;width:100%}.section-title-two h2{color:#0f034a;background:#fff;display:inline-block;position:relative;z-index:1}.section-title-two h2::after{background-color:#fff;content:"";right:-50px;left:auto;top:50%;position:absolute;height:90%;width:50px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.section-title-two h2::before{background-color:#fff;content:"";left:-50px;right:auto;top:50%;position:absolute;height:90%;width:50px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.section-title-three .title{color:#0f034a}.sub-title-four{color:#5974ff}.breadcrumb-area{background-color:#fafafa;padding:80px 0}.breadcrumb-list{padding:10px 20px;background-color:#ffebdf;display:inline-block;border-radius:15px}.breadcrumb-list li{display:inline-block}.breadcrumb-item+.breadcrumb-item{padding-left:1.5rem;position:relative}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.1rem;color:#222;content:'';height:6px;width:6px;background:#222;border-radius:5000px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);position:absolute;left:8px}.btn{height:50px;line-height:48px;padding:0 30px;font-weight:500;border-radius:15px}.btn:hover{background-color:#ffc4a0}.btn i{margin-left:10px;font-size:22px}.btn-primary{background:#ffc4a0;font-weight:500;border-radius:10px;color:#fff;border:0}.btn-primary:focus{outline:none!important}.btn-primary:hover,.btn-primary:focus{background:#d4966f;color:#fff;-webkit-box-shadow:none;box-shadow:none}.btn-primary i{margin-left:10px;font-size:22px}.btn-bg-2{background-color:#ff7d6b;color:#fff}.btn-bg-3{background-color:#a50eff;color:#fff}.btn-bg-4{background-color:#5974ff;color:#fff}.btn-bg-5{background-color:#fed74b;color:#000}.btn-bg-5-primary{background-color:#5138ee;color:#fff}.btn-bg-5-primary:hover{color:#222}.btn-bg-6{background-color:#5138ee;color:#fff}.btn-bg-white{background-color:#fff;color:#0f034a}.btn-primary-three{padding:0 30px;background:#f4eaff;font-weight:600;border-radius:10px;color:#0f034a;border:0}.btn-primary-three:focus{outline:none!important}.btn-primary-three:hover,.btn-primary-three:focus{background:#a50eff;color:#fff!important;-webkit-box-shadow:none;box-shadow:none}.btn-primary-three i{margin-left:15px;font-size:22px}.btn-primary-four{padding:0 30px;background:#edf0f8;font-weight:600;border-radius:10px;color:#081131;border:0}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.btn-primary-four{padding:0 20px}}.btn-primary-four:focus{outline:none!important}.btn-primary-four:hover,.btn-primary-four:focus{background:#5974ff;color:#fff!important;-webkit-box-shadow:none;box-shadow:none}.btn-primary-four i{margin-left:15px;font-size:22px}.btn-outline-2{border:2px solid #ddd;border-radius:10px;color:#fff;padding-bottom:2px;color:#ff7d6b}.btn-outline-2:hover{color:#fff;border:2px solid #ff7d6b;background-color:#ff7d6b}.btn-large{padding:0 30px;height:60px;line-height:60px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.btn-large{padding:0 20px}}.btn-medium{height:50px;line-height:50px;padding:0 20px}.woocommerce{background-color:#fff1dc;color:#d59a46;border-radius:15px}.woocommerce:hover{background-color:#d59a46;color:#fff}.wordpress{background-color:#e0f9f6;color:#3ac8bd;border-radius:15px}.wordpress:hover{background-color:#3ac8bd;color:#fff}.magento{background-color:#fbefef;color:#b36262;border-radius:15px}.magento:hover{background-color:#b36262;color:#fff}.laravel{background-color:#9c8bda;color:#fff;border-radius:15px}.laravel:hover{background-color:#9c8bda;color:#fff}.ux-design{background-color:#e8f7e0;color:#8cad78;border-radius:15px}.ux-design:hover{background-color:#8cad78;color:#fff}.online-tutorial{background-color:#e3f0ff;color:#7f9cbf;border-radius:15px}.online-tutorial:hover{background-color:#7f9cbf;color:#fff}.marketing{background-color:#fdf0e8;color:#c49076;border-radius:15px}.marketing:hover{background-color:#c49076;color:#fff}.javaScript{background-color:#ffe7da;color:#fe8e4b;border-radius:15px}.javaScript:hover{background-color:#fe8e4b;color:#fff}.lifestyle{background-color:#e1fae3;color:#1f9a39;border-radius:15px}.lifestyle:hover{background-color:#1f9a39;color:#fff}.fashion{background-color:#ffebdf;border-radius:15px}.fashion:hover{color:#fff;background-color:#f3d6c5}.health{background-color:#dcf1ff;border-radius:15px}.travel{background-color:#ffe6af;border-radius:15px}.business{background-color:#e1f3ff;border-radius:15px}.food{background-color:#f9e7a0;border-radius:15px}.lifesytle{background-color:#ffebde;border-radius:15px}.tech{background-color:#ffebdf;border-radius:15px}.tech:hover{color:#222}.marketing{background-color:#fce7e7;border-radius:15px;color:#222}.marketing:hover{color:#222}.doctor{background-color:#e6f9ed;border-radius:15px;color:#222}.doctor:hover{color:#222}.health{background-color:#eaf6fd;border-radius:15px;color:#222}.health:hover{color:#222}.single-testimonial-item,.single-testimonial-item-two{padding:30px 35px 60px;background-color:#fff;border-radius:15px;position:relative;margin-top:40px}.single-testimonial-item::after,.single-testimonial-item-two::after{position:absolute;right:35px;bottom:20px;content:'';background:url("../images/quote.png");background-repeat:no-repeat;height:40px;width:52px}.single-testimonial-item-two::after{background:url("../images/quote-2.png");background-repeat:no-repeat}.single-testimonial-item-two .testimonial-author-info p{color:#ffc4a0}.testimonial-post-author{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-bottom:30px;border-bottom:1px solid #ddd;margin-bottom:30px}.testimonial-author-image{width:70px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-right:20px}.testimonial-author-image img{border-radius:50%;}.testimonial-author-info p{margin-top:10px;color:#5974ff;font-size:11px}.testimonial-post-content .testimonial-post-title{margin-bottom:25px;line-height:1.6}.testimonial-post-content p{font-size:14px;line-height:2}.testimonial-slider-navigation,.testimonial-slider-navigation-two{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:50px}.testimonial-slider-navigation .navigation-button,.testimonial-slider-navigation-two .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #5974ff;text-align:center;font-size:25px;border-radius:10px;color:#5974ff;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background-color:transparent;margin:10px}.testimonial-slider-navigation .navigation-button:hover,.testimonial-slider-navigation-two .navigation-button:hover{border:2px solid #5974ff;background-color:#5974ff;color:#fff}.testimonial-slider-navigation-two .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #ffc4a0;text-align:center;font-size:25px;border-radius:500000px;color:#fff;background-color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;margin:10px}.testimonial-slider-navigation-two .navigation-button:hover{border:2px solid #222;background-color:#222;color:#fff}.single-popup-wrap{position:relative}.single-popup-wrap img{width:100%}.video-link{-webkit-transition:all .3s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .3s cubic-bezier(0.645,0.045,0.355,1);transition:all .3s cubic-bezier(0.645,0.045,0.355,1);display:block}.video-link .ht-popup-video.video-overlay{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:rgba(8,106,216,0.8)}.video-link .ht-popup-video.video-button{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.video-link .ht-popup-video.video-button .video-mark{position:absolute;top:50%;left:50%;-webkit-transform:translateY(-50%,-50%);-ms-transform:translateY(-50%,-50%);transform:translateY(-50%,-50%);pointer-events:none}.video-link .ht-popup-video.video-button .video-mark .wave-pulse{width:1px;height:0;margin:0 auto}.video-link .ht-popup-video.video-button .video-mark .wave-pulse::after,.video-link .ht-popup-video.video-button .video-mark .wave-pulse::before{opacity:0;content:'';display:block;position:absolute;width:200px;height:200px;top:50%;left:50%;border-radius:50%;border:3px solid #ffc4a0;-webkit-animation:zoomBig 3.25s linear infinite;animation:zoomBig 3.25s linear infinite;-webkit-animation-delay:0s;animation-delay:0s}.video-link .ht-popup-video.video-button .video-mark .wave-pulse::before{-webkit-animation-delay:.75s;animation-delay:.75s}.video-link .ht-popup-video .video-button{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.video-link .ht-popup-video .video-button__one{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.video-link .ht-popup-video .video-button__one .video-play{width:72px;height:72px;background:transparent;border:6px solid #fff;border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important}.video-link .ht-popup-video .video-button__one .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__one .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:11px solid transparent;border-bottom:11px solid transparent;border-left:17px solid #fff}.video-link .ht-popup-video .video-button__two{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.video-link .ht-popup-video .video-button__two .video-play{width:78px;height:78px;background:#ffc4a0;border:3px solid #fff;-webkit-box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important;-webkit-box-shadow:0 20px 30px rgba(0,0,0,0.07);box-shadow:0 20px 30px rgba(0,0,0,0.07)}.video-link .ht-popup-video .video-button__two .video-play-sm{width:58px;height:58px;background:#ffc4a0;border:3px solid #fff;-webkit-box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);box-shadow:0 2px 41px 0 rgba(91,99,254,0.36);border-radius:50%;-webkit-transition:all 1s cubic-bezier(0,0,0.2,1)!important;-o-transition:all 1s cubic-bezier(0,0,0.2,1)!important;transition:all 1s cubic-bezier(0,0,0.2,1)!important;-webkit-box-shadow:0 20px 30px rgba(0,0,0,0.07);box-shadow:0 20px 30px rgba(0,0,0,0.07)}.video-link .ht-popup-video .video-button__two .video-play-sm .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__two .video-play-sm .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:9px solid transparent;border-bottom:9px solid transparent;border-left:12px solid #fff;border-top-width:8px;border-bottom-width:9px;border-left-width:15px;border-left-color:#fff}.video-link .ht-popup-video .video-button__two .video-play-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);line-height:1;margin-left:1px}.video-link .ht-popup-video .video-button__two .video-play-icon::before{content:'';position:absolute;top:0;left:0;width:0;height:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-top:11px solid transparent;border-bottom:11px solid transparent;border-left:17px solid #fff;border-top-width:12px;border-bottom-width:12px;border-left-width:19px;border-left-color:#fff}.video-link:hover .video-play,.video-link:hover .video-play-sm{-webkit-transform:scale3d(1.15,1.15,1.15);transform:scale3d(1.15,1.15,1.15)}@-webkit-keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}@keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}@keyframes zoomBig{0%{-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);opacity:1;border-width:3px}40%{opacity:.5;border-width:2px}65%{border-width:1px}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);opacity:0;border-width:1px}}.header-sticky.is-sticky{position:fixed;top:0;left:0;width:100%;-webkit-animation:.95s ease-in-out 0s normal none 1 running fadeInDown;animation:.95s ease-in-out 0s normal none 1 running fadeInDown;z-index:999;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-box-shadow:0 8px 20px 0 rgba(0,0,0,0.1);box-shadow:0 8px 20px 0 rgba(0,0,0,0.1);background-color:#fff}.position--absolute{position: absolute;width:100%;z-index:5}.mobile-menu-right{margin-right:0;float:right}.header-top-area{background-color:#22262a;padding-bottom:10px}.header-top-menu-list{margin-top:10px}.header-top-menu-list li{display:inline-block;padding-right:20px;margin-right:15px;position:relative}.header-top-menu-list li::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#ffc4a0;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.header-top-menu-list li a{color:#fff}.header-top-menu-list li a:hover{color:#ffc4a0}.header-top-menu-list li:last-child{padding-right:0;margin-right:0}.header-top-menu-list li:last-child::after{display:none}@media only screen and (max-width:575px){.header-top-menu-list{text-align:center}}.header-top-contact-info{margin-top:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.header-top-single-contact-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#fff;margin:0 30px}.header-top-single-contact-item:first-child{margin-left:0}.header-top-single-contact-item:last-child{margin-right:0}.header-top-single-contact-item .text-size-small{font-size:12px}@media only screen and (max-width:575px){.header-top-single-contact-item{margin:0 5px;font-size:13px}}.header-top-contact-icon{margin-right:15px}@media only screen and (max-width:575px){.header-top-contact-icon{margin-right:5px}}.header-top-right-side{margin-top:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;color:#ffc4a0}.header-top-right-side p{margin-bottom:0}.header-top-right-side .wayder-icon{margin:0 10px}@media only screen and (max-width:575px){.header-top-right-side{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}.header-mid-area{margin-top:20px;border-bottom:1px solid #f3f3f3;padding-bottom:20px}.header-mid-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-action-item{height:45px;min-width:45px;background:#f4f4f4;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:20px;border-radius:5px}.single-action-item:hover{background:#ffc4a0}.single-action-item:first-child{margin-left:0}@media only screen and (min-width:992px) and (max-width:1199px){.single-action-item{height:40px;min-width:40px;margin-left:12px}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.single-action-item{height:40px;min-width:40px;margin-left:7px}}.header-add-banner{position:relative}.header-add-banner a{display:block}.header-add-text{font-size:15px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:50px;display:inline-block}.header-add-text span{display:block;font-size:18px;text-align:left;margin-top:3px;font-weight:bold}.social-share-area li{display:inline-block;margin-right:15px}.social-share-area li:last-child{margin-right:0}.social-share-area li a{height:45px;width:45px;line-height:45px;text-align:center;background-color:#ddd;border-radius:5px}.social-share-area li a:hover{background-color:#ffc4a0;color:#fff}@media only screen and (max-width:767px){.social-share-area li{margin-right:10px}}@media only screen and (max-width:575px){.social-share-area li{margin-right:6px}}.social-share-area.social-share-border-outline li a{background-color:transparent;border-radius:15px;border:1px solid #fff;color:#fff}.social-share-area.social-share-border-outline li a:hover{background:#fff;color:#222}.social-share-area.social-share-normal a{height:auto;width:auto;line-height:auto;padding:0;border:0;background-color:transparent}.social-share-area.social-share-normal a:hover{background-color:transparent;color:#5138ee}.new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:0}.header-two{border-bottom:1px solid rgba(255,255,255,0.15)}.header-two .header-bottom-area{height:80px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex; background: #252c63;}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-two .header-bottom-area{height:auto}}.header-two-right-side{margin:15px 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.header-two-right-side .single-action-item{position:relative;border-radius:10px;border:2px solid rgba(255,255,255,0.5);background-color:transparent}.header-two-right-side .single-action-item::after,.header-two-right-side .single-action-item::before{height:2px;width:6px;background-color:#fff;content:'';position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);opacity:0;visibility:hidden;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.header-two-right-side .single-action-item::after{bottom:-2px}.header-two-right-side .single-action-item::before{top:-2px}.header-two-right-side .single-action-item:hover::after,.header-two-right-side .single-action-item:hover::before{opacity:1;visibility:visible}.header-two-right-side .new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:6px;top:4px}.header-three .header-bottom-area{height:110px;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-three .header-bottom-area{height:auto}}.header-three-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0}.header-three-right-side .sign-up-action-button{font-size:16px;font-weight:500;margin-left:20px;color:#fff;background-color:#0f034a;white-space:nowrap;line-height:46px;border-radius:20px}.header-three-right-side .sign-up-action-button:hover{background-color:#a50eff;color:#fff}@media only screen and (max-width:575px){.header-three-right-side .sign-up-action-button{padding:0 10px;font-size:13px}}.header-three-right-side .single-action-item{background-color:#efe1ff;border-radius:20px;position:relative}.header-three-right-side .single-action-item .new-notification{height:6px;width:6px;border-radius:100%;background-color:#ff7d6b;position:absolute;right:8px;top:6px}.header-three-right-side .single-action-item .btn-medium{padding:0 26px}.header-style-center{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.header-four{border-bottom:1px solid rgba(255,255,255,0.3)}.header-four-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0;white-space:nowrap}.header-four-right-side .sign-up-action-button{font-size:15px;font-weight:500;margin-left:20px;color:#fff;background-color:transparent;border:2px solid #fff;height:66px;line-height:64px;padding:0 20px}.header-four-right-side .sign-up-action-button:hover{background-color:#5974ff;color:#fff;border:2px solid #5974ff}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-four-right-side .sign-up-action-button{padding:0 10px;font-size:13px;height:46px;line-height:44px}}.header-four-right-side .single-action-item{background-color:transparent;border:2px solid #fff;border-radius:15px;position:relative;height:64px;line-height:64px;padding:0 20px}.header-four-right-side .single-action-item .new-notification{height:6px;width:6px;border-radius:100%;background-color:#d83d40;position:absolute;right:10px;top:8px}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-four-right-side .single-action-item{height:46px;line-height:44px;padding:0 15px}}.header-five .header-top{background:url("../images/header-top.jpg");background-repeat:no-repeat;background-size:cover;padding:15px 0}.header-five .time-offer{color:#fff;font-weight:18px}.header-five .time-offer .offer-text{color:#ff7d6b;margin-right:15px}.header-five .time-offer .get-offer-btn{padding:6px 16px;background-color:#fed74b;color:#000;border-radius:10px;font-weight:600}.header-five .time-offer .get-offer-btn:hover{background-color:#ff7d6b}.header-five .social-share-area{text-align:right}@media only screen and (max-width:767px){.header-five .social-share-area{text-align:center;margin-top:20px}}@media only screen and (min-width:768px) and (max-width:991px){.header-five .social-share-area li{margin-right:6px}}.header-five-left-side-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.header-five-left-side-box .ml-3{margin-left:60px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.header-five-left-side-box .ml-3{margin-left:0}}.header-five-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:25px 0}.header-five-right-side .sign-up-action-button{font-size:16px;font-weight:600;margin-left:30px;border-radius:10px}.header-five-right-side .sign-up-action-button:hover{background-color:#ff7d6b}@media only screen and (min-width:992px) and (max-width:1199px){.header-five-right-side .sign-up-action-button{margin-left:20px}}@media only screen and (max-width:575px){.header-five-right-side .sign-up-action-button{margin-left:0;padding:0 15px;font-size:13px}}.header-five-right-side .log-in-action-btn{font-weight:600}.header-six .header-top{padding:10px 0;border-bottom:1px solid #e8e8e8}.header-six .time-offer{color:#000;font-weight:18px}.header-six .time-offer .get-offer-btn{padding:6px 16px;background-color:#fed74b;color:#000;border-radius:10px;font-weight:600;margin-left:20px}.header-six .time-offer .get-offer-btn:hover{background-color:#ff7d6b}.header-six .social-share-area{text-align:right}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-six .social-share-area{text-align:center}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.header-six .header-bottom-area{margin-top:20px}}.mobile-navigation-icon{width:24px;height:25px;position:relative;cursor:pointer;display:inline-block;margin-right:0;margin-left:15px}.mobile-navigation-icon:hover i{background-color:#ffc4a0}.mobile-navigation-icon:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon:hover i:after{background-color:#ffc4a0;width:60%}.mobile-navigation-icon i{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);width:100%;height:2px;background-color:#333;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon i:before{position:absolute;bottom:8px;left:0;width:100%;height:2px;background-color:#333;content:"";-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon i:after{position:absolute;bottom:-8px;left:0;width:100%;height:2px;background-color:#333;content:"";-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-navigation-icon.icon-white i{background-color:#fff}.mobile-navigation-icon.icon-white i:before{background-color:#fff}.mobile-navigation-icon.icon-white i:after{background-color:#fff}.mobile-navigation-icon.icon-white:hover i{background-color:#ffc4a0}.mobile-navigation-icon.icon-white:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon.icon-white:hover i:after{background-color:#ffc4a0;width:60%}@media only screen and (min-width:992px) and (max-width:1199px){.mobile-navigation-icon.white-md-icon i{background-color:#fff}.mobile-navigation-icon.white-md-icon i:before{background-color:#fff}.mobile-navigation-icon.white-md-icon i:after{background-color:#fff}.mobile-navigation-icon.white-md-icon:hover i{background-color:#ffc4a0}.mobile-navigation-icon.white-md-icon:hover i:before{width:80%;background-color:#ffc4a0}.mobile-navigation-icon.white-md-icon:hover i:after{background-color:#ffc4a0;width:60%}}.mobile-menu-overlay,.page-oppen-off-sidebar{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;overflow:auto;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);z-index:9999;background:rgba(0,0,0,0.7);visibility:hidden;opacity:0}.mobile-menu-overlay__inner,.page-oppen-off-sidebar__inner{-webkit-transform:translateX(120%);-ms-transform:translateX(120%);transform:translateX(120%);width:400px;height:100%;float:right;cursor:default;background:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);overflow-y:auto}@media only screen and (max-width:479px){.mobile-menu-overlay__inner,.page-oppen-off-sidebar__inner{width:300px}}.mobile-menu-overlay.active,.page-oppen-off-sidebar.active{visibility:visible;opacity:1}.mobile-menu-overlay.active .mobile-menu-overlay__inner,.page-oppen-off-sidebar.active .mobile-menu-overlay__inner{-webkit-transform:translateX(0%);-ms-transform:translateX(0%);transform:translateX(0%)}.mobile-menu-overlay__header,.page-oppen-off-sidebar__header{background-color:#fff;padding:15px 0}.mobile-menu-overlay__header .mobile-navigation-close-icon,.page-oppen-off-sidebar__header .mobile-navigation-close-icon{position:relative;cursor:pointer;height:40px;width:40px;line-height:40px;display:inline-block;margin-right:auto}.mobile-menu-overlay__header .mobile-navigation-close-icon:before,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:before{position:absolute;top:23px;left:8px;content:'';width:24px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__header .mobile-navigation-close-icon:after,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:after{position:absolute;top:23px;left:8px;content:'';width:24px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__header .mobile-navigation-close-icon:hover,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover{color:#ffc4a0}.mobile-menu-overlay__header .mobile-navigation-close-icon:hover:before,.mobile-menu-overlay__header .mobile-navigation-close-icon:hover:after,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover:before,.page-oppen-off-sidebar__header .mobile-navigation-close-icon:hover:after{-webkit-transform:none;-ms-transform:none;transform:none}.mobile-menu-overlay__body,.page-oppen-off-sidebar__body{padding:20px 40px 100px}.mobile-menu-overlay__body .offcanvas-navigation>ul>li,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li{border-bottom:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li>a,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li>a{display:block;color:#000;padding-top:18px;padding-bottom:18px;font-size:16px;font-weight:500;line-height:1.5;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li>a:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li>a:hover{color:#000}.mobile-menu-overlay__body .offcanvas-navigation>ul>li:last-child,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li:last-child{border-bottom:0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children.active .menu-expand:before{content:'\eaa1'}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand{position:absolute;right:0;top:12px;width:40px;height:40px;background:rgba(255,255,255,0.1);color:#000;text-align:center;line-height:40px;cursor:pointer;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand:hover{background:rgba(255,255,255,0.2)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .menu-expand:before{content:'\ea99';font-size:18px;font-family:IcoFont}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu{padding:12px 0 14px 10px;border-top:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li{border-bottom:1px solid rgba(255,255,255,0.15)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li a,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li a{display:block;font-size:15px;color:rgba(0,0,0,0.7);font-weight:500;line-height:1.5;padding:10px 0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li a:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li a:hover{color:#000}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li:last-child,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li:last-child{border-bottom:0}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children.active .menu-expand:before{content:"\ea99"}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand{position:absolute;right:0;top:6px;width:30px;height:30px;background:rgba(255,255,255,0.1);color:#000;text-align:center;line-height:30px;cursor:pointer;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:hover,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:hover{background:rgba(255,255,255,0.2)}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu li.has-children .menu-expand:before{content:'\ea99';font-size:16px;font-family:IcoFont;font-weight:500}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children{position:relative}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children.active .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children.active .menu-expand:before{content:"\f106"}.mobile-menu-overlay__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children .menu-expand:before,.page-oppen-off-sidebar__body .offcanvas-navigation>ul>li.has-children .sub-menu .sub-menu li.has-children .menu-expand:before{content:'\f107';font-size:16px;font-family:IcoFont;font-weight:500}.search-overlay{position:fixed;left:0;top:0;width:100%;height:100%;background-color:#000;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);z-index:9999;visibility:hidden;opacity:0;overflow:hidden;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__inner{width:100%;height:100%;cursor:default;background:#fff;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);overflow-y:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.search-overlay.active{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.search-overlay__header{background-color:#fff;padding:15px 0}.search-overlay__header .mobile-navigation-close-icon{position:relative;cursor:pointer;height:48px;width:48px;line-height:48px;display:inline-block}.search-overlay__header .mobile-navigation-close-icon:before{position:absolute;top:28px;left:0;content:'';width:42px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__header .mobile-navigation-close-icon:after{position:absolute;top:28px;left:0;content:'';width:42px;height:3px;background:#000;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__header .mobile-navigation-close-icon:hover{color:#ffc4a0}.search-overlay__header .mobile-navigation-close-icon:hover:before,.search-overlay__header .mobile-navigation-close-icon:hover:after{-webkit-transform:none;-ms-transform:none;transform:none}.search-overlay__body{width:100%;margin:0 auto;margin-bottom:75px}.search-overlay__form{position:relative;max-width:1200px;padding:0 15px;width:100%;margin:auto}.search-overlay__form input{background-color:transparent;border:0;border-bottom:2px solid #ffc4a0;border-radius:0;padding:15px 50px 15px 0;width:100%;color:#fff;font-size:42px;height:60px;color:#ffc4a0}@media only screen and (max-width:767px){.search-overlay__form input{font-size:30px;height:60px}}.search-overlay__form input::-webkit-input-placeholder{color:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::-moz-placeholder{color:#ffc4a0;-moz-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input:-ms-input-placeholder{color:#ffc4a0;-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::-ms-input-placeholder{color:#ffc4a0;-ms-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input::placeholder{color:#ffc4a0;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.search-overlay__form input[type="text"]:focus{color:#ffc4a0;border-color:#ffc4a0}@media only screen and (min-width:768px) and (max-width:991px){.navigation-menu{display:none}}@media only screen and (max-width:767px){.navigation-menu{display:none}}.navigation-menu>ul>li{margin:0 25px;position:relative;text-align:left;display:inline-block}@media only screen and (min-width:1500px) and (max-width:1599px){.navigation-menu>ul>li{margin:0 22px}}@media only screen and (min-width:1200px) and (max-width:1499px){.navigation-menu>ul>li{margin:0 15px}}@media only screen and (min-width:992px) and (max-width:1199px){.navigation-menu>ul>li{margin:0 12px}}.navigation-menu>ul>li:last-child{margin-right:0}.navigation-menu>ul>li:first-child{margin-left:0}.navigation-menu>ul>li>a{display:block;color:#000;padding:30px 2px;position:relative;font-size:16px;font-weight:500;line-height:1.18;-webkit-transition:all .0s ease-in-out;-o-transition:all .0s ease-in-out;transition:all .0s ease-in-out}.navigation-menu>ul>li>a span{-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li.has-children>a{position:relative}.navigation-menu>ul>li.has-children>a:after{position:static;margin-left:5px;font-family:IcoFont;content:'\ea99';font-size:14px;vertical-align:middle;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li.has-children--multilevel-submenu{position:relative}.navigation-menu>ul>li.has-children:hover .megamenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.navigation-menu>ul>li.has-children:hover .megamenu--home-variation__item{visibility:visible;opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.navigation-menu>ul>li.has-children:hover>.submenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1}.navigation-menu>ul>li:hover>a:after,.navigation-menu>ul>li.active>a:after{color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu>ul>li:hover>a span,.navigation-menu>ul>li.active>a span{color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.navigation-menu-white>ul>li>a{color:#fff}.navigation-menu-white>ul>li>a:before{content:'';width:0;height:3px;bottom:0;position:absolute;left:0;background-color:#ffc4a0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.theme-color-two .navigation-menu>ul>li:hover>a:after,.theme-color-two .navigation-menu>ul>li.active>a:after{color:#ff7d6b}.theme-color-two .navigation-menu>ul>li:hover>a span,.theme-color-two .navigation-menu>ul>li.active>a span{color:#ff7d6b}.theme-color-two .submenu{border-bottom:3px solid #ff7d6b}.theme-color-two .submenu>li.active>a{color:#ff7d6b}.theme-color-two .submenu>li a>span:after{background-color:#ff7d6b}.theme-color-two .submenu>li>a:hover{color:#ff7d6b}.theme-color-two .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-two .megamenu--mega>li>ul>li>a:hover{color:#ff7d6b}.theme-color-two .megamenu--mega>li>ul>li.active>a{color:#ff7d6b}.theme-color-three .navigation-menu>ul>li a{color:#250c83}.theme-color-three .navigation-menu>ul>li:hover>a:after,.theme-color-three .navigation-menu>ul>li.active>a:after{color:#a50eff}.theme-color-three .navigation-menu>ul>li:hover>a span,.theme-color-three .navigation-menu>ul>li.active>a span{color:#a50eff}.theme-color-three .submenu{border-bottom:3px solid #a50eff}.theme-color-three .submenu>li.active>a{color:#a50eff}.theme-color-three .submenu>li a>span:after{background-color:#a50eff}.theme-color-three .submenu>li>a:hover{color:#a50eff}.theme-color-three .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-three .megamenu--mega>li>ul>li>a:hover{color:#a50eff}.theme-color-three .megamenu--mega>li>ul>li.active>a{color:#a50eff}.theme-color-four .navigation-menu>ul>li:hover>a:after,.theme-color-four .navigation-menu>ul>li.active>a:after{color:#5974ff}.theme-color-four .navigation-menu>ul>li:hover>a span,.theme-color-four .navigation-menu>ul>li.active>a span{color:#5974ff}.theme-color-four .submenu{border-bottom:3px solid #5974ff}.theme-color-four .submenu>li.active>a{color:#5974ff}.theme-color-four .submenu>li a>span:after{background-color:#5974ff}.theme-color-four .submenu>li>a:hover{color:#5974ff}.theme-color-four .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-four .megamenu--mega>li>ul>li>a:hover{color:#5974ff}.theme-color-four .megamenu--mega>li>ul>li.active>a{color:#5974ff}.theme-color-five .navigation-menu>ul>li:hover>a:after,.theme-color-five .navigation-menu>ul>li.active>a:after{color:#5138ee}.theme-color-five .navigation-menu>ul>li:hover>a span,.theme-color-five .navigation-menu>ul>li.active>a span{color:#5138ee}.theme-color-five .submenu{border-bottom:3px solid #5138ee}.theme-color-five .submenu>li.active>a{color:#5138ee}.theme-color-five .submenu>li a>span:after{background-color:#5138ee}.theme-color-five .submenu>li>a:hover{color:#5138ee}.theme-color-five .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-five .megamenu--mega>li>ul>li>a:hover{color:#5138ee}.theme-color-five .megamenu--mega>li>ul>li.active>a{color:#5138ee}.theme-color-six .navigation-menu>ul>li:hover>a:after,.theme-color-six .navigation-menu>ul>li.active>a:after{color:#5138ee}.theme-color-six .navigation-menu>ul>li:hover>a span,.theme-color-six .navigation-menu>ul>li.active>a span{color:#5138ee}.theme-color-six .submenu{border-bottom:3px solid #5138ee}.theme-color-six .submenu>li.active>a{color:#5138ee}.theme-color-six .submenu>li a>span:after{background-color:#5138ee}.theme-color-six .submenu>li>a:hover{color:#5138ee}.theme-color-six .submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.theme-color-six .megamenu--mega>li>ul>li>a:hover{color:#5138ee}.theme-color-six .megamenu--mega>li>ul>li.active>a{color:#5138ee}.submenu{position:absolute;top:100%;left:-20px;-webkit-box-shadow:0 2px 29px rgba(0,0,0,0.05);box-shadow:0 2px 29px rgba(0,0,0,0.05);border-bottom:3px solid #ffc4a0;background-color:#fff;-webkit-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-transition-delay:.2s;-o-transition-delay:.2s;transition-delay:.2s;-webkit-transition-duration:.4s;-o-transition-duration:.4s;transition-duration:.4s;visibility:hidden;opacity:0;min-width:200px;padding:15px 0;z-index:9}.submenu>li{position:relative}.submenu>li>a{display:block;padding:5px 20px;color:#000;font-weight:500;-webkit-transition:0s;-o-transition:0s;transition:0s}.submenu>li>a>span{position:relative}.submenu>li>a>span:after{content:'';width:0;height:1px;bottom:0;position:absolute;left:auto;right:0;z-index:-1;background-color:#ffc4a0;-webkit-transition:.3s;-o-transition:.3s;transition:.3s}.submenu>li>a:hover{color:#ffc4a0}.submenu>li>a:hover>span:after{width:100%;left:0;right:auto}.submenu>li:hover>.submenu{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);visibility:visible;opacity:1;z-index:9}.submenu>li.active>a{color:#ffc4a0}.submenu>li.has-children>a{position:relative;-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1)}.submenu>li.has-children>a:after{position:absolute;right:20px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-family:IcoFont;content:'\f105';font-size:14px;vertical-align:middle;color:#ababab}.submenu>li.has-children>a:hover:after{color:#ffc4a0}.submenu>li.has-children.active>a{color:#ffc4a0}.submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu .submenu.left{right:100%;left:auto}.submenu .submenu .submenu .submenu .submenu{top:0;left:100%;right:auto}.submenu .submenu .submenu .submenu .submenu.left{right:100%;left:auto}.megamenu{position:absolute;top:100%;left:0;-webkit-box-shadow:0 2px 29px rgba(0,0,0,0.05);box-shadow:0 2px 29px rgba(0,0,0,0.05);border-bottom:3px solid #ffc4a0;background-color:#fff;-webkit-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px);-webkit-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-o-transition:all .7s cubic-bezier(0.645,0.045,0.355,1);transition:all .7s cubic-bezier(0.645,0.045,0.355,1);-webkit-transition-delay:.2s;-o-transition-delay:.2s;transition-delay:.2s;-webkit-transition-duration:.4s;-o-transition-duration:.4s;transition-duration:.4s;visibility:hidden;opacity:0;z-index:9}.megamenu--mega{min-width:980px;width:100%;padding:35px 20px 30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media only screen and (min-width:1200px) and (max-width:1499px){.megamenu--mega{padding-left:50px;padding-right:50px}}@media only screen and (min-width:1200px) and (max-width:1499px){.megamenu--mega{min-width:700px}}.megamenu--mega>li{-webkit-flex-basis:22%;-ms-flex-preferred-size:22%;flex-basis:22%;padding-left:15px;padding-right:15px}.megamenu--mega>li .page-list-title{font-size:14px;margin-bottom:20px;color:#000}.megamenu--mega>li>ul>li>a{padding:10px 0;color:#ababab;line-height:1.2;-webkit-transition:.1s;-o-transition:.1s;transition:.1s}.megamenu--mega>li>ul>li>a:hover{color:#ffc4a0}.megamenu--mega>li>ul>li>a:hover span:after{width:100%;left:0;right:auto}.megamenu--mega>li>ul>li>a>span{position:relative}.megamenu--mega>li>ul>li>a>span:after{content:'';width:0;height:1px;bottom:0;position:absolute;left:auto;right:0;z-index:-1;background-color:#ffc4a0;-webkit-transition:.3s;-o-transition:.3s;transition:.3s}.megamenu--mega>li>ul>li.active>a{color:#ffc4a0}.footer-one .footer-top-area{background-color:#22262a;padding:60px 0 90px}.footer-one .footer-top-area p{color:#fff}.footer-one .footer-bottom-area{background:#2d3135}.footer-one .footer-bottom-area p{color:#fff}.footer-widget{margin-top:30px;max-width:280px;margin-left: 40px;}@media only screen and (max-width:767px){.footer-widget{max-width:100%}}.footer-logo{margin-bottom:20px}.footer-socail-share{margin-top:30px}.footer-socail-share li{display:inline-block;margin-right:15px}.footer-socail-share li:last-child{margin-right:0}@media only screen and (min-width:992px) and (max-width:1199px){.footer-socail-share li{margin-right:5px}}.footer-socail-share li a{height:45px;width:45px;line-height:45px;text-align:center;background-color:#2d3135;border-radius:5px;color:#fff}.footer-socail-share li a:hover{background-color:#ffc4a0;color:#fff}.footer-widget-title{margin-bottom:30px}.footer-widget-title .title{color:#fff}.footer-subscribe-center{margin-right:0;margin-left:auto;margin-right:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-subscribe-center{margin-left:0}}.footer-subscribe-area{margin-right:0;margin-left:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-subscribe-area{margin-left:0}}.footer-subscribe-wrap .single-input{margin-bottom:15px}.footer-subscribe-wrap .single-input input{width:100%;max-width:300px;border:1px solid #2d3135;border-radius:10px;font-weight:500;padding:15px 15px;background-color:#2d3135;color:#ffc4a0}.footer-subscribe-wrap .single-input ::-webkit-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input :-ms-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::-moz-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::-ms-input-placeholder{color:#fff}.footer-subscribe-wrap .single-input ::placeholder{color:#fff}.footer-menu-widget{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-10px;margin-left:-5px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.single-footer-menu{width:33.3333%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:5px;padding-right:10px;margin-top:30px}@media only screen and (max-width:575px){.single-footer-menu{width:50%}}.single-footer-menu:last-child{padding-left:50px}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-footer-menu:last-child{padding-left:5px}}.footer-widget-menu-list li{margin-bottom:10px}.footer-widget-menu-list li:last-child{margin-bottom:0}.footer-widget-menu-list li a{color:#fff}.footer-bottom-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.footer-bottom-inner .copy-right-text a{color:#ffc4a0}.footer-bottom-inner .button-right-box{margin:10px 0}@media only screen and (max-width:767px){.footer-bottom-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.footer-bottom-inner p{margin-top:20px}}.footer-bottom-area .copy-right-center{text-align:center}.footer-bottom-area .copy-right-text a{color:#ffc4a0}.footer-two .footer-top-area{background-color:#252c63;padding:90px 0 110px}.footer-two .footer-top-area p{color:#fff}@media only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px){.footer-two .footer-top-area{padding:60px 0 90px}}@media only screen and (max-width:767px){.footer-two .footer-top-area{padding:30px 0 60px}}.footer-two .footer-bottom-area{background:#252c63}.footer-two .footer-bottom-area p{color:#fff}.footer-two .footer-bottom-area a{color:#ff7d6b}.footer-two .footer-socail-share li a{background-color:#3b4179}.footer-two .footer-socail-share li a:hover{background-color:#ff7d6b;color:#fff}@media only screen and (max-width:575px){.footer-two .single-footer-menu{width:100%}}.footer-two .footer-subscribe-wrap .single-input input{border:1px solid #353872;background-color:#353872}.footer-two .footer-bottom-area{border-top:1px solid rgba(255,255,255,0.2);padding:20px 0}.footer-three .footer-top-area{background-color:#200b70}.footer-three .footer-widget-top{padding:45px 0 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer-three .footer-widget-top .footer-logo{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .footer-logo{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.footer-three .footer-widget-top .info-text-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-bottom:20px}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .info-text-box{width:100%;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}}.footer-three .footer-widget-top .info-text-box .sub-title{font-size:12px;color:#ff7d6b;margin-bottom:10px}.footer-three .footer-widget-top .info-text-box .title{color:#fff;font-size:32px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-three .footer-widget-top .info-text-box .title{font-size:22px}}.footer-three .footer-widget-top .button-right-box{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.footer-three .footer-widget-top .button-right-box .btn-primary{background-color:#218b00;color:#fff}@media only screen and (min-width:768px) and (max-width:991px){.footer-three .footer-widget-top .button-right-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.footer-three .footer-mid-area{background-color:#250c83;padding:70px 0 100px}.footer-three .footer-mid-area .footer-subscribe-wrap .single-input input{border:1px solid #453095;background-color:transparent;border-radius:15px}.footer-three .footer-mid-area .button-box .btn-primary{border-radius:15px}.footer-three .footer-socail-share li a{background-color:#3b4179}.footer-three .footer-socail-share li a:hover{background-color:#a50eff;color:#fff}.footer-three .footer-bottom-area{padding:20px 0;border-top:1px solid #3b2590;background-color:#250c83}.footer-three .footer-bottom-area p{color:#fff}.footer-three .footer-bottom-area a{color:#ff7d6b}.footer-four .footer-top-area{background-color:#5974ff}.footer-four .footer-widget-top{padding:45px 0 25px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.footer-four .footer-widget-top .info-text-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-bottom:20px}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-widget-top .info-text-box{width:100%;-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}}.footer-four .footer-widget-top .info-text-box .sub-title{font-size:12px;color:#fff;margin-bottom:10px}.footer-four .footer-widget-top .info-text-box .title{color:#fff;font-size:32px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-four .footer-widget-top .info-text-box .title{font-size:22px}}.footer-four .footer-widget-top .button-right-box{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-widget-top .button-right-box{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.footer-four .footer-widget-top .button-right-box a{color:#222}.footer-four .footer-item-space{padding:100px 0}@media only screen and (min-width:992px) and (max-width:1199px){.footer-four .footer-item-space{padding:80px 0}}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-item-space{padding:30px 0}}@media only screen and (max-width:767px){.footer-four .footer-item-space{padding:20px 0}}.footer-four .footer-widget p{color:#fff}.footer-four .footer-mid-area{background-color:#081131}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-mid-area{padding:50px 0}}@media only screen and (max-width:767px){.footer-four .footer-mid-area{padding:40px 0}}.footer-four .footer-mid-area .footer-widget{margin-top:0}.footer-four .footer-mid-area .footer-border{position:relative}.footer-four .footer-mid-area .footer-border::before{position:absolute;content:'';left:-70px;top:0;height:100%;width:1px;background-color:#171f3d}.footer-four .footer-mid-area .footer-border:last-child::after{position:absolute;content:'';right:-70px;top:0;height:100%;width:1px;background-color:#171f3d}@media only screen and (min-width:1200px) and (max-width:1499px){.footer-four .footer-mid-area .footer-border::before{left:-10px}.footer-four .footer-mid-area .footer-border:last-child::after{right:-10px}}@media only screen and (min-width:992px) and (max-width:1199px){.footer-four .footer-mid-area .footer-border::before{display:none}.footer-four .footer-mid-area .footer-border:last-child::after{display:none;right:0}}@media only screen and (min-width:768px) and (max-width:991px){.footer-four .footer-mid-area .footer-border:last-child::after{display:none}}@media only screen and (max-width:767px){.footer-four .footer-mid-area .footer-border::before{display:none}.footer-four .footer-mid-area .footer-border:last-child::after{display:none}}.footer-four .footer-socail-share li a{background-color:transparent;border:2px solid #fff;border-radius:15px;line-height:38px}.footer-four .footer-socail-share li a:hover{border:2px solid #5974ff;background-color:#5974ff;color:#fff}.footer-four .footer-bottom-area{padding:20px 0;background-color:#081131}.footer-four .footer-bottom-area p{color:#fff}.footer-four .footer-bottom-area a{color:#5974ff}.footer-five .footer-top-area{padding:70px 0 100px;background-color:#5138ee;background-image:url("../images/footer-bg-five.jpg");background-size:cover}@media only screen and (max-width:767px){.footer-five .footer-top-area{padding:30px 0 60px}}.footer-five .footer-subscribe-wrap .single-input input{border:2px solid #fff;padding:15px 30px;background-color:transparent;border-radius:15px}.footer-five .footer-dec-text{color:#fff}.footer-five .footer-socail-share li a{background-color:transparent;border:1px solid #fff}.footer-five .footer-socail-share li a:hover{border:1px solid #fff;background-color:#fff;color:#5138ee}.footer-five .footer-bottom-area{background-color:#462fd7;padding:25px 50px 5px}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:1200px) and (max-width:1499px){.footer-five .footer-bottom-area{padding:25px 0 5px}}.footer-five .copy-right-text{color:#fff}.footer-five .copy-right-text a{color:#fed74b}.footer-bottom-menu-list li{display:inline-block;padding-right:20px;margin-right:20px;position:relative}.footer-bottom-menu-list li::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#ffc4a0;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.footer-bottom-menu-list li a{color:#fff}.footer-bottom-menu-list li a:hover{color:#ffc4a0}.footer-bottom-menu-list li:last-child{padding-right:0;margin-right:0}.footer-bottom-menu-list li:last-child::after{display:none}.scroll-button-buttom .text{color:#fff;margin-right:10px}.scroll-button-buttom .right-side-scroll-up{height:50px;width:50px;line-height:50px;color:#222;background-color:#fed74b;border-radius:10px;text-align:center;font-size:20px}.footer-six .footer-top-area{background-color:#081b3c;padding:80px 0 80px}.footer-six .footer-top-area .footer-newsletter-subscribe{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title{max-width:500px}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title .title{color:#fff}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.footer-six .footer-top-area .footer-newsletter-subscribe{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.footer-six .footer-top-area .footer-newsletter-subscribe .section-title{max-width:100%;margin-bottom:30px}}.footer-six .footer-top-area .newsletter-input-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;width:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:450px;width:100%;border:2px solid #ddd;border-radius:10px;margin-right:20px;padding:5px 30px;font-weight:500;height:60px;background-color:transparent}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-webkit-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-moz-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input:-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input::placeholder{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:300px}}@media only screen and (max-width:767px){.footer-six .footer-top-area .newsletter-input-box .newsletter-input{max-width:100%;margin-bottom:20px}}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-webkit-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-moz-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input :-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::-ms-input-placeholder{color:#fff}.footer-six .footer-top-area .newsletter-input-box .newsletter-input ::placeholder{color:#fff}@media only screen and (max-width:767px){.footer-six .footer-top-area .newsletter-input-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.footer-six .footer-mid-area{background-color:#0a1e43;padding:90px 0 120px}.footer-six .footer-mid-area .dec-text{color:#fff}.footer-six .footer-socail-share li a{background-color:#5974ff}.footer-six .footer-socail-share li a:hover{background-color:#5974ff;color:#fff}.footer-six .footer-bottom-area{background:#0a1e43;border-top:1px solid #1d3052;padding:20px 0}.footer-six .footer-bottom-area p{color:#fff}.footer-six .footer-bottom-area a{color:#fff}.footer-six .footer-bottom-area .right-side-scroll-up{background-color:#5974ff}@media only screen and (max-width:767px){.footer-six .footer-bottom-area{text-align:center}.footer-six .footer-bottom-area .scroll-button-buttom{margin-top:10px}}.hero-area{background-color:#f7f7f7;padding:80px 0}.hero-inner-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-15px;margin-left:-15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.hero-inner-area{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.hero-category-area{max-width:290px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px){.hero-category-area{width:35%}}@media only screen and (max-width:767px){.hero-category-area{width:35%}}@media only screen and (max-width:575px){.hero-category-area{width:100%;max-width:100%}}.single-hero-category-item{display:block;margin-bottom:28px;position:relative}.single-hero-category-item:last-child{margin-bottom:0}.single-hero-category-item img{border-radius:15px;width:100%}.single-hero-category-item::after{position:absolute;height:100%;width:100%;content:"";left:0;top:0;background-color:rgba(0,0,0,0.7);border-radius:15px;opacity:0;visibility:hidden;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.single-hero-category-item:hover::after{opacity:1;visibility:visible}.single-hero-category-item:hover .hero-category-inner-box{opacity:1;visibility:visible}.hero-category-inner-box{position:absolute;opacity:0;visibility:hidden;left:0;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:100%;padding:10px 30px;color:#fff;z-index:1;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}@media only screen and (min-width:992px) and (max-width:1199px){.hero-category-inner-box{padding:5px 10px}}@media only screen and (max-width:767px){.hero-category-inner-box{padding:5px 10px}}@media only screen and (max-width:575px){.hero-category-inner-box{padding:10px 30px}}.hero-category-inner-box .title{color:#fff}.hero-category-inner-box .icon{font-size:28px;height:40px;width:40px;background-color:#ffc4a0;line-height:40px;text-align:center;border-radius:50000px}.hero-banner-area{padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px){.hero-banner-area{width:64%}}@media only screen and (max-width:767px){.hero-banner-area{width:64%}}@media only screen and (max-width:575px){.hero-banner-area{margin-top:45px;width:100%;max-width:100%}}.hero-banner-area a{display:block}.hero-banner-area a img{border-radius:15px;width:100%}.hero-blog-post{max-width:375px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px),only screen and (max-width:575px){.hero-blog-post{max-width:100%;width:100%;margin-top:45px}}.single-hero-blog-post{margin-top:45px}.single-hero-blog-post:first-child{margin-top:0}@media only screen and (min-width:992px) and (max-width:1199px){.single-hero-blog-post{margin-top:25px}}.hero-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-blog-post-top{margin-bottom:10px}}.hero-blog-post-category{margin-right:25px}.hero-blog-post-category a{min-width:100px;background:#ffebdf;text-align:center;padding:6px 5px;border-radius:10px}.hero-blog-post-author{color:#9b9ea1}.hero-blog-post-author a{color:#000}.hero-blog-post-title{margin-bottom:20px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-blog-post-title{margin-bottom:10px}}.hero-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.post-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.post-meta-left-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.post-meta-left-side span a:hover{color:#ffc4a0}.post-meta-left-side span:last-child{padding-right:0;margin-right:0}.post-meta-left-side span:last-child::after{display:none}.post-meta-right-side a{margin-left:10px}.hero-area-two-wrapper{position:relative}.hero-area-two-wrapper .hero-two-banner-text{position:absolute;bottom:0;text-align:center;width:100%}.hero-area-two{background:url("../images/home-2-hero-bg.jpg");background-repeat:no-repeat;background-size:cover;height:850px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#091d40}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-two{height:750px}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.hero-area-two{height:auto;padding:150px 0 100px}}.hero-area-overly{position:relative}.hero-area-overly::before{content:'';background-color:rgba(15,0,84,0.7);height:100%;width:100%;position:absolute;left:0;top:0}.hero-area--two-innter{position:relative}.hero-area--two-innter .sub-title{color:#ff7d6b;text-transform:uppercase;letter-spacing:1px}.hero-area--two-innter .hero-title{color:#fff;font-size:95px;font-weight:bold}.hero-area--two-innter .hero-title-small{font-size:60px;color:#fff;font-weight:bold}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area--two-innter .hero-title{font-size:75px}.hero-area--two-innter .hero-title-small{font-size:40px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area--two-innter .hero-title{font-size:65px}.hero-area--two-innter .hero-title-small{font-size:30px}}@media only screen and (max-width:767px){.hero-area--two-innter .hero-title{font-size:45px}.hero-area--two-innter .hero-title-small{font-size:20px}}@media only screen and (max-width:575px){.hero-area--two-innter .hero-title{font-size:45px}.hero-area--two-innter .hero-title-small{font-size:20px}}.hero-two-tag{max-width:750px;margin:60px auto 0}.hero-two-tag a{margin:10px;padding:0 35px;height:50px;line-height:46px;border:2px solid #fff}.hero-two-tag a:hover{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-two-tag{margin:40px auto 0}}@media only screen and (max-width:767px),only screen and (min-width:768px) and (max-width:991px){.hero-two-tag{margin:30px auto 0}}@media only screen and (max-width:575px){.hero-two-tag a{margin:5px}}.hero-area-three{background:url("../images/home-3-hero-bg.jpg");background-repeat:no-repeat;background-size:cover;height:830px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:relative;background-color:#091d40}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.hero-area-three{height:600px}}.hero-area-three-post .title{color:#fff;font-size:45px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-three-post .title{font-size:36px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-three-post .title{font-size:30px}}@media only screen and (max-width:767px){.hero-area-three-post .title{font-size:28px}}.hero-area-three-post .dec{color:#fff;max-width:470px;font-size:18px}.hero-area-three-post-author{color:#9b9ea1;margin-bottom:15px;font-weight:600;font-size:18px}.hero-area-three-post-author a{color:#fff}.hero-area-three-post-meta{margin-top:25px}.hero-area-three-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:17px;color:#fff}.hero-area-three-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#fff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-area-three-post-meta>span:last-child{padding-right:0;margin-right:0}.hero-area-three-post-meta>span:last-child::after{display:none}.hero-three-box{margin-right:-60px;margin-left:60px}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.hero-three-box{margin-right:0;margin-left:0}}.hero-three-inner-image{margin-bottom:20px;border-radius:20px;border:1px solid #ddd;padding:15px}.hero-three-inner-image img{border-radius:20px}.hero-swiper-pagination{position:absolute;bottom:40px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.hero-swiper-pagination .swiper-pagination-bullet{height:16px;width:16px;border-radius:100%;background-color:#8b61b7;margin:5px}.hero-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#fff}.hero-three-category{text-align:center}.hero-three-category a{margin:15px;min-width:200px;text-align:center;height:66px;line-height:66px;border-radius:15px;background:#f4eaff}.hero-three-category a:hover{background:#a50eff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-three-category a{min-width:140px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-three-category a{min-width:auto;margin:10px 2px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-three-category a{min-width:auto;margin:10px 2px}}@media only screen and (max-width:767px){.hero-three-category a{min-width:auto;margin:10px 2px}}.hero-three-category .category-step-2{width:90%;margin:auto}.hero-area-four{background:url("../images/home-4-hero-bg.jpg");background-repeat:no-repeat;background-size:cover;background-color:#091d40;height:820px;padding-top:150px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-four{height:700px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-four{height:650px}}@media only screen and (max-width:767px){.hero-area-four{height:600px}}@media only screen and (max-width:575px){.hero-area-four{height:600px}}@media only screen and (max-width:479px){.hero-area-four{height:700px}}.hero-four-image{margin-top:-380px;z-index:1;position:relative;text-align:center}@media only screen and (min-width:992px) and (max-width:1199px){.hero-four-image{margin-top:-220px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-four-image{margin-top:-220px}}@media only screen and (max-width:767px){.hero-four-image{margin-top:-200px}}@media only screen and (max-width:575px){.hero-four-image{margin-top:-150px}}@media only screen and (max-width:479px){.hero-four-image{margin-top:-150px}}.hero-four-inner-image{padding:15px;border:2px solid #edf0f8;max-width:770px;border-radius:15px;margin:auto}.hero-four-inner-image img{border-radius:15px}.hero-area-four-post{margin-bottom:40px}.hero-area-four-post .title{color:#fff;font-size:52px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-four-post .title{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-four-post .title{font-size:30px}}@media only screen and (max-width:767px){.hero-area-four-post .title{font-size:28px}}.hero-area-four-post .dec{color:#fff}.hero-area-three-post-author{color:#9b9ea1;margin-bottom:10px;font-weight:600}.hero-area-three-post-author a{color:#fff}.hero-area-four-post-meta{margin-top:20px}.hero-area-four-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#5974ff}.hero-area-four-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#5974ff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-area-four-post-meta>span a{color:#fff}.hero-area-four-post-meta>span.time{color:#fff}.hero-area-four-post-meta>span:last-child{padding-right:0;margin-right:0}.hero-area-four-post-meta>span:last-child::after{display:none}.slider-four-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:1px solid #e7e5ed;text-align:center;font-size:25px;border-radius:10px;color:#fff;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;position:absolute;background-color:transparent;left:100px;right:auto}.slider-four-slider-navigation .navigation-button.slider-four-button-prev{right:100px;left:auto}.slider-four-slider-navigation .navigation-button:hover{border:1px solid #363449;background-color:#363449}.hero-four-category{border-top:1px solid #edf0f8;border-bottom:1px solid #edf0f8;padding:15px 0}.hero-four-category .category-step-1{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;text-align:center;margin-left:-15px;margin-right:-15px}@media only screen and (max-width:767px){.hero-four-category .category-step-1{-webkit-box-pack:start;-webkit-justify-content:start;-ms-flex-pack:start;justify-content:start}}.hero-four-category a{margin:15px;min-width:200px;text-align:center;border-radius:15px}.hero-four-category a:hover{color:#fff}@media only screen and (min-width:992px) and (max-width:1199px){.hero-four-category a{min-width:140px;margin:10px 2px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-four-category a{min-width:auto;margin:10px 2px}}@media only screen and (max-width:767px){.hero-four-category a{min-width:auto;margin:10px 10px;padding:0 18px}}.hero-four-category .category-step-2{width:90%;margin:auto}.hero-area-five{padding:120px 0}@media only screen and (min-width:992px) and (max-width:1199px){.hero-area-five{padding:100px 0}}@media only screen and (min-width:768px) and (max-width:991px){.hero-area-five{padding:80px 0}}@media only screen and (max-width:767px){.hero-area-five{padding:60px 0}}.hero-five-text .sub-title{color:#ff7d6b;text-transform:uppercase;margin-bottom:30px}.hero-five-text .title{display:block;font-size:60px;font-weight:700}.hero-five-text .title .hero-five-title{font-size:90px;display:inline-block;position:relative;line-height:1}.hero-five-text .title .hero-five-title::after{position:absolute;content:"";left:0;bottom:2px;height:25px;width:100%;background-color:#fed74b;z-index:-1}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-text .title .hero-five-title{font-size:80px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-five-text .title .hero-five-title{font-size:40px}.hero-five-text .title .hero-five-title::after{height:20px}}@media only screen and (max-width:767px){.hero-five-text .title .hero-five-title{font-size:34px}.hero-five-text .title .hero-five-title::after{height:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-text .title{font-size:46px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-five-text .title{font-size:40px}}@media only screen and (max-width:767px){.hero-five-text .title{font-size:34px}}@media only screen and (max-width:575px){.hero-five-text .title{font-size:30px}}.hero-five-text .hero-text-dec{margin-top:10px;margin-bottom:30px;font-size:20px;font-weight:600;max-width:540px}.hero-five-text .button-box .btn-bg-5{background-color:#5138ee;color:#fff}.hero-five-text .button-box .btn-bg-5:hover{color:#fff}.hero-five-category{margin-right:-30px}.hero-five-category a{margin-right:25px;margin-top:25px}.hero-five-category a:hover{color:#fff}@media only screen and (min-width:1200px) and (max-width:1499px){.hero-five-category a{margin-right:20px}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-category a{margin-right:15px}}@media only screen and (max-width:767px){.hero-five-category a{margin-right:5px}}@media only screen and (min-width:1200px) and (max-width:1499px){.hero-five-category{margin-right:0}}@media only screen and (min-width:992px) and (max-width:1199px){.hero-five-category{margin-right:0}}@media only screen and (max-width:767px){.hero-five-category{margin-right:0}}.hero-six-area{padding:60px 0 100px}.hero-slide-six-image{display:block}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-six-image img{width:100%}}.hero-slide-post-content{margin-top:20px;margin-bottom:10px;margin-left:40px}@media only screen and (min-width:992px) and (max-width:1199px){.hero-slide-post-content{margin-left:0}}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-post-content{margin-left:0}}@media only screen and (max-width:767px){.hero-slide-post-content{margin-left:0}}.hero-slide-post-author{color:#9b9ea1}.hero-slide-post-author a{color:#091d40}@media only screen and (max-width:479px){.hero-slide-post-author{font-size:12px}}.hero-slide-post-title{margin-bottom:25px;font-size:32px;font-weight:800;color:#0f034a}@media only screen and (min-width:992px) and (max-width:1199px){.hero-slide-post-title{font-size:30px}}@media only screen and (min-width:768px) and (max-width:991px){.hero-slide-post-title{font-size:22px;margin-bottom:10px}}@media only screen and (max-width:767px){.hero-slide-post-title{font-size:22px}}.hero-slide-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}@media only screen and (max-width:479px){.hero-slide-post-meta{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.hero-slide-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.hero-slide-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#091d40;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.hero-slide-post-meta span a:hover{color:#5974ff}.hero-slide-post-meta span:last-child{padding-right:0;margin-right:0}.hero-slide-post-meta span:last-child::after{display:none}.hero-read-more-button a{border-bottom:1px solid #ddd;display:inline-block;font-weight:600;color:#0f034a}.hero-read-more-button a i{font-size:18px;margin-left:10px}.slider-six-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #e6e8ec;text-align:center;font-size:25px;border-radius:10px;color:#333;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;left:100px;right:auto;position:absolute;top:50%;z-index:1;background-color:transparent}.slider-six-slider-navigation .navigation-button.slider-six-button-prev{right:100px;left:auto}.slider-six-slider-navigation .navigation-button:hover{border:1px solid #5138ee;background-color:#5138ee;color:#fff}@media only screen and (min-width:1200px) and (max-width:1499px),only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.slider-six-slider-navigation .navigation-button{left:20px}.slider-six-slider-navigation .navigation-button.slider-six-button-prev{right:20px}}.trending-article-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:-15px;margin-left:-15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-row{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.trending-article-left-side{max-width:515px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-left-side{max-width:100%}}.trending-article-right-side{max-width:675px;padding-left:15px;padding-right:15px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.trending-article-right-side{margin-top:30px}}.trending-single-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:35px}.trending-single-item:first-child{margin-top:0}@media only screen and (max-width:767px){.trending-single-item{margin-top:20px}}.trending-single-item .trending-post-thum{max-width:160px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (max-width:479px){.trending-single-item .trending-post-thum{max-width:100px}}.trending-single-item .trending-post-thum img{height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover;border-radius:10px}.trending-single-item .trending-post-content{margin-left:30px}@media only screen and (max-width:479px){.trending-single-item .trending-post-content{margin-left:15px}}@media only screen and (min-width:992px) and (max-width:1199px){.trending-single-item .trending-post-content{margin-left:15px}}.trending-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px}@media only screen and (max-width:479px){.trending-blog-post-top{margin-bottom:10px}}.trending-blog-post-category{margin-right:25px}.trending-blog-post-category a{min-width:100px;text-align:center;padding:4px 5px;border-radius:10px;color:#fff;background: #ffc107;}@media only screen and (max-width:479px){.trending-blog-post-category{margin-right:15px}.trending-blog-post-category a{min-width:40px;font-size:12px;padding:2px 5px}}.trending-blog-post-author{color:#9b9ea1}.trending-blog-post-author a{color:#000}@media only screen and (max-width:479px){.trending-blog-post-author{font-size:12px}}.trending-blog-post-title{margin-bottom:15px}.trending-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.trending-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.trending-meta-left-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-meta-left-side span a:hover{color:#ffc4a0}.trending-meta-left-side span:last-child{padding-right:0;margin-right:0}.trending-meta-left-side span:last-child::after{display:none}.post-meta-right-side a{margin-left:10px}.large-banner-trending-article{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-banner-trending-article .trending-single-item{margin-top:45px}.large-banner-trending-article .trending-single-item:first-child{margin-top:15px}@media only screen and (min-width:992px) and (max-width:1199px){.large-banner-trending-article .trending-single-item{margin-top:25px}.large-banner-trending-article .trending-single-item:first-child{margin-top:5px}}@media only screen and (max-width:479px){.large-banner-trending-article .trending-single-item{margin-top:15px}}.trending-large-post-thum{max-width:315px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (max-width:767px){.trending-large-post-thum{max-width:160px}}@media only screen and (max-width:479px){.trending-large-post-thum{max-width:100px}}.trending-large-post-thum img{height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover;border-radius:10px}.trending-tody-content{margin-top:20px;margin-bottom:10px;margin-left:40px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-tody-content{margin-left:0}}@media only screen and (min-width:768px) and (max-width:991px){.trending-tody-content{margin-left:0}}@media only screen and (max-width:767px){.trending-tody-content{margin-left:0}}.trending-tody-post-author{color:#9b9ea1;margin-bottom:10px;font-size:18px}.trending-tody-post-author a{color:#5974ff}@media only screen and (max-width:479px){.trending-tody-post-author{font-size:12px}}.trending-tody-post-title{margin-bottom:20px;font-size:52px}@media only screen and (min-width:1200px) and (max-width:1499px){.trending-tody-post-title{font-size:42px}}@media only screen and (min-width:992px) and (max-width:1199px){.trending-tody-post-title{font-size:36px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-tody-post-title{font-size:26px;margin-bottom:10px}}@media only screen and (max-width:767px){.trending-tody-post-title{font-size:26px}}.trending-tody-content .dec{font-size:18px}.trending-tody-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;font-size:17px}.trending-tody-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.trending-tody-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#5974ff;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-tody-post-meta span a:hover{color:#5974ff}.trending-tody-post-meta span:last-child{padding-right:0;margin-right:0}.trending-tody-post-meta span:last-child::after{display:none}.trending-tody-swiper-pagination{margin-top:80px;text-align:center}.trending-tody-swiper-pagination .swiper-pagination-bullet{height:12px;width:12px;border-radius:5000px;background-color:#0f034a;margin:10px}.trending-tody-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#5974ff;border-radius:5000px}@media only screen and (max-width:767px){.trending-tody-swiper-pagination{margin-top:40px}}.trending-tody-two-box{background-color:#fff;padding:43px 40px;border-radius:15px;-webkit-transition:.3s ease-in-out;-o-transition:.3s ease-in-out;transition:.3s ease-in-out}.trending-tody-two-box .trending-tody-two-post-title{font-size:18px}.trending-tody-two-box:hover{background-color:#5138ee}.trending-tody-two-box:hover .trending-tody-two-post-author{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-author a{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-title{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-meta{color:#fff}.trending-tody-two-box:hover .trending-tody-two-post-meta span::after{background:#fff}.trending-tody-two-post-author{color:#9b9ea1;margin-bottom:12px;font-weight:500;-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-author a{color:#0f034a;-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}@media only screen and (max-width:479px){.trending-tody-two-post-author{font-size:12px}}.trending-tody-two-post-title{color:#0f034a}.trending-tody-two-post-title a{-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-title a:hover{color:#fff}.trending-tody-two-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px;color:#7e7e7e}.trending-tody-two-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:500}.trending-tody-two-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#0f034a;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.trending-tody-two-post-meta span a{-webkit-transition:0s ease-in-out;-o-transition:0s ease-in-out;transition:0s ease-in-out}.trending-tody-two-post-meta span a:hover{color:#5974ff}.trending-tody-two-post-meta span:last-child{padding-right:0;margin-right:0}.trending-tody-two-post-meta span:last-child::after{display:none}.trending-tody-two-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.trending-tody-two-slider-navigation .navigation-button{color:#0f034a;font-size:24px;height:20px;line-height:20px;background-color:transparent;border-radius:0}.trending-tody-two-slider-navigation .navigation-button.trending-tody-button-prev{margin-left:20px;padding-left:20px;border-left:1px solid #dadada}.from-following-hader-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:20px 0;border-top:1px solid #f3f3f3;border-bottom:1px solid #f3f3f3;margin-bottom:40px}@media only screen and (max-width:575px){.from-following-hader-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.from-following-hader-area .section-title{margin-bottom:20px}}.from-following-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:-0.5rem}.from-following-left-side{max-width:873px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}@media only screen and (min-width:992px) and (max-width:1199px){.from-following-left-side{max-width:650px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.from-following-left-side{min-width:100%;max-width:100%}}.from-following-right-side{max-width:335px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.following-post-thum{display:block}.following-post-thum img{border-radius:15px}.single-following-post{margin-bottom:40px}.following-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;margin-top:25px}@media only screen and (max-width:479px){.following-blog-post-top{margin-bottom:10px}}.following-blog-post-category{margin-right:25px}.following-blog-post-category a{min-width:100px;background:#ffebdf;text-align:center;padding:4px 5px;border-radius:10px}@media only screen and (max-width:479px){.following-blog-post-category{margin-right:15px}.following-blog-post-category a{min-width:40px;font-size:12px;padding:2px 5px}}.following-blog-post-author{color:#9b9ea1}.following-blog-post-author a{color:#000}@media only screen and (max-width:479px){.following-blog-post-author{font-size:12px}}.following-blog-post-title{margin-bottom:15px}.following-blog-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.following-meta-left-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.following-meta-left-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.following-meta-left-side span a:hover{color:#ffc4a0}.following-meta-left-side span:last-child{padding-right:0;margin-right:0}.following-meta-left-side span:last-child::after{display:none}.following-author-area{border:1px solid #f3f3f3;border-radius:10px;text-align:center;padding:30px 15px}.following-author-area .author-image{border:1px solid #f3f3f3;display:inline-block;border-radius:50000px;width:150px;height:150px;padding:11px;margin-bottom:25px}.following-author-area .author-image img{border-radius:50%;}.following-author-area .author-title{margin-bottom:20px}.following-author-area .author-details p{margin-bottom:20px}.following-author-area .author-post-share{margin-bottom:30px}.following-add-banner{margin-top:40px}.trending-topic-section-title{max-width:232px;padding:0 15px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-topic-section-title{max-width:200px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-topic-section-title{max-width:100%}}@media only screen and (max-width:767px){.trending-topic-section-title{max-width:100%}}.trending-topic-item-wrap{max-width:968px}@media only screen and (min-width:992px) and (max-width:1199px){.trending-topic-item-wrap{max-width:758px}}@media only screen and (min-width:768px) and (max-width:991px){.trending-topic-item-wrap{max-width:100%}}@media only screen and (max-width:767px){.trending-topic-item-wrap{max-width:100%}}.single-trending-topic-item{text-align:center}.single-trending-topic-item a{display:block;min-width:120px;max-width:100%;position:relative}.single-trending-topic-item a img{border-radius:15px;width:100%}.single-trending-topic-item a .title{position:absolute;bottom:20px;text-align:center;width:100%;color:#fff}.trending-topic-navigation{margin-bottom:20px}.trending-topic-navigation .navigation-button{background-color:#313438;color:#fff}.trending-topic-navigation .navigation-button:hover{background-color:#ffc4a0}.newsletter-subscribe-inner{background-color:#fff;padding:70px;border-radius:10px;position:relative;overflow:hidden}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-subscribe-inner{padding:70px 50px}}@media only screen and (max-width:767px){.newsletter-subscribe-inner{padding:60px 30px}}@media only screen and (max-width:575px){.newsletter-subscribe-inner{padding:60px 20px}}.newsletter-input-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:1;position:relative}.newsletter-input-box .newsletter-input{max-width:450px;width:100%;border:1px solid #ddd;border-radius:10px;margin-right:20px;padding:5px 15px;font-weight:500;height:60px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.newsletter-input-box .newsletter-input{max-width:300px}}@media only screen and (max-width:767px){.newsletter-input-box .newsletter-input{max-width:100%;margin-bottom:20px}}@media only screen and (max-width:767px){.newsletter-input-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.newsletter-inner-image .newsletter-image-01{position:absolute;bottom:0;left:18%;z-index:0}.newsletter-inner-image .newsletter-image-02{position:absolute;bottom:0;right:34px;z-index:0}.related-newsletter-box{background:url("../images/home-two-newsletter-bg.jpg");border-radius:10px;background-size:cover;background-position:center}.related-newsletter-inner-box{max-width:730px;margin:auto;text-align:center;padding:80px 15px}.related-newsletter-inner-box .title{color:#fff;font-size:44px;font-weight:bold}.related-newsletter-inner-box .title .normal-width{font-weight:500}@media only screen and (min-width:768px) and (max-width:991px){.related-newsletter-inner-box .title{font-size:30px}}@media only screen and (max-width:767px){.related-newsletter-inner-box .title{font-size:30px}}.related-newsletter-three-box{background:url("../images/home-three-newsletter-bg.jpg");border-radius:10px;background-size:cover;background-position:center;position:relative}.related-newsletter-three-inner-box{max-width:894px;text-align:left;padding:80px 100px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.related-newsletter-three-inner-box{padding:60px 40px}}@media only screen and (max-width:575px){.related-newsletter-three-inner-box{padding:60px 40px 100px}}.related-newsletter-three-inner-box .title{color:#fff;font-weight:bold;font-size:44px}.related-newsletter-three-inner-box .title .normal-width{font-weight:500}@media only screen and (min-width:768px) and (max-width:991px){.related-newsletter-three-inner-box .title{font-size:30px}}@media only screen and (max-width:767px){.related-newsletter-three-inner-box .title{font-size:30px}}.subscribe-today-update{position:absolute;bottom:60px;right:70px;width:250px}.subscribe-today-update .today-update-text{font-size:28px;color:#fff;font-weight:400}.subscribe-today-update .today-update-text span{font-weight:600}@media only screen and (min-width:768px) and (max-width:991px){.subscribe-today-update{right:40px}.subscribe-today-update .today-update-text{font-size:22px}}@media only screen and (max-width:767px){.subscribe-today-update{right:20px}.subscribe-today-update .today-update-text{font-size:18px}}@media only screen and (max-width:575px){.subscribe-today-update{left:45px;bottom:30px;width:150px}.subscribe-today-update .today-update-text{font-size:18px}}.newsletter-four-box{background:url("../images/home-four-newsletter-bg.jpg");border-radius:10px;background-size:cover;background-position:center;background-color:#fff;padding:70px;border-radius:15px;position:relative;overflow:hidden}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box{padding:70px 50px}}@media only screen and (max-width:767px){.newsletter-four-box{padding:60px 30px}}@media only screen and (max-width:575px){.newsletter-four-box{padding:60px 20px}}.newsletter-four-box .title{color:#fff;font-weight:500;margin-bottom:10px;font-size:44px}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box .title{font-size:36px}}@media only screen and (max-width:767px){.newsletter-four-box .title{font-size:30px}}.newsletter-four-box p{color:#fff;font-size:25px}@media only screen and (min-width:768px) and (max-width:991px){.newsletter-four-box p{font-size:20px}}@media only screen and (max-width:767px){.newsletter-four-box p{font-size:18px}}.newsletter-four-box .newsletter-input-box{margin-top:30px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.newsletter-four-box .newsletter-input-box .newsletter-input{background:transparent;border:1px solid #fff;color:#fff;border-radius:15px;padding:0 30px}.newsletter-four-box .newsletter-input-box .newsletter-input::-webkit-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input:-ms-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::-moz-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::-ms-input-placeholder{color:#fff}.newsletter-four-box .newsletter-input-box .newsletter-input::placeholder{color:#fff}.newsletter-inner-image .newsletter-image-01{position:absolute;bottom:0;left:18%;z-index:0}.newsletter-inner-image .newsletter-image-02{position:absolute;bottom:0;right:34px;z-index:0}.featured-video-col-8{max-width:847px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:1200px) and (max-width:1499px){.featured-video-col-8{max-width:846px;width:100%}}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.featured-video-col-8{max-width:100%}}.latest-post-col-4{max-width:363px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:1200px) and (max-width:1499px){.latest-post-col-4{max-width:360px;width:100%}}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.latest-post-col-4{max-width:100%}}.featured-video-haader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:575px){.featured-video-haader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}}.featured-video-list .featured-video-list-item{padding-right:40px;margin-right:25px;position:relative}@media only screen and (max-width:767px){.featured-video-list .featured-video-list-item{padding-right:25px;margin-right:8px}}@media only screen and (max-width:575px){.featured-video-list .featured-video-list-item{margin-top:20px}}.featured-video-list .featured-video-list-item::after{position:absolute;right:0;top:50%;content:'\eab8';font-family:IcoFont;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.featured-video-list .featured-video-list-item .featured-video-link{font-weight:600}.featured-video-list .featured-video-list-item .featured-video-link.active{color:#ffc4a0}.featured-video-list .featured-video-list-item:last-child{padding-right:0;margin-right:0}.featured-video-list .featured-video-list-item:last-child::after{display:none}.single-featured-video-item{margin-bottom:30px}.featured-blog-post-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px;margin-top:25px}@media only screen and (max-width:479px){.featured-blog-post-top{margin-bottom:10px}}.featured-blog-post-top .post-meta-right-side{margin-left:30px}@media only screen and (max-width:767px){.featured-blog-post-top .read-time{display:none}}.latest-post-inner-wrap{padding:30px 24px;background:#fafafa;border-radius:10px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.latest-post-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.latest-post-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.latest-post-slider-navigation .navigation-button{background-color:#222;color:#fff}.latest-post-slider-navigation .navigation-button:hover{background-color:#ffc4a0}.single-latest-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px){.single-latest-post{width:50%;padding-right:15px}}.latest-post-thum{-webkit-flex-basis:0 0 auto;-ms-flex-preferred-size:0 0 auto;flex-basis:0 0 auto;min-width:84px}.latest-post-thum a img{border-radius:10px;height: 66px;}.latest-post-content{margin-left:20px}.latest-post-content .title{margin-top:0;font-size:15px}.latest-post-content .latest-post-meta{font-size:12px;margin-top:10px}.latest-post-content .latest-post-meta span{position:relative;padding-right:6px;margin-right:6px}.latest-post-content .latest-post-meta span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.latest-post-content .latest-post-meta span a:hover{color:#ffc4a0}.latest-post-content .latest-post-meta span:last-child{padding-right:0;margin-right:0}.latest-post-content .latest-post-meta span:last-child::after{display:none}.stay-in-touch-area{margin-top:30px;padding:30px 24px;background:#fafafa;border-radius:10px;text-align:center}.stay-in-touch-box{margin-top:30px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.single-touch-col{width:33.333%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-left:5px;padding-right:5px}.single-touch{background-color:#ebebeb;width:100%;margin-bottom:10px;text-align:center;border-radius:10px;padding:14px 10px}.single-touch.facebook .touch-socail-icon{background:#4867AA}.single-touch.twitter .touch-socail-icon{background:#1DA1F2}.single-touch.behance .touch-socail-icon{background:#1869FF}.single-touch.youtube .touch-socail-icon{background:#FE0000}.single-touch.dribbble .touch-socail-icon{background:#EA4C8A}.single-touch.linkedin .touch-socail-icon{background:#007BB6}.single-touch p{color:#000;font-size:12px}.single-touch:hover.facebook{background:#4867AA}.single-touch:hover.facebook .touch-socail-icon{color:#4867AA;background:#fff}.single-touch:hover.twitter{background:#1DA1F2}.single-touch:hover.twitter .touch-socail-icon{color:#1DA1F2;background:#fff}.single-touch:hover.behance{background:#1869FF}.single-touch:hover.behance .touch-socail-icon{color:#1869FF;background:#fff}.single-touch:hover.youtube{background:#FE0000}.single-touch:hover.youtube .touch-socail-icon{color:#FE0000;background:#fff}.single-touch:hover.dribbble{background:#EA4C8A}.single-touch:hover.dribbble .touch-socail-icon{color:#EA4C8A;background:#fff}.single-touch:hover.linkedin{background:#007BB6}.single-touch:hover.linkedin .touch-socail-icon{color:#007BB6;background:#fff}.single-touch:hover p{color:#fff}.touch-socail-icon{height:40px;width:40px;text-align:center;line-height:40px;margin:auto;margin-bottom:5px;border-radius:100%;color:#fff}.recent-reading-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px 0;border-top:1px solid #f3f3f3;border-bottom:1px solid #f3f3f3}@media only screen and (max-width:575px){.recent-reading-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:self-end;-webkit-align-items:self-end;-ms-flex-align:self-end;align-items:self-end}}.recent-reading-header .recent-article-date{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-reading-header .recent-article-date .date-button{margin-left:15px;height:48px;width:48px;line-height:48px;text-align:center;background-color:#f8f7fc;border-radius:10px}.single-recent-reading-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:40px}.recent-reading-post-thum{width:120px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.recent-reading-post-author{color:#9b9ea1;margin-bottom:10px}.recent-reading-post-author a{color:#000}.recent-reading-post-content{margin-left:25px}@media only screen and (max-width:575px){.recent-reading-post-content{margin-left:10px}}.recent-reading-post-meta{font-size:12px;margin-top:10px}.recent-reading-post-meta span{position:relative;padding-right:10px;margin-right:10px}.recent-reading-post-meta span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.recent-reading-post-meta span a:hover{color:#ffc4a0}.recent-reading-post-meta span:last-child{padding-right:0;margin-right:0}.recent-reading-post-meta span:last-child::after{display:none}.archive-search-box{position:relative;margin-top:20px}.archive-search-box .search-input{width:100%;background-color:#f8f7fc;border-radius:10px;position:relative;border:0;font-weight:500;padding:16px 40px 16px 30px}.archive-search-box .search-button{position:absolute;top:50%;right:0;background-color:transparent;color:#5974ff;padding:10px 15px;border:0;font-size:20px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.archive-post-inner-wrap{border-radius:10px;max-width:300px;margin-left:auto}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.archive-post-inner-wrap{max-width:100%;margin-top:60px}}.single-archive-post{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:20px}.archive-post-thum{-webkit-flex-basis:0 0 auto;-ms-flex-preferred-size:0 0 auto;flex-basis:0 0 auto;min-width:84px}.archive-post-thum a img{border-radius:10px}.archive-post-content{margin-left:20px}.archive-post-content .title{margin-top:0;font-size:15px}.archive-post-content .archive-post-meta{font-size:12px;margin-top:10px}.archive-post-content .archive-post-meta span{position:relative;padding-right:6px;margin-right:6px}.archive-post-content .archive-post-meta span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.archive-post-content .archive-post-meta span a:hover{color:#ffc4a0}.archive-post-content .archive-post-meta span:last-child{padding-right:0;margin-right:0}.archive-post-content .archive-post-meta span:last-child::after{display:none}.follow-us-box{margin-top:20px}.single-follow-col{margin-bottom:15px}.single-follow{background-color:#f8f7fc;padding:10px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border-radius:15px;padding:17px 20px}.single-follow i{margin-right:5px}.single-follow .socail-title{font-weight:600}.single-follow:hover{background-color:#5974ff;color:#fff}.single-follow:hover .follow-share-onover .follow-title{opacity:0;visibility:hidden}.single-follow:hover .follow-share-onover .follow-hover{opacity:1;visibility:visible;color:#fff}.single-follow:hover .follow-socail-icon{color:#fff}.follow-share-onover{position:relative}.follow-share-onover p{margin-bottom:0;position:absolute;right:0;-webkit-transition:all .3s ease-in;-o-transition:all .3s ease-in;transition:all .3s ease-in;color:#000}.follow-share-onover .follow-title{opacity:1;visibility:visible}.follow-share-onover .follow-hover{opacity:0;visibility:hidden}.bottom-add-banner-box{position:relative}.bottom-add-banner-boxa{display:block}@media only screen and (max-width:767px){.bottom-add-banner-box img{height:100px;-o-object-fit:cover;object-fit:cover;border-radius:10px}}.bottom-add-text{font-size:25px;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:50px;display:inline-block}.bottom-add-text span{display:block;font-size:32px;text-align:left;margin-top:3px}@media only screen and (max-width:767px){.bottom-add-text{font-size:16px}.bottom-add-text span{font-size:18px}}.single-most-populer-item{margin-top:40px}.most-populer-thum{display:block}.most-populer-thum img{border-radius:10px;width:100%}.most-populer-content{margin-top:25px}.most-populer-content .title{color:#0f034a;margin-top:10px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.most-populer-content .most-populer-post-meta{margin-top:10px}.most-populer-content .most-populer-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#0f034a}.most-populer-content .most-populer-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.most-populer-content .most-populer-post-meta>span:last-child{padding-right:0;margin-right:0}.most-populer-content .most-populer-post-meta>span:last-child::after{display:none}.most-populer-post-author{color:#9b9ea1;font-weight:600}.most-populer-post-author a{color:#0f034a}.most-popular-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.most-popular-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:1px solid #e7e5ed;text-align:center;font-size:25px;border-radius:10px;color:#0f034a;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.most-popular-slider-navigation .navigation-button.popular-swiper-button-next{margin-left:10px}.most-popular-slider-navigation .navigation-button:hover{border:1px solid #ff7d6b;background-color:#ff7d6b;color:#fff}.special-banner-blog-post .single-special-banner-post{border-bottom:1px solid #e3e3e3;padding-bottom:30px}.special-banner-blog-post .single-special-banner-post:last-child{border-bottom:0}.recent-article-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-article-header .recent-article-date{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.recent-article-header .recent-article-date .date-button{margin-left:15px;height:48px;width:48px;line-height:48px;text-align:center;background-color:#f4f4f4;border-radius:10px}@media only screen and (max-width:575px){.recent-article-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.recent-article-header .recent-article-date{margin-top:10px}}.section-border-bottom{border-bottom:1px solid #e3e3e3;padding-bottom:30px}.recent-article-header-two{padding-top:60px;margin-top:60px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:767px){.recent-article-header-two{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.recent-article-header-two .input-search-box{position:relative;width:340px}.recent-article-header-two .input-search-box .input{border:1px solid #ddd;border-radius:15px;position:relative;height:60px;padding:15px 50px 15px 30px;font-weight:500;width:100%}.recent-article-header-two .input-search-box .submit-button{position:absolute;right:15px;height:60px;background:transparent;border:0}@media only screen and (max-width:767px){.recent-article-header-two .input-search-box{width:300px;margin-top:30px}}.single-recent-article-item{margin-top:45px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:575px){.single-recent-article-item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.recent-article-thum{display:block;max-width:360px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.recent-article-thum{max-width:300px}}@media only screen and (min-width:768px) and (max-width:991px){.recent-article-thum{max-width:300px}}@media only screen and (max-width:767px){.recent-article-thum{max-width:200px}}@media only screen and (max-width:575px){.recent-article-thum{max-width:100%}}.recent-article-thum img{border-radius:10px;width:100%;height:100%;vertical-align:middle;-o-object-fit:cover;object-fit:cover}.recent-article-content{margin-left:35px;margin-top:15px}@media only screen and (max-width:575px){.recent-article-content{margin-left:0;margin-top:30px}}.recent-article-content .title{color:#0f034a;margin-top:10px}.recent-article-content .recent-article-post-meta{margin-top:10px}.recent-article-content .recent-article-post-meta>span{position:relative;padding-right:10px;margin-right:10px;font-size:13px;color:#0f034a}.recent-article-content .recent-article-post-meta>span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.recent-article-content .recent-article-post-meta>span:last-child{padding-right:0;margin-right:0}.recent-article-content .recent-article-post-meta>span:last-child::after{display:none}.recent-article-post-author{color:#9b9ea1;font-weight:600}.recent-article-post-author a{color:#0f034a}.recent-post-right-area{padding-left:26px}.trusted-partners-box{padding:80px 100px;background-color:#f4eaff;border-radius:15px}.trusted-partners-box .trusted-partners-slider-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (min-width:992px) and (max-width:1199px){.trusted-partners-box{padding:60px 80px}}@media only screen and (min-width:768px) and (max-width:991px){.trusted-partners-box{padding:60px 40px}}@media only screen and (max-width:767px){.trusted-partners-box{padding:60px 30px}}.trusted-partners-area{padding:60px 0}.partners-swiper-pagination{margin-top:40px;text-align:center}.partners-swiper-pagination .swiper-pagination-bullet{height:14px;width:14px;border-radius:100%;background-color:#8b61b7;margin:8px}.partners-swiper-pagination .swiper-pagination-bullet.swiper-pagination-bullet-active{background-color:#0f034a;border-radius:100%}.single-platform-box{background-color:#fafafa;padding:40px;border-radius:10px;margin-top:30px}@media only screen and (max-width:575px){.single-platform-box{padding:40px 20px}}.platform-icon{background-color:#ffc4a0;display:inline-block;height:90px;width:90px;line-height:90px;text-align:center;border-radius:10px;margin-bottom:20px}.platform-content .title{margin-bottom:20px}.platform-d-flex{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:767px){.platform-d-flex{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.platform-content-box{max-width:300px;padding-right:20px}@media only screen and (min-width:992px) and (max-width:1199px){.platform-content-box{max-width:250px}}@media only screen and (max-width:767px){.platform-content-box{max-width:100%;margin-bottom:30px}}.plateform-image-box{margin-left:30px}@media only screen and (max-width:767px){.plateform-image-box{margin-left:0}}.bunzo-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-top:1px solid #ddd;border-bottom:1px solid #ddd}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.bunzo-row{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;border-bottom:0}}.bunzo-col-6{width:50%;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;border-left:1px solid #ddd;height:100%}.bunzo-col-6:first-child{border-left:none}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.bunzo-col-6{width:100%;border-right:0;border-bottom:1px solid #ddd}}.bunzo-history-title{font-size:62px;font-weight:300;margin-right:30px;margin-top:30px;margin-bottom:30px}.bunzo-history-title .f-w-bold{font-weight:600}@media only screen and (min-width:992px) and (max-width:1199px){.bunzo-history-title{font-size:42px}}@media only screen and (min-width:768px) and (max-width:991px){.bunzo-history-title{font-size:42px}}@media only screen and (max-width:767px){.bunzo-history-title{font-size:22px}}.single-history-item{border-bottom:1px solid #ddd;padding:60px 0 60px 90px}.single-history-item:last-child{border-bottom:0}@media only screen and (min-width:992px) and (max-width:1199px),only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-history-item{padding:30px 30px 30px 30px;border-right:1px solid #ddd}}.plateforem-image{position:relative}.plateforem-image .platform-box-button{position:absolute;width:100%;bottom:30px;text-align:center;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.single-team-area{position:relative;overflow:hidden;margin-top:40px}.single-team-area .team-thum img{width:100%}.single-team-area:hover .team-content{opacity:1;visibility:visible}.single-team-area:hover .team-share-top{margin-top:20px}.single-team-area:hover .team-member-info{margin-bottom:20px}.team-content{opacity:0;visibility:hidden;position:absolute;height:100%;width:100%;top:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;text-align:center;border-radius:10px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out;background:-webkit-linear-gradient(bottom,rgba(0,0,0,0.9) 0,rgba(253,195,158,0.9) 100%)}.team-share-top{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:0;-webkit-transition:all .4s ease-in-out;-o-transition:all .4s ease-in-out;transition:all .4s ease-in-out}.shate-action-button{margin-left:20px;height:40px;width:40px;line-height:40px;background-color:#fff;border-radius:10px;text-align:center;font-weight:600}.shate-action-button:hover{background-color:#222;color:#fff}.team-social-share{text-align:right;margin-right:20px}.team-social-share li{display:inline-block;margin:0 3px}.team-social-share li a{height:40px;width:40px;line-height:40px;background-color:#fff;border-radius:10px;text-align:center}.team-social-share li a:hover{background-color:#222;color:#fff}.team-member-info{margin-bottom:0;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.team-member-info .name-title{color:#fff}.team-member-info .desination{color:#ffc4a0}.blog-details-col-8{max-width:847px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-8{max-width:603px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.blog-details-col-8{max-width:100%}}.blog-details-col-4{max-width:363px;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-4{max-width:363px}}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.blog-details-col-4{max-width:100%}}@media only screen and (min-width:992px) and (max-width:1199px){.blog-details-col-4 .single-latest-post{width:100%;padding-right:0}}.blog-details-meta-box{margin-top:20px;margin-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.blog-details-meta-box .post-meta-left-side,.blog-details-meta-box .post-mid-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.blog-details-meta-box .post-mid-side span{position:relative;padding-right:10px;margin-right:10px;font-size:13px}.blog-details-meta-box .post-mid-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.blog-details-meta-box .post-mid-side span a:hover{color:#ffc4a0}.blog-details-meta-box .post-mid-side span:last-child{padding-right:0;margin-right:0}.blog-details-meta-box .post-mid-side span:last-child::after{display:none}@media only screen and (max-width:767px){.blog-details-meta-box{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.blockquote-box{background-color:#fafafa;padding:60px 60px;text-align:center;position:relative;margin-top:30px}.blockquote-box::before{color:#ffc4a0;font-size:106px;position:absolute;content:"“";height:auto;width:105px;line-height:100px;top:30px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.blockquote-box .blockquote-text{font-size:20px;font-weight:600;margin-top:30px}@media only screen and (max-width:767px){.blockquote-box{padding:60px 30px}.blockquote-box .blockquote-text{font-size:16px}}.blog-details-tag-and-share-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:30px}@media only screen and (max-width:767px){.blog-details-tag-and-share-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.blog-details-tag-and-share-area .social-share-area{margin-top:30px}}.related-post-thum img{width:100%}.comment-form-area{margin-top:30px}.comment-form-area .single-input{margin-bottom:20px}.comment-form-area .single-input input,.comment-form-area .single-input textarea{border:1px solid #efefef;border-radius:5px;width:100%;padding:15px 30px;background-color:#fafafa}.comment-form-area .single-input textarea{height:280px}.blog-details-two-header{max-width:800px;text-align:center;margin:auto;margin-top:40px}.blog-details-two-post-title{margin-bottom:25px;font-size:32px;font-weight:bold;color:#0f034a}.blog-details-two-post-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:20px}@media only screen and (max-width:479px){.blog-details-two-post-meta{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.blog-details-two-post-meta span{position:relative;padding-right:15px;margin-right:15px;font-size:13px;font-weight:600}.blog-details-two-post-meta span::after{position:absolute;content:"";right:-5px;top:50%;height:4px;width:4px;background:#091d40;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.blog-details-two-post-meta span a:hover{color:#5974ff}.blog-details-two-post-meta span:last-child{padding-right:0;margin-right:0}.blog-details-two-post-meta span:last-child::after{display:none}.blog-details-two-post-author{color:#9b9ea1}.blog-details-two-post-author a{color:#091d40}@media only screen and (max-width:479px){.blog-details-two-post-author{font-size:12px}}.blog-details-two-tags a{margin-left:10px;margin-right:10px;margin-top:20px;height:40px;border-radius:10px;line-height:40px}.blog-details-two-post-text .title{color:#0a1e43}.table-content-list .table-content-item{position:relative;padding:20px;padding-left:50px;background-color:transparent;border-radius:15px;border:1px solid #eee;margin-bottom:10px;font-weight:600;color:#5138ee;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.table-content-list .table-content-item:hover{background-color:#eeee}.table-content-list .table-content-item::before{content:'\ea98';position:absolute;left:20px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-family:IcoFont;color:#0a1e43}.blockquote-box-two{margin-top:40px;margin-bottom:40px;background-color:#5138ee;padding:80px 60px;text-align:center}.blockquote-box-two h4{font-size:44px;color:#fff;font-weight:500}.blockquote-box-two h4 .bold{font-weight:600}@media only screen and (min-width:768px) and (max-width:991px){.blockquote-box-two{padding:60px 30px}.blockquote-box-two h4{font-size:30px}}@media only screen and (max-width:767px){.blockquote-box-two{padding:60px 30px}.blockquote-box-two h4{font-size:26px}}.blog-post-author{color:#9b9ea1;margin-left:15px}.blog-post-author a{color:#000}.blog-details-two-share-area{margin-top:40px;border-top:1px solid #ddd;border-bottom:1px solid #ddd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px 50px}@media only screen and (max-width:767px){.blog-details-two-share-area{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:15px 10px}.blog-details-two-share-area .share-title{margin-bottom:20px}}.related-post-two-slider-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.related-post-two-slider-navigation .navigation-button{width:50px;height:50px;line-height:45px;border:2px solid #e0dfe6;text-align:center;background-color:transparent;font-size:25px;border-radius:10px;color:#0f034a;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.related-post-two-slider-navigation .navigation-button.popular-swiper-button-next{margin-left:10px}.related-post-two-slider-navigation .navigation-button:hover{border:1px solid #5138ee;background-color:#5138ee;color:#fff}.comment-list-wrapper{margin-bottom:60px}.comment-list-wrapper .widget-title{color:#0a1e43}.comment-list{margin:0;padding:0}.comment-list .comment-2,.comment-list .comment-reply-wrap{border:1px solid #eee;padding:30px;border-radius:10px}.comment-list .comment-author-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.comment-list .comment{list-style-type:none;padding:10px 0}.comment-list .comment:last-child{padding-bottom:0}.comment-list .comment-author img{border-radius:50px;width:120px}.comment-list .comment-content{position:relative;overflow:hidden;margin-left:20px;width:100%}.comment-list .meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:767px){.comment-list .meta{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}}.comment-list .meta .fn{font-size:22px;text-transform:uppercase;color:#0a1e43;display:block;margin-bottom:0}@media only screen and (max-width:767px){.comment-list .meta .fn{font-size:18px}}.comment-list .meta .comment-datetime{position:relative;display:inline-block;font-size:14px;color:#ababab;margin-top:10px}.comment-list .meta .separator{padding:0 10px}.comment-list .meta .time{color:#5138ee}.comment-list .comment-author.vcard{padding:8px;border:1px solid #dfeee5;border-radius:100%}.comment-list .comment-actions a{margin-right:20px;font-weight:500;color:#333}.comment-list .comment-actions a:hover{color:#5138ee}.comment-list .comment-reply-link{background-color:#f8f8f8;height:45px;line-height:45px;color:#5138ee;font-weight:600;border-radius:10px;padding:0 20px}.comment-list .comment-reply-link i{margin-right:10px}@media only screen and (max-width:767px){.comment-list .comment-reply-link{margin-top:5px}}.comment-list .children{margin:20px 0 20px 100px;padding:0}@media only screen and (max-width:767px){.comment-list .children{margin:40px 0 20px 30px}}.comment-list .children li+li{margin-top:0}.comment-list .comment-text{margin-top:15px}.comment-submit-btn .ht-btn{padding:0 54px}.messonry-button{border-bottom:1px solid #eee;padding-bottom:20px;padding-top:20px;border-top:1px solid #eee}.messonry-button button{background-color:transparent;border:0;font-weight:600;padding-left:35px;margin-left:30px;position:relative}.messonry-button button.is-checked{color:#ffc4a0}.messonry-button button::before{color:#222;content:'';height:6px;width:6px;background:#222;border-radius:5000px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);position:absolute;left:0}.messonry-button button:first-child{padding-left:0;margin-left:0}.messonry-button button:first-child::before{display:none}.author-blog-post-content .post-right-side{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.author-blog-post-content .post-right-side span{position:relative;padding-right:15px;margin-right:15px;font-size:13px}.author-blog-post-content .post-right-side span::after{position:absolute;content:"";right:-0px;top:50%;height:4px;width:4px;background:#000;border-radius:50000px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.author-blog-post-content .post-right-side span a:hover{color:#ffc4a0}.author-blog-post-content .post-right-side span:last-child{padding-right:0;margin-right:0}.author-blog-post-content .post-right-side span:last-child::after{display:none}@media only screen and (max-width:767px){.author-blog-post-content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.author-blog-post-wrap{margin-bottom:30px}.author-post-bottom-area{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-top:1px solid #eee;border-bottom:1px solid #eee;margin-top:20px}.author-blog-thum{display:block}.author-blog-thum img{width:100%}.author-post-action-box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 20px;margin:20px 0}@media only screen and (max-width:575px){.author-post-action-box{padding:0}}.author-post-action-box .author-action{margin-right:10px;margin-left:10px}.faq-box-wrap{margin-top:100px;margin-bottom:100px;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.faq-section-title{margin-top:30px}.faq-section-title .title{font-size:62px;font-weight:400;margin-top:100px;margin-right:30px}.faq-section-title .title .bold-text{font-weight:600;display:block}@media only screen and (min-width:992px) and (max-width:1199px){.faq-section-title .title{font-size:52px;margin-top:50px}}@media only screen and (min-width:768px) and (max-width:991px){.faq-section-title .title{font-size:48px;margin-top:50px}}@media only screen and (max-width:767px){.faq-section-title .title{font-size:42px;margin-top:50px}}@media only screen and (max-width:575px){.faq-section-title .title{font-size:32px;margin-top:50px}}.faq-content-wrap{border-left:1px solid #ddd}.faq-qustion{background:transparent;border:0;font-weight:600;padding:40px 0 40px 40px;font-size:20px}@media only screen and (max-width:575px){.faq-qustion{font-size:14px;padding:20px 0 20px 10px}}.faq-qustion::after{display:none}.faq-qustion:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}.faq-qustion .number-of-accordion{min-height:46px;min-width:46px;text-align:center;line-height:46px;background-color:#f4f4f4;border-radius:10px;margin-right:20px;font-size:15px}.faq-qustion:not(.collapsed){background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#000}.faq-qustion:not(.collapsed) .number-of-accordion{background-color:#ffc4a0;color:#fff}.accordion-item{border-top:0;border-left:none;border-right:0;border-bottom:2px solid #ddd}.accordion-item:last-child{border-bottom:0}.faq-ans{padding:0 0 40px 100px}@media only screen and (max-width:575px){.faq-ans{padding:0 0 20px 10px}}.office-img{margin-top:30px;padding:30px;background:#f7f7f7;border-radius:15px;position:relative}.office-img img{border-radius:15px}.office-img .office-title{position:absolute;bottom:60px;text-align:center;left:50%;display:inline-block;background-color:#333;border-radius:15px;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);color:#fff;padding:10px 40px;border:4px solid rgba(255,255,255,0.8)}.single-office-info{margin-top:30px;padding:40px 55px;border:1px solid #ddd;border-radius:15px;background-color:transparent}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.single-office-info{padding:30px 25px}}.single-office-info .single-contact-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.single-office-info .single-contact-info:last-child{margin-bottom:0}.single-office-info .single-contact-info .icon{min-height:45px;min-width:45px;line-height:45px;border-radius:10px;margin-right:20px;text-align:center;background-color:#f4f4f4}.single-office-info-wrap:hover .office-title{background-color:#ffc4a0;color:#222}.single-office-info-wrap:hover .single-office-info{border-color:#ffc4a0}.contact-from .section-title .title{font-size:40px}@media large-mobile{.contact-from .section-title .title{font-size:30px}}.single-input-box{margin-bottom:20px}.single-input-box input,.single-input-box textarea{border:1px solid #efefef;width:100%;padding:10px 30px;border-radius:10px;background-color:#fafafa}.single-input-box textarea{height:200px}.single-input-box:hover input,.single-input-box:hover textarea{background-color:transparent}.contact-us-map iframe{height:664px;width:100%;border-radius:15px}.error-404-area{padding:100px 0;position:relative}@media only screen and (min-width:768px) and (max-width:991px){.error-404-area{padding:80px 0}}@media only screen and (max-width:767px){.error-404-area{padding:60px 0}}.error-text{text-align:center;max-width:600px;margin:auto;margin-top:50px}.error-text h5{color:#ffc4a0;margin-bottom:20px}.error-area-shap{position:absolute;bottom:0;left:100px}@media only screen and (min-width:768px) and (max-width:991px){.error-area-shap{left:40px}}@media only screen and (max-width:767px){.error-area-shap{display:none}}.share-thinking-title{background-color:#f5f5f5;padding:40px;border-radius:15px}.share-thinking-title .title{font-size:28px}.title-write{background-color:#f5f5f5;padding:20px;border-radius:15px;margin-top:30px}.write-content-box{border:1px solid #f5f5f5;padding:20px;border-radius:15px;margin-top:30px}.post-write-tag a{position:relative;padding-right:10px}.post-write-tag a::after{content:","}.post-write-tag a:last-child::after{content:""}.post-write-trams{padding:0 20px}.single-trams{margin-bottom:20px}.single-trams .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:15px}.single-trams .title .form-check-label{margin-left:10px;font-weight:600;font-size:18px}.form-check-input:checked{background-color:#ffc4a0;border-color:#ffc4a0}.form-check-input:focus{border-color:transparent;outline:0;-webkit-box-shadow:none;box-shadow:none}.conditon-buttom-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-top:50px}@media only screen and (min-width:768px) and (max-width:991px),only screen and (max-width:767px){.conditon-buttom-wrap{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.conditon-note{color:#8e8f91;max-width:600px}@media only screen and (min-width:992px) and (max-width:1199px){.conditon-note{max-width:500px}}.conditon-note .title{font-weight:600;color:#000}.login-content form>input{width:100%;background-color:#fff;padding:1px 20px;color:#000;line-height:47px;border:0;border-radius:10px;margin-bottom:25px;border:1px solid #ddd}.remember-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.remember-wrap p{margin-bottom:0}.remember-forget-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between} /**商品**/ #baguetteBox-overlay{display:none;opacity:0;position:fixed;overflow:hidden;top:0;left:0;width:100%;height:100%;z-index:1000000;background-color:#222;background-color:rgba(0,0,0,.8);transition:opacity .5s ease}#baguetteBox-overlay.visible{opacity:1}#baguetteBox-overlay .full-image{display:inline-block;position:relative;width:100%;height:100%;text-align:center}#baguetteBox-overlay .full-image figure{display:inline;margin:0;height:100%}#baguetteBox-overlay .full-image img{display:inline-block;width:auto;height:auto;max-height:100%;max-width:100%;vertical-align:middle;box-shadow:0 0 8px rgba(0,0,0,.6)}#baguetteBox-overlay .full-image figcaption{display:block;position:absolute;bottom:0;width:100%;text-align:center;line-height:1.8;white-space:normal;color:#ccc;background-color:#000;background-color:rgba(0,0,0,.6);font-family:sans-serif}#baguetteBox-overlay .full-image:before{content:"";display:inline-block;height:50%;width:1px;margin-right:-1px}#baguetteBox-slider{position:absolute;left:0;top:0;height:100%;width:100%;white-space:nowrap;transition:left .4s ease,-webkit-transform .4s ease;transition:left .4s ease,transform .4s ease;transition:left .4s ease,transform .4s ease,-webkit-transform .4s ease}#baguetteBox-slider.bounce-from-right{-webkit-animation:d .4s ease-out;animation:d .4s ease-out}#baguetteBox-slider.bounce-from-left{-webkit-animation:e .4s ease-out;animation:e .4s ease-out}@-webkit-keyframes d{0%,to{margin-left:0}50%{margin-left:-30px}}@keyframes d{0%,to{margin-left:0}50%{margin-left:-30px}}@-webkit-keyframes e{0%,to{margin-left:0}50%{margin-left:30px}}@keyframes e{0%,to{margin-left:0}50%{margin-left:30px}}.baguetteBox-button#next-button,.baguetteBox-button#previous-button{top:50%;top:calc(50% - 30px);width:44px;height:60px}.baguetteBox-button{position:absolute;cursor:pointer;outline:0;padding:0;margin:0;border:0;border-radius:15%;background-color:#323232;background-color:rgba(50,50,50,.5);color:#ddd;font:1.6em sans-serif;transition:background-color .4s ease}.baguetteBox-button:focus,.baguetteBox-button:hover{background-color:rgba(50,50,50,.9)}.baguetteBox-button#next-button{right:2%}.baguetteBox-button#previous-button{left:2%}.baguetteBox-button#close-button{top:20px;right:2%;right:calc(2% + 6px);width:30px;height:30px}.baguetteBox-button svg{position:absolute;left:0;top:0}.baguetteBox-spinner{width:40px;height:40px;display:inline-block;position:absolute;top:50%;left:50%;margin-top:-20px;margin-left:-20px}.baguetteBox-double-bounce1,.baguetteBox-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#fff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:f 2s infinite ease-in-out;animation:f 2s infinite ease-in-out}.baguetteBox-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes f{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes f{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}body,html{height:100%;width:100%}.sp-loading{text-align:center;max-width:270px;padding:15px;font-size:12px;color:#888}.sp-loading,.sp-wrap{border:5px solid #eee;border-radius:3px}.sp-wrap{display:none;line-height:0;font-size:0;background:#eee;position:relative;margin:0 25px 15px 0;float:left;}.sp-thumbs{text-align:left;display:inline-block}.sp-thumbs img{min-height:50px;min-width:50px;max-width:50px}.sp-thumbs a:link,.sp-thumbs a:visited{width:50px;height:50px;overflow:hidden;opacity:.3;display:inline-block;background-size:cover;background-position:50%;transition:all .2s ease-out}.sp-thumbs a:hover{opacity:1}.sp-current,.sp-thumbs a:active{opacity:1!important;position:relative}.sp-large{position:relative;overflow:hidden;top:0;left:0}.sp-large a img{max-width:100%;height:auto}.sp-large a{display:block}.sp-zoom{position:absolute;left:-50%;top:-50%;cursor:zoom-in;display:none}.sp-lightbox{position:fixed;top:0;left:0;height:100%;width:100%;background:#000;background:rgba(0,0,0,.9);z-index:1031;display:none;cursor:pointer}.sp-lightbox img{position:absolute;margin:auto;top:0;bottom:0;left:0;right:0;max-width:90%;max-height:90%;border:2px solid #fff}#sp-next,#sp-prev{position:absolute;top:50%;margin-top:-25px;z-index:501;color:#fff;padding:14px;text-decoration:none;background:#000;border-radius:25px;border:2px solid #fff;width:50px;height:50px;box-sizing:border-box;transition:.2s}#sp-prev{left:10px}#sp-prev:before{content:"";border:7px solid transparent;border-right:15px solid #fff;position:absolute;top:16px;left:7px}#sp-next{right:10px}#sp-next:before{content:"";border:7px solid transparent;border-left:15px solid #fff;position:absolute;top:16px;left:18px}#sp-next:hover,#sp-prev:hover{background:#444}@media screen and (max-width:400px){.sp-wrap{margin:0 0 15px}#sp-next,#sp-prev{top:auto;margin-top:0;bottom:25px}}.btn i{margin-right:5px}.clean-block.dark{background-color:#f6f6f6}.clean-block.blue{background-color:#007bff;color:#fff}.clean-block.blue input{border:none}.clean-block .block-heading{padding-top:50px;margin-bottom:40px;text-align:center}.clean-block .block-heading p{text-align:center;max-width:420px;margin:auto;opacity:.7}.clean-block.dark .block-heading p{opacity:.8}.clean-block .block-heading h1,.clean-block .block-heading h2,.clean-block .block-heading h3{margin-bottom:1.2rem}.clean-block .block-content,.clean-block .content{box-shadow:0 2px 10px rgba(0,0,0,.075);background-color:#fff}.clean-block .block-content{padding:40px}.clean-block.clean-hero{position:relative;text-align:center;background-size:cover;background-repeat:no-repeat;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding-bottom:0}.clean-block.clean-hero:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background-color:currentColor;z-index:1}.clean-block.clean-hero .text{max-width:640px;color:#fff;z-index:2;padding:40px 15px;text-shadow:1px 1px 1px rgba(0,0,0,.15)}.clean-block.clean-hero h2{margin-bottom:30px}.clean-block.clean-hero p{font-size:18px;margin-bottom:30px}.feature-box{padding:15px 20px 15px 70px}.feature-box .icon{font-size:30px;position:absolute;left:15px;top:15px;width:30px;text-align:center;color:#3b99e0}.feature-box h4{font-weight:600;font-size:1.2rem}.feature-box p{font-size:.9em;opacity:.8}.clean-block.slider{margin-left:auto;margin-right:auto}.clean-card{box-shadow:0 2px 10px rgba(0,0,0,.075);border-radius:3px;margin-bottom:40px;border:1px solid #eaeaea}.clean-card .image{border-radius:3px 3px 0 0;overflow:hidden}.clean-card .info{padding:30px}.clean-card h4{font-weight:600;font-size:1em}.clean-card p{opacity:.8;font-size:.85em;margin-bottom:.9em}.clean-card .icons a{font-size:16px;color:#3b99e0;opacity:.75;height:2em;line-height:2;text-align:center;padding:.6em .4em}.clean-card .icons a:hover{opacity:1;text-decoration:none}.clean-block.clean-info{padding-left:20px;padding-right:20px;text-align:center}.clean-block.clean-info h3{margin-top:.8em;margin-bottom:.6em}.clean-block.clean-services .card{margin-bottom:30px;text-align:center}.clean-block.clean-services .card h4{font-weight:600;font-size:1em;margin-bottom:.8em}.clean-block.clean-services .card p{font-size:.9em;opacity:.8}.clean-block.clean-services .card button{margin-bottom:25px;padding:6px 20px}.clean-block.clean-faq .faq-item{margin-bottom:20px}.clean-block.clean-faq .faq-item .question{font-weight:600;font-size:1em;line-height:1.5}.clean-block.clean-faq .faq-item:not(:first-child) .question{margin-top:1.8em}.clean-block.clean-faq .faq-item .answer{font-size:1em;color:#7f7d7d;margin-top:20px}.clean-block.clean-form form{border-top:2px solid #5ea4f3;background-color:#fff;max-width:500px;margin:auto;padding:40px;box-shadow:0 2px 10px rgba(0,0,0,.075)}.clean-block.clean-block.clean-gallery .item{margin-bottom:20px}.clean-block.clean-gallery .item .image{box-shadow:0 2px 10px rgba(0,0,0,.075)}.clean-block.clean-gallery .lightbox img{transition:.2s ease-in-out}.clean-block.clean-gallery .lightbox img:hover{-webkit-transform:scale(1.05);transform:scale(1.05)}.clean-block.clean-gallery img{border-radius:4px}.baguetteBox-button{background-color:transparent!important}.clean-pricing-item .heading{text-align:center;padding-bottom:10px;border-bottom:1px solid rgba(0,0,0,.1)}.clean-pricing-item{background-color:#fff;box-shadow:0 2px 10px rgba(0,0,0,.075);border-top:2px solid #5ea4f3;padding:30px;overflow:hidden;position:relative}.clean-block.clean-pricing .col-md-5:not(:last-child) .item{margin-bottom:30px}.clean-pricing-item button{font-weight:600}.clean-pricing-item .ribbon{width:160px;height:32px;font-size:12px;text-align:center;color:#fff;font-weight:700;box-shadow:0 2px 3px hsla(0,0%,53%,.25);background:#4dbe3b;-webkit-transform:rotate(45deg);transform:rotate(45deg);position:absolute;right:-42px;top:20px;padding-top:7px}.clean-pricing-item p{text-align:center;margin-top:20px;opacity:.7}.clean-pricing-item .features .feature{font-weight:600}.clean-pricing-item .features h4{text-align:center;font-size:18px;padding:5px}.clean-pricing-item .price h4{margin:15px 0;font-size:45px;text-align:center;color:#2288f9}.clean-pricing-item .buy-now button{text-align:center;margin:auto;font-weight:600;padding:9px 0}.clean-block.payment-form form{border-top:2px solid #5ea4f3;box-shadow:0 2px 10px rgba(0,0,0,.075);background-color:#fff;padding:0;max-width:600px;margin:auto}.clean-block.payment-form .title{font-size:1em;border-bottom:1px solid rgba(0,0,0,.1);margin-bottom:.8em;font-weight:600;padding-bottom:8px}.clean-block.payment-form .products{background-color:#f7fbff;padding:25px}.clean-block.payment-form .products .item{margin-bottom:1em}.clean-block.payment-form .products .item-name{font-weight:600;font-size:.9em}.clean-block.payment-form .products .item-description{font-size:.8em;opacity:.6}.clean-block.payment-form .products .item p{margin-bottom:.2em}.clean-block.payment-form .products .price{float:right;font-weight:600;font-size:.9em}.clean-block.payment-form .products .total{border-top:1px solid rgba(0,0,0,.1);margin-top:10px;padding-top:19px;font-weight:600;line-height:1}.clean-block.payment-form .card-details{padding:25px 25px 15px}.clean-block.payment-form .card-details label{font-size:12px;font-weight:600;margin-bottom:15px;color:#79818a;text-transform:uppercase}.clean-block.payment-form .card-details button{margin-top:.6em;padding:12px 0;font-weight:600}.clean-block.payment-form .date-separator{margin-left:10px;margin-right:10px;margin-top:5px}.clean-block.clean-catalog .filters{padding-left:40px;padding-top:10px}.clean-block.clean-catalog .filter-collapse .filter-caret{float:right;font-size:12px;line-height:26px}.clean-block.clean-catalog .filter-collapse{display:block;padding:10px;border:1px solid #ccc;margin:30px;border-radius:0;text-align:left}.clean-block.clean-catalog .filters h3{font-size:1em;font-weight:600;margin-bottom:.8em}.clean-block.clean-catalog .filters .heading{font-size:20px;font-weight:700;padding-bottom:20px}.clean-block.clean-catalog .filters .filter-item{margin-bottom:40px}.clean-block.clean-catalog .filters label{word-wrap:break-word;max-width:100%}.clean-block.clean-catalog .products{padding:0}.clean-block.clean-catalog .products .row:first-of-type{border-top:none;border-left:none;margin-bottom:20px}.clean-product-item{padding:20px;border-right:none;border-bottom:1px solid #e8e6e6;height:100%}.clean-product-item .image{margin-bottom:20px}.clean-product-item .image img{max-width:220px;max-height:180px}.clean-product-item .product-name{margin-bottom:20px;text-align:center}.clean-product-item .product-name a{color:#585858;font-size:1.1em}.clean-product-item .product-name a:hover{text-decoration:none;color:#8f8c8c}.clean-product-item .about{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.clean-product-item .price{text-align:right;padding-right:10px}.clean-product-item .price h3{font-size:1.2em;font-weight:600;color:#32303c;margin:0}.clean-product-item .rating{color:#fec000}.clean-product-item .rating img{width:14px;margin-right:2px}.clean-product-item .add .icon{padding-right:10px}.clean-block.clean-catalog .products .pages{width:50%;margin:55px auto 0}.clean-block.clean-catalog .pagination{-ms-flex-pack:center;justify-content:center}.clean-block.clean-cart .items{padding:36px}.clean-block.clean-cart .items .product{padding-top:20px;padding-bottom:40px}.clean-block.clean-cart .items .product .product-image{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding:15px;border:2px solid #f0f0f0}.clean-block.clean-cart .items .product{padding-top:0}.clean-block.clean-cart .items .product .product-info{padding-top:1em;padding-bottom:1em}.clean-block.clean-cart .items .product .product-name{font-weight:600;font-size:1.3em}.clean-block.clean-cart .items .product .product-info .product-specs{font-size:.8rem;font-weight:600;margin-top:15px}.clean-block.clean-cart .items .product .product-info .product-specs .value{font-weight:400}.clean-block.clean-cart .items .product .quantity .quantity-input{width:68px}.clean-block.clean-cart .items .product .quantity label{font-size:.9em}.clean-block.clean-cart .items .product .price{font-weight:700;font-size:22px;text-align:right}.clean-block.clean-cart .summary{background-color:#f7fbff;height:100%;padding:30px}.clean-block.clean-cart .summary h3{text-align:center;font-size:1.25em;font-weight:600;padding-top:16px;padding-bottom:28px;text-transform:uppercase;letter-spacing:2px;color:#1d4f88}.clean-block.clean-cart .summary h4{padding-bottom:18px;margin-bottom:0;background:#fff;padding-left:20px;padding-right:20px}.clean-block.clean-cart .summary h4:first-of-type{border-top:1px solid #86b4e8;padding-top:18px}.clean-block.clean-cart .summary h4:last-of-type{color:#617ef3;border-bottom:1px solid #e6edf5}.clean-block.clean-cart .summary .text{font-size:.65em;font-weight:600}.clean-block.clean-cart .summary .price{font-size:.6em;float:right;margin-top:10px}.clean-block.clean-cart .summary button{margin-top:20px;font-weight:600;font-size:1em;padding:10px 0}.clean-block.clean-product .block-content{padding:20px}.clean-block.clean-product .product-info{margin-bottom:50px}.clean-block.clean-product .gallery{padding:20px;background-color:#f6f6f6}.clean-block.clean-product .sp-wrap{background:transparent;border:none;float:none;width:100%}.clean-block.clean-product .sp-thumbs{margin-top:15px}.clean-block.clean-product .sp-thumbs a:link{margin-right:10px}.clean-block.clean-product .product-info .info .price{padding:20px 0}.clean-block.clean-product .product-info .info .price h3{font-size:1.5em;font-weight:700}.clean-block.clean-product .product-info .info .rating{color:#fec000;padding-bottom:20px;border-bottom:1px solid rgba(0,0,0,.1)}.clean-block.clean-product .product-info .info button{padding:10px 20px;margin-bottom:30px}.clean-block.clean-product .product-info .info button .fa{margin-right:10px}.clean-block.clean-product .product-info .info .summary{border-top:1px solid rgba(0,0,0,.1);padding-top:30px}.clean-block.clean-product .product-info .info .summary p{font-size:.9em}.clean-block.clean-product .product-info .description{max-width:720px;margin:0 auto}.clean-block.clean-product .product-info .description p{margin-bottom:50px}.clean-block.clean-product .product-info .description h4{margin-top:60px;margin-bottom:20px}.clean-block.clean-product .tab-content .description{padding-top:60px}.clean-block.clean-product .tab-content .description .right{text-align:left}.clean-block.clean-product .tab-content .reviews,.clean-block.clean-product .tab-content .specifications{padding-top:30px}.clean-block.clean-product .product-info .specifications .stat{font-weight:700}.clean-block.clean-product .product-info .reviews .review-item{margin-bottom:30px;padding:20px;border:1px solid #ded7d7}.clean-block.clean-product .product-info .reviews .review-item h4{font-size:1.2em;font-weight:600}.clean-block.clean-product .product-info .reviews .review-item span{font-size:.9em}.clean-block.clean-product .product-info .reviews .review-item p{margin-top:12px;font-size:.9em}.clean-block.clean-product .clean-related-items .items{margin-top:30px}.clean-related-item{border:1px solid #eaeaea;padding-top:20px;padding-bottom:20px}.clean-related-item .related-name{text-align:center;margin-top:16px}.clean-related-item .related-name a{font-size:1em;color:#212529}.clean-related-item .related-name a:hover{text-decoration:none;color:#999ea4}.clean-block.clean-product .reviews .review-item .rating,.clean-related-item .related-name .rating{color:#fec000;margin-bottom:10px}.clean-block.clean-product .product-info .info .rating img,.clean-block.clean-product .reviews .review-item .rating img,.clean-related-item .related-name .rating img{width:18px;margin-right:2px}.clean-related-item .related-name h4{font-size:1.3em;font-weight:600;color:#007bff}.clean-blog-post{padding-bottom:70px}.clean-blog-post h3{font-size:1.3em;font-weight:600;padding-top:17px}.clean-blog-post p{font-size:.95em}.clean-blog-post .info{padding:5px 0 12px;font-size:.9em}.clean-blog-post .info span:not(:last-child){margin-right:7px}.clean-blog-post .info a{color:inherit}.clean-block.clean-post{padding-top:100px}.clean-block.clean-post .block-content{padding:0}.clean-block.clean-post .post-image{background-size:cover;background-repeat:no-repeat;width:100%;height:300px}.clean-block.clean-post .post-body{padding:70px 50px;font-size:.9em}.clean-block.clean-post .post-body h3{font-weight:600}.clean-block.clean-post .post-body p{margin-bottom:30px}.clean-block.clean-post .post-body .post-info{padding:20px 0}.clean-block.clean-post .post-body .post-info span{color:#007bff}.clean-block.clean-post .post-body .post-info span:not(:last-child){margin-right:40px}.clean-block.clean-post .post-body h4{font-weight:600;padding-top:20px;padding-bottom:20px}.clean-testimonial-item{border:1px solid #eaeaea;box-shadow:0 2px 10px rgba(0,0,0,.075);margin-bottom:30px;background-color:#fff;color:#212529;text-align:left}.clean-testimonial-item .card-body{padding:40px}.clean-testimonial-item h3{font-size:1.1em;font-weight:600}.clean-testimonial-item p{font-size:.9em}.clean-testimonial-item h4{font-size:.9em;color:#3b99e0}.clean-block.add-on{padding:50px 0;text-align:center;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.clean-block.add-on.call-to-action h3{margin-right:0;margin-bottom:20px}.clean-block.add-on.call-to-action button{border-radius:20px}.clean-block.add-on.newsletter-sign-up h2{padding-right:20px}.clean-block.add-on.newsletter-sign-up input{max-width:85%;margin-bottom:18px;margin-top:10px}.clean-block.add-on.newsletter-sign-up button{border-radius:20px}.clean-block.add-on.newsletter-sign-up .input-group{max-width:300px}.clean-block.add-on.social-icons .icons i{line-height:45px}.clean-block.add-on.social-icons .icons a{font-size:24px;margin-right:4px;color:#6aacf3;border:1px solid;opacity:.75;border-radius:50%;width:45px;height:45px;display:inline-block;text-align:center}.clean-block.add-on.social-icons .icons a:hover{opacity:1;text-decoration:none}.clean-block.add-on.social-icons.blue .icons a{color:#fff;opacity:1}.clean-block.add-on.social-icons.blue .icons a:hover{opacity:.8;text-decoration:none}.clean-block.add-on.sponsors a img{max-width:170px;-webkit-filter:grayscale(.8);filter:grayscale(.8)}.clean-block.add-on.sponsors a:not(:last-child) img{margin-bottom:20px}@media (max-width:767.98px){.clean-block.clean-services .row div:last-child .card{margin-bottom:0}}@media (min-width:576px){.clean-block .block-heading{padding-top:80px}.clean-block.clean-hero{min-height:680px}.clean-block.clean-hero .text{padding:0}.clean-block.clean-block.clean-gallery .item{margin-bottom:40px}.clean-block.payment-form .title{font-size:1.2em}.clean-block.payment-form .products{padding:40px}.clean-block.payment-form .products .item-name,.clean-block.payment-form .products .price{font-size:1em}.clean-block.payment-form .card-details{padding:40px 40px 30px}.clean-block.payment-form .card-details button{margin-top:2em}}@media (min-width:768px){.clean-block.clean-info.right>.container>.row{-ms-flex-direction:row-reverse;flex-direction:row-reverse}.clean-block.clean-info{padding-left:0;padding-right:0;text-align:inherit}.clean-block.clean-info h3{margin-top:0}.clean-block.clean-cart .items .product{padding:0;text-align:left}.clean-block.clean-cart .items .product:not(:last-child){padding-top:0;padding-bottom:25px}.clean-block.clean-cart .items .product .price{font-weight:700;font-size:22px}.clean-block.clean-cart .items .product .quantity{text-align:center}.clean-block.clean-cart .items .product .quantity .quantity-input{margin:auto;padding-left:15px;padding-right:5px}.clean-block.clean-cart .items .product .product-name{font-size:1em}.clean-block.clean-cart .items .product .product-info{padding:0 15px 0 1.5em}.clean-block.clean-post .post-image{height:400px}.clean-block.clean-blog-list .block-content{padding:80px}.clean-blog-post{padding-bottom:70px}.clean-block.add-on{-ms-flex-direction:row;flex-direction:row}.clean-block.add-on.call-to-action h3,.clean-block.add-on.sponsors a:not(:last-child) img{margin-right:20px;margin-bottom:0}.clean-block.add-on.newsletter-sign-up h2{margin-bottom:0}.clean-block.add-on.newsletter-sign-up input{max-width:200px;margin-bottom:0;margin-top:0;margin-right:10px}.clean-block.clean-catalog .filters{padding-top:30px}.clean-block.clean-catalog .products{padding:30px 30px 30px 0}.clean-block.clean-catalog .products .clean-product-item .product-name{text-align:left}.clean-block.clean-catalog .products .row:first-of-type{border-top:1px solid #e8e6e6;border-left:1px solid #e8e6e6}.clean-block.clean-catalog .products .clean-product-item{border-right:1px solid #e8e6e6}.clean-block.clean-product .block-content{padding:40px}.clean-block.clean-product .tab-content .description .right{text-align:right}}@media (min-width:992px){.clean-card{margin-bottom:0}.clean-blog-post h3{padding-top:0}.clean-block.clean-post .post-image{height:500px}.clean-block.clean-post .post-body{padding:70px 150px}.clean-block.clean-testimonials .item{margin-bottom:0}.clean-block.clean-post .post-body{padding:70px 100px}.clean-block.clean-post .post-body h4{padding-top:50px}}.clean-navbar .navbar-nav .nav-link{font-weight:600;font-size:.8rem;text-transform:uppercase}.clean-navbar.fixed-bottom,.clean-navbar.fixed-top{box-shadow:0 0 15px rgba(0,0,0,.1)}.clean-navbar .navbar-nav .nav-item{padding-right:2rem}.clean-navbar .navbar-nav:last-child .item:last-child,.clean-navbar .navbar-nav:last-child .item:last-child a{padding-right:0}.clean-navbar .logo{font-size:1.5rem}.clean-navbar.fixed-top+.page{padding-top:62px}@media (min-width:576px){.navbar{padding-top:1.2rem;padding-bottom:1.2rem}.clean-navbar.fixed-top+.page{padding-top:5rem}}.header-standard .navbar-nav .item{padding-left:20px;font-size:20px}.header-standard{background-image:url(../../assets/img/header-standard/image1.jpg);background-size:cover;background-repeat:no-repeat}.header-standard .hero{padding-top:200px;padding-bottom:200px;text-align:center}.header-standard .hero .heading{font-size:50px}.header-standard .hero .info{margin:30px auto;font-size:20px;margin-top:30px}.page-footer{background-color:#fff;padding-top:30px;text-align:center}.page-footer.dark{background-color:#2b2f31}.page-footer .footer-copyright{background-color:#fff;padding-top:3px;padding-bottom:3px;text-align:center;margin-top:50px;border:1px solid #ededed}.page-footer.dark .footer-copyright{background-color:#222425;border-color:#222425}.page-footer .footer-copyright p{margin:10px;color:#7d8288}.page-footer.dark .footer-copyright p{color:#ccc}.page-footer ul{list-style-type:none;padding-left:0;line-height:1.7}.page-footer h5{font-size:18px;font-weight:700;margin-top:30px}.page-footer.dark h5{color:#fff}.page-footer a{color:#53595f;text-decoration:none}.page-footer.dark a{color:#d2d1d1}.page-footer a:focus,.page-footer a:hover{text-decoration:none;color:#1d2125}.page-footer.dark a:focus,.page-footer.dark a:hover{color:#fff}@media (min-width:576px){.page-footer{text-align:left}}@media (min-width:768px){.page-footer ul li{position:relative;padding-left:10px}.page-footer ul li:after,.page-footer ul li:before{content:"";position:absolute;left:0;width:2px;height:6px;border-radius:2px;background-color:#007bff;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.page-footer ul li:before{top:9px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.page-footer ul li:after{top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}} ul.qq-group li,ul.qq-group li a { color: #fff;padding:5px 0; } .prevpage.btn,.nextpage.btn{ text-align:left; margin-top:5px; } .comment-page-bar{ text-align:right; } .comment-page{ padding: 5px 10px; border: 1px solid #ccc; border-radius: 5px; margin-right: 10px; cursor:pointer; } .tags a { margin: 5px; display: inline-block; } .faq-ans p { line-height: 30px; } .product-price { font-weight: 800; color: #f00 !important; font-size: 18px; } ul.filter-bar { border: 1px solid #ccc; border-radius: 5px; padding: 15px; margin-bottom: 40px; } .filter-s label { color: #ffb701; font-size: 15px; font-weight: 600; margin-right: 15px; } .filter-bar li { padding: 5px 0; } .filter-s a { padding: 5px 10px; } .filter-s a.is-checked { background: #ffb806; color: #fff; } .blog-details-thum img{ width:100%; } .info .price { margin: 10px 0; font-size: 20px; font-weight: 600; color: #f00; clear:both; } .feature { margin: 10px 0; } .summary { margin: 20px 0; line-height: 25px; } .buy-bar button.buy { color: #fff; background: #dc3545; } .buy-bar p{ display:block; margin-bottom:15px; font-weight:600; } .nsbar{ float: right; } .nsbar a { margin: 0 5px; } .contact a { width: 200px !important; } .jz-body p { line-height: 40px; } .jz-body{ padding: 50px 0; text-align: center; font-size: 20px; } .so{ width: 80%; height: 30px; border: 1px solid #ccc; border-radius: 3px; } form.search{ margin: 15px 0; } ================================================ FILE: static/cms/static/js/ajax.mail.js ================================================ /*==================================== Ajax Mail js ======================================*/ $(function() { // Get the form. var form = $('#contact-form'); // Get the messages div. var formMessages = $('.form-messege'); // Set up an event listener for the contact form. $(form).submit(function(e) { // Stop the browser from submitting the form. e.preventDefault(); // Serialize the form data. var formData = $(form).serialize(); // Submit the form using AJAX. $.ajax({ type: 'POST', url: $(form).attr('action'), data: formData }) .done(function(response) { // Make sure that the formMessages div has the 'success' class. $(formMessages).removeClass('error'); $(formMessages).addClass('success'); // Set the message text. $(formMessages).text(response); // Clear the form. $('#contact-form input,#contact-form textarea').val(''); }) .fail(function(data) { // Make sure that the formMessages div has the 'error' class. $(formMessages).removeClass('success'); $(formMessages).addClass('error'); // Set the message text. if (data.responseText !== '') { $(formMessages).text(data.responseText); } else { $(formMessages).text('Oops! An error occured and your message could not be sent.'); } }); }); }); ================================================ FILE: static/cms/static/js/aos.js ================================================ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},_=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},S=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},z=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?_():(document.querySelector("body").setAttribute("data-aos-easing",x.easing),document.querySelector("body").setAttribute("data-aos-duration",x.duration),document.querySelector("body").setAttribute("data-aos-delay",x.delay),"DOMContentLoaded"===x.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?j(!0):"load"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener("resize",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("orientationchange",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||(0,d.default)("[data-aos]",O),w)};e.exports={init:z,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(f);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return s;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f="Expected a function",s=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==s}function a(e){if("number"==typeof e)return e;if(r(e))return f;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",f=NaN,s="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e,t){var n=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=new r(o);i=t,a.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute("data-aos")}).length;o&&i()})}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){};t.default=n},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;ne.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])}); ================================================ FILE: static/cms/static/js/main.js ================================================ (function(a) { var m = a(window); var j = m.width(); var l = a(".header-sticky"); var c = a("html"); var b = a("body"); var m = a(window); var j = m.width(); var l = a(".header-sticky"); var c = a("html"); var b = a("body"); m.on("scroll", function() { var o = m.scrollTop(); var n = l.height(); if (j >= 320) { if (o < n) { l.removeClass("is-sticky") } else { l.addClass("is-sticky") } } }); function k() { var o = a("#scroll-top"), n = 0, p = a(window); p.on("scroll", function() { var q = a(this).scrollTop(); if (q > n) { o.removeClass("show") } else { if (p.scrollTop() > 200) { o.addClass("show") } else { o.removeClass("show") } } n = q }); o.on("click", function(q) { a("html, body").animate({ scrollTop: 0 }, 600); q.preventDefault() }) } k(); if (a(".has-children--multilevel-submenu").find(".submenu").length) { var h = a(".has-children--multilevel-submenu").find(".submenu"); h.each(function() { var r = a(this).offset(); var q = r.left; var s = a(this).width(); var n = m.height(); var o = m.width() - 10; var p = (q + s <= o); if (!p) { a(this).addClass("left") } }) } a("#mobile-menu-trigger").on("click", function() { a("#mobile-menu-overlay").addClass("active"); b.addClass("no-overflow") }); a("#mobile-menu-close-trigger").on("click", function() { a("#mobile-menu-overlay").removeClass("active"); b.removeClass("no-overflow") }); a(".offcanvas-navigation--onepage ul li a").on("click", function() { a("#mobile-menu-overlay").removeClass("active"); b.removeClass("no-overflow") }); b.on("click", function(o) { var n = o.target; if (!a(n).is(".mobile-menu-overlay__inner") && !a(n).parents().is(".mobile-menu-overlay__inner") && !a(n).is("#mobile-menu-trigger") && !a(n).is("#mobile-menu-trigger i")) { a("#mobile-menu-overlay").removeClass("active"); b.removeClass("no-overflow") } }); var g = window.location.pathname; var f = g.substr(g.lastIndexOf("/") + 1); var i = window.location.hash.substr(1); if ((f == "" || f == "/" || f == "admin") && i == "") {} else { a(".navigation-menu li").each(function() { a(this).removeClass("active") }); if (i != "") { a(".navigation-menu li a[href*='" + i + "']").parents("li").addClass("active") } else { a(".navigation-menu li a[href*='" + f + "']").parents("li").addClass("active") } } a(".openmenu-trigger").on("click", function(n) { n.preventDefault(); a(".open-menuberger-wrapper").addClass("is-visiable") }); a(".page-close").on("click", function(n) { n.preventDefault(); a(".open-menuberger-wrapper").removeClass("is-visiable") }); a("#open-off-sidebar-trigger").on("click", function() { a("#page-oppen-off-sidebar-overlay").addClass("active"); b.addClass("no-overflow") }); a("#menu-close-trigger").on("click", function() { a("#page-oppen-off-sidebar-overlay").removeClass("active"); b.removeClass("no-overflow") }); a("#search-overlay-trigger").on("click", function() { a("#search-overlay").addClass("active"); b.addClass("no-overflow") }); a("#search-close-trigger").on("click", function() { a("#search-overlay").removeClass("active"); b.removeClass("no-overflow") }); a("#hidden-icon-trigger").on("click", function() { a("#hidden-icon-wrapper").toggleClass("active") }); a(".share-icon").on("click", function(n) { n.preventDefault(); a(".entry-post-share").toggleClass("opened") }); b.on("click", function() { a(".entry-post-share").removeClass("opened") }); a(".entry-post-share").on("click", function(n) { n.stopPropagation() }); var d = a(".offcanvas-navigation"), e = d.find(".sub-menu"); e.parent().prepend(''); e.slideUp(); d.on("click", "li a, li .menu-expand", function(o) { var n = a(this); if ((n.parent().attr("class").match(/\b(menu-item-has-children|has-children|has-sub-menu)\b/)) && (n.attr("href") === "#" || n.hasClass("menu-expand"))) { o.preventDefault(); if (n.siblings("ul:visible").length) { n.parent("li").removeClass("active"); n.siblings("ul").slideUp() } else { n.parent("li").addClass("active"); n.closest("li").siblings("li").removeClass("active").find("li").removeClass("active"); n.closest("li").siblings("li").find("ul:visible").slideUp(); n.siblings("ul").slideDown() } } }); a(document).ready(function() { var n = new Swiper(".most-popular-slider-active", { slidesPerView: 3, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".popular-swiper-button-next", prevEl: ".popular-swiper-button-prev", }, pagination: { el: ".swiper-pagination-t0", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 3 }, 991: { slidesPerView: 3 }, 767: { slidesPerView: 2 }, 575: { slidesPerView: 2 }, 0: { slidesPerView: 1 } } }); var n = new Swiper(".hero-slider-three-active", { slidesPerView: 1, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 0, navigation: { nextEl: ".slider-three-swiper-button-next", prevEl: ".slider-three-swiper-button-prev", }, pagination: { el: ".hero-swiper-pagination", type: "bullets", clickable: true } }); var n = new Swiper(".hero-slider-four-active", { slidesPerView: 1, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 0, navigation: { nextEl: ".slider-four-button-next", prevEl: ".slider-four-button-prev", }, pagination: { el: ".hero-swiper-pagination", type: "bullets", clickable: true } }); var n = new Swiper(".trending-slider-active", { slidesPerView: 1, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 0, navigation: { nextEl: ".trending-button-next", prevEl: ".trending-button-prev", }, pagination: { el: ".trending-swiper-pagination", type: "bullets", clickable: true } }); var n = new Swiper(".following-slider-active", { slidesPerView: 1, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 0, navigation: { nextEl: ".following-button-next", prevEl: ".following-button-prev", }, pagination: { el: ".following-swiper-pagination", type: "bullets", clickable: true } }); var n = new Swiper(".trending-topic-slider-active", { slidesPerView: 5, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 25, navigation: { nextEl: ".trending-topic-button-next", prevEl: ".trending-topic-button-prev", }, pagination: { el: ".hero-swiper-pagination", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 5 }, 991: { slidesPerView: 4 }, 767: { slidesPerView: 4 }, 575: { slidesPerView: 3, spaceBetween: 10 }, 0: { slidesPerView: 2, spaceBetween: 10, } } }); var n = new Swiper(".latest-post-slider-active", { slidesPerView: 1, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 0, navigation: { nextEl: ".latest-post-button-next", prevEl: ".latest-post-button-prev", }, pagination: { el: ".swiper-pagination", type: "bullets", clickable: true } }); var n = new Swiper(".recent-reading-slider-active", { slidesPerView: 3, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".recent-reading-button-next", prevEl: ".recent-reading-button-prev", }, pagination: { el: ".swiper-pagination", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 3 }, 991: { slidesPerView: 2 }, 767: { slidesPerView: 1 }, 575: { slidesPerView: 1 }, 0: { slidesPerView: 1 } } }); var n = new Swiper(".trusted-partners-slider-active", { slidesPerView: 4, slidesPerGroup: 2, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".partners-swiper-button-next", prevEl: ".partners-swiper-button-prev", }, pagination: { el: ".partners-swiper-pagination", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 4 }, 991: { slidesPerView: 4 }, 767: { slidesPerView: 2 }, 575: { slidesPerView: 2 }, 0: { slidesPerView: 2 } } }); var n = new Swiper(".testimonial-slider-active", { slidesPerView: 3, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".testimonial-button-next", prevEl: ".testimonial-button-prev", }, pagination: { el: ".partners-swiper-pagination", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 3 }, 991: { slidesPerView: 3 }, 767: { slidesPerView: 2 }, 575: { slidesPerView: 1 }, 0: { slidesPerView: 1 } } }); var n = new Swiper(".trending-tody-slider-active", { slidesPerView: 1, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".testimonial-button-next", prevEl: ".testimonial-button-prev", }, pagination: { el: ".trending-tody-swiper-pagination", type: "bullets", clickable: true } }); var n = new Swiper(".hero-six-slider-active", { slidesPerView: 1, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".slider-six-button-next", prevEl: ".slider-six-button-prev", }, pagination: { el: ".hero-six-swiper-pagination", type: "bullets", clickable: true } }); var n = new Swiper(".trending-tody-slider-two-active", { slidesPerView: 3, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".trending-tody-button-next", prevEl: ".trending-tody-button-prev", }, pagination: { el: ".trending-tody-swiper-pagination", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 3 }, 991: { slidesPerView: 3 }, 767: { slidesPerView: 2 }, 575: { slidesPerView: 1 }, 0: { slidesPerView: 1 } } }); var n = new Swiper(".related-post-slider-active", { slidesPerView: 2, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".related-post-button-next", prevEl: ".related-post-button-prev", }, pagination: { el: ".related-post-swiper-pagination", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 2 }, 991: { slidesPerView: 2 }, 767: { slidesPerView: 2 }, 575: { slidesPerView: 1 }, 0: { slidesPerView: 1 } } }); var n = new Swiper(".related-post-two-slider-active", { slidesPerView: 3, slidesPerGroup: 1, centeredSlides: false, loop: true, speed: 1000, spaceBetween: 30, navigation: { nextEl: ".related-post-button-next", prevEl: ".related-post-button-prev", }, pagination: { el: ".related-post-swiper-pagination", type: "bullets", clickable: true }, breakpoints: { 1499: { slidesPerView: 3 }, 991: { slidesPerView: 3 }, 767: { slidesPerView: 2 }, 575: { slidesPerView: 1 }, 0: { slidesPerView: 1 } } }) }); a(".popup-images").lightGallery(); a(".video-popup").lightGallery(); // AOS.init({ // offset: 80, // duration: 1000, // once: true, // easing: "ease", // }); wow = new WOW({ animateClass: 'animated', offset: 200 }); wow.init(); a(".projects-masonary-wrapper,.masonry-activation").imagesLoaded(function() { a(".messonry-button").on("click", "button", function() { var o = a(this).attr("data-filter"); a(this).siblings(".is-checked").removeClass("is-checked"); a(this).addClass("is-checked"); n.isotope({ filter: o }) }); var n = a(".masonry-wrap").masonry({ itemSelector: ".masonary-item", percentPosition: true, transitionDuration: "0.7s", columnWidth: ".masonary-sizer" }); var n = a(".mesonry-list").isotope({ percentPosition: true, transitionDuration: "0.7s", layoutMode: "masonry", }) }) })(jQuery); ================================================ FILE: static/cms/style.html ================================================ ================================================ FILE: static/cms/tags-details.html ================================================ 搜索 “{$tagname}” -{$webconf['web_name']} {include="style"} {include="header"}

    搜索 “{$tagname}” 结果如下:

    {if($lists)} {foreach $lists as $v}
    {$v['title']}
    {/foreach} {else}
    This Page is Not Found.

    很抱歉,没有找到你要的信息。

    {/if}
    {include="footer"} {include="js"} ================================================ FILE: static/cms/user/article-add.html ================================================ 发布内容 - 个人中心 {include="user/style"} {include="user/top"}
    确定
    {include="user/footer"} ================================================ FILE: static/cms/user/article.html ================================================ {include="user/style"} 我的发布 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/buy-list.html ================================================ {include="user/style"} 购买记录 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/buy-view.html ================================================ {include="user/style"} 购买 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/buy.html ================================================ {include="user/style"} 钱包与积分 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/cart.html ================================================ {include="user/style"} 我的购物车 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/collect.html ================================================ {include="user/style"} 我的收藏-个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/comment.html ================================================ {include="user/style"} 我的评论-个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/fans.html ================================================ {include="user/style"} 我的粉丝 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/follow.html ================================================ {include="user/style"} 我的关注 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/footer.html ================================================ ================================================ FILE: static/cms/user/forget.html ================================================ {include="user/style"} 个人中心-未登录
    {include="user/footer"} ================================================ FILE: static/cms/user/index.html ================================================ {include="user/style"} 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/left_nav.html ================================================ ================================================ FILE: static/cms/user/likes.html ================================================ {include="user/style"} 我的点赞-个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/login.html ================================================ {include="user/style"} 个人中心-未登录
    {include="user/footer"} ================================================ FILE: static/cms/user/nologin.html ================================================ 个人中心-未登录
    {include="user/footer"} ================================================ FILE: static/cms/user/notify.html ================================================ {include="user/style"} 消息中心 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/order.html ================================================ {include="user/style"} 我的订单 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/orderdetails.html ================================================ {include="user/style"} 我的订单 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/password.html ================================================ 个人中心-已登录
    ================================================ FILE: static/cms/user/payment.html ================================================ {include="user/style"} 支付订单 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/people.html ================================================ {include="user/style"} {$user['username']}的公共主页 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/prople.html ================================================ 个人中心-已登录
    ================================================ FILE: static/cms/user/register.html ================================================ {include="user/style"} 个人中心-未登录
    {include="user/footer"} ================================================ FILE: static/cms/user/reset_password.html ================================================ {include="user/style"} 个人中心-未登录
    {include="user/footer"} ================================================ FILE: static/cms/user/setmsg.html ================================================ {include="user/style"} 资料与账号 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/style.html ================================================ ================================================ FILE: static/cms/user/tips.html ================================================

    欢迎注册本站会员,注册会员后您将享受专属会员服务!包括但不限于专属文章浏览权限,会员投稿权限,在线购物权限,下载会员可见附件等实用功能,欢迎注册体验!

    ================================================ FILE: static/cms/user/top.html ================================================
    ================================================ FILE: static/cms/user/userinfo.html ================================================ {include="user/style"} 资料与账号 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/cms/user/wallet.html ================================================ {include="user/style"} 我的钱包 - 个人中心 {include="user/top"} {include="user/footer"} ================================================ FILE: static/common/clipboard.js ================================================ /*! * clipboard.js v2.0.6 * https://clipboardjs.com/ * * Licensed MIT © Zeno Rocha */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["ClipboardJS"] = factory(); else root["ClipboardJS"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 6); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { function select(element) { var selectedText; if (element.nodeName === 'SELECT') { element.focus(); selectedText = element.value; } else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') { var isReadOnly = element.hasAttribute('readonly'); if (!isReadOnly) { element.setAttribute('readonly', ''); } element.select(); element.setSelectionRange(0, element.value.length); if (!isReadOnly) { element.removeAttribute('readonly'); } selectedText = element.value; } else { if (element.hasAttribute('contenteditable')) { element.focus(); } var selection = window.getSelection(); var range = document.createRange(); range.selectNodeContents(element); selection.removeAllRanges(); selection.addRange(range); selectedText = selection.toString(); } return selectedText; } module.exports = select; /***/ }), /* 1 */ /***/ (function(module, exports) { function E () { // Keep this empty so it's easier to inherit from // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) } E.prototype = { on: function (name, callback, ctx) { var e = this.e || (this.e = {}); (e[name] || (e[name] = [])).push({ fn: callback, ctx: ctx }); return this; }, once: function (name, callback, ctx) { var self = this; function listener () { self.off(name, listener); callback.apply(ctx, arguments); }; listener._ = callback return this.on(name, listener, ctx); }, emit: function (name) { var data = [].slice.call(arguments, 1); var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); var i = 0; var len = evtArr.length; for (i; i < len; i++) { evtArr[i].fn.apply(evtArr[i].ctx, data); } return this; }, off: function (name, callback) { var e = this.e || (this.e = {}); var evts = e[name]; var liveEvents = []; if (evts && callback) { for (var i = 0, len = evts.length; i < len; i++) { if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]); } } // Remove event from queue to prevent memory leak // Suggested by https://github.com/lazd // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 (liveEvents.length) ? e[name] = liveEvents : delete e[name]; return this; } }; module.exports = E; module.exports.TinyEmitter = E; /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { var is = __webpack_require__(3); var delegate = __webpack_require__(4); /** * Validates all params and calls the right * listener function based on its target type. * * @param {String|HTMLElement|HTMLCollection|NodeList} target * @param {String} type * @param {Function} callback * @return {Object} */ function listen(target, type, callback) { if (!target && !type && !callback) { throw new Error('Missing required arguments'); } if (!is.string(type)) { throw new TypeError('Second argument must be a String'); } if (!is.fn(callback)) { throw new TypeError('Third argument must be a Function'); } if (is.node(target)) { return listenNode(target, type, callback); } else if (is.nodeList(target)) { return listenNodeList(target, type, callback); } else if (is.string(target)) { return listenSelector(target, type, callback); } else { throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList'); } } /** * Adds an event listener to a HTML element * and returns a remove listener function. * * @param {HTMLElement} node * @param {String} type * @param {Function} callback * @return {Object} */ function listenNode(node, type, callback) { node.addEventListener(type, callback); return { destroy: function() { node.removeEventListener(type, callback); } } } /** * Add an event listener to a list of HTML elements * and returns a remove listener function. * * @param {NodeList|HTMLCollection} nodeList * @param {String} type * @param {Function} callback * @return {Object} */ function listenNodeList(nodeList, type, callback) { Array.prototype.forEach.call(nodeList, function(node) { node.addEventListener(type, callback); }); return { destroy: function() { Array.prototype.forEach.call(nodeList, function(node) { node.removeEventListener(type, callback); }); } } } /** * Add an event listener to a selector * and returns a remove listener function. * * @param {String} selector * @param {String} type * @param {Function} callback * @return {Object} */ function listenSelector(selector, type, callback) { return delegate(document.body, selector, type, callback); } module.exports = listen; /***/ }), /* 3 */ /***/ (function(module, exports) { /** * Check if argument is a HTML element. * * @param {Object} value * @return {Boolean} */ exports.node = function(value) { return value !== undefined && value instanceof HTMLElement && value.nodeType === 1; }; /** * Check if argument is a list of HTML elements. * * @param {Object} value * @return {Boolean} */ exports.nodeList = function(value) { var type = Object.prototype.toString.call(value); return value !== undefined && (type === '[object NodeList]' || type === '[object HTMLCollection]') && ('length' in value) && (value.length === 0 || exports.node(value[0])); }; /** * Check if argument is a string. * * @param {Object} value * @return {Boolean} */ exports.string = function(value) { return typeof value === 'string' || value instanceof String; }; /** * Check if argument is a function. * * @param {Object} value * @return {Boolean} */ exports.fn = function(value) { var type = Object.prototype.toString.call(value); return type === '[object Function]'; }; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { var closest = __webpack_require__(5); /** * Delegates event to a selector. * * @param {Element} element * @param {String} selector * @param {String} type * @param {Function} callback * @param {Boolean} useCapture * @return {Object} */ function _delegate(element, selector, type, callback, useCapture) { var listenerFn = listener.apply(this, arguments); element.addEventListener(type, listenerFn, useCapture); return { destroy: function() { element.removeEventListener(type, listenerFn, useCapture); } } } /** * Delegates event to a selector. * * @param {Element|String|Array} [elements] * @param {String} selector * @param {String} type * @param {Function} callback * @param {Boolean} useCapture * @return {Object} */ function delegate(elements, selector, type, callback, useCapture) { // Handle the regular Element usage if (typeof elements.addEventListener === 'function') { return _delegate.apply(null, arguments); } // Handle Element-less usage, it defaults to global delegation if (typeof type === 'function') { // Use `document` as the first parameter, then apply arguments // This is a short way to .unshift `arguments` without running into deoptimizations return _delegate.bind(null, document).apply(null, arguments); } // Handle Selector-based usage if (typeof elements === 'string') { elements = document.querySelectorAll(elements); } // Handle Array-like based usage return Array.prototype.map.call(elements, function (element) { return _delegate(element, selector, type, callback, useCapture); }); } /** * Finds closest match and invokes callback. * * @param {Element} element * @param {String} selector * @param {String} type * @param {Function} callback * @return {Function} */ function listener(element, selector, type, callback) { return function(e) { e.delegateTarget = closest(e.target, selector); if (e.delegateTarget) { callback.call(element, e); } } } module.exports = delegate; /***/ }), /* 5 */ /***/ (function(module, exports) { var DOCUMENT_NODE_TYPE = 9; /** * A polyfill for Element.matches() */ if (typeof Element !== 'undefined' && !Element.prototype.matches) { var proto = Element.prototype; proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector; } /** * Finds the closest parent that matches a selector. * * @param {Element} element * @param {String} selector * @return {Function} */ function closest (element, selector) { while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { if (typeof element.matches === 'function' && element.matches(selector)) { return element; } element = element.parentNode; } } module.exports = closest; /***/ }), /* 6 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); // EXTERNAL MODULE: ./node_modules/select/src/select.js var src_select = __webpack_require__(0); var select_default = /*#__PURE__*/__webpack_require__.n(src_select); // CONCATENATED MODULE: ./src/clipboard-action.js var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * Inner class which performs selection from either `text` or `target` * properties and then executes copy or cut operations. */ var clipboard_action_ClipboardAction = function () { /** * @param {Object} options */ function ClipboardAction(options) { _classCallCheck(this, ClipboardAction); this.resolveOptions(options); this.initSelection(); } /** * Defines base properties passed from constructor. * @param {Object} options */ _createClass(ClipboardAction, [{ key: 'resolveOptions', value: function resolveOptions() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this.action = options.action; this.container = options.container; this.emitter = options.emitter; this.target = options.target; this.text = options.text; this.trigger = options.trigger; this.selectedText = ''; } /** * Decides which selection strategy is going to be applied based * on the existence of `text` and `target` properties. */ }, { key: 'initSelection', value: function initSelection() { if (this.text) { this.selectFake(); } else if (this.target) { this.selectTarget(); } } /** * Creates a fake textarea element, sets its value from `text` property, * and makes a selection on it. */ }, { key: 'selectFake', value: function selectFake() { var _this = this; var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; this.removeFake(); this.fakeHandlerCallback = function () { return _this.removeFake(); }; this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true; this.fakeElem = document.createElement('textarea'); // Prevent zooming on iOS this.fakeElem.style.fontSize = '12pt'; // Reset box model this.fakeElem.style.border = '0'; this.fakeElem.style.padding = '0'; this.fakeElem.style.margin = '0'; // Move element out of screen horizontally this.fakeElem.style.position = 'absolute'; this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically var yPosition = window.pageYOffset || document.documentElement.scrollTop; this.fakeElem.style.top = yPosition + 'px'; this.fakeElem.setAttribute('readonly', ''); this.fakeElem.value = this.text; this.container.appendChild(this.fakeElem); this.selectedText = select_default()(this.fakeElem); this.copyText(); } /** * Only removes the fake element after another click event, that way * a user can hit `Ctrl+C` to copy because selection still exists. */ }, { key: 'removeFake', value: function removeFake() { if (this.fakeHandler) { this.container.removeEventListener('click', this.fakeHandlerCallback); this.fakeHandler = null; this.fakeHandlerCallback = null; } if (this.fakeElem) { this.container.removeChild(this.fakeElem); this.fakeElem = null; } } /** * Selects the content from element passed on `target` property. */ }, { key: 'selectTarget', value: function selectTarget() { this.selectedText = select_default()(this.target); this.copyText(); } /** * Executes the copy operation based on the current selection. */ }, { key: 'copyText', value: function copyText() { var succeeded = void 0; try { succeeded = document.execCommand(this.action); } catch (err) { succeeded = false; } this.handleResult(succeeded); } /** * Fires an event based on the copy operation result. * @param {Boolean} succeeded */ }, { key: 'handleResult', value: function handleResult(succeeded) { this.emitter.emit(succeeded ? 'success' : 'error', { action: this.action, text: this.selectedText, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) }); } /** * Moves focus away from `target` and back to the trigger, removes current selection. */ }, { key: 'clearSelection', value: function clearSelection() { if (this.trigger) { this.trigger.focus(); } document.activeElement.blur(); window.getSelection().removeAllRanges(); } /** * Sets the `action` to be performed which can be either 'copy' or 'cut'. * @param {String} action */ }, { key: 'destroy', /** * Destroy lifecycle. */ value: function destroy() { this.removeFake(); } }, { key: 'action', set: function set() { var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy'; this._action = action; if (this._action !== 'copy' && this._action !== 'cut') { throw new Error('Invalid "action" value, use either "copy" or "cut"'); } } /** * Gets the `action` property. * @return {String} */ , get: function get() { return this._action; } /** * Sets the `target` property using an element * that will be have its content copied. * @param {Element} target */ }, { key: 'target', set: function set(target) { if (target !== undefined) { if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) { if (this.action === 'copy' && target.hasAttribute('disabled')) { throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); } if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) { throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); } this._target = target; } else { throw new Error('Invalid "target" value, use a valid Element'); } } } /** * Gets the `target` property. * @return {String|HTMLElement} */ , get: function get() { return this._target; } }]); return ClipboardAction; }(); /* harmony default export */ var clipboard_action = (clipboard_action_ClipboardAction); // EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js var tiny_emitter = __webpack_require__(1); var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter); // EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js var listen = __webpack_require__(2); var listen_default = /*#__PURE__*/__webpack_require__.n(listen); // CONCATENATED MODULE: ./src/clipboard.js var clipboard_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var clipboard_createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * Base class which takes one or more elements, adds event listeners to them, * and instantiates a new `ClipboardAction` on each click. */ var clipboard_Clipboard = function (_Emitter) { _inherits(Clipboard, _Emitter); /** * @param {String|HTMLElement|HTMLCollection|NodeList} trigger * @param {Object} options */ function Clipboard(trigger, options) { clipboard_classCallCheck(this, Clipboard); var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this)); _this.resolveOptions(options); _this.listenClick(trigger); return _this; } /** * Defines if attributes would be resolved using internal setter functions * or custom functions that were passed in the constructor. * @param {Object} options */ clipboard_createClass(Clipboard, [{ key: 'resolveOptions', value: function resolveOptions() { var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; this.action = typeof options.action === 'function' ? options.action : this.defaultAction; this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; this.text = typeof options.text === 'function' ? options.text : this.defaultText; this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body; } /** * Adds a click event listener to the passed trigger. * @param {String|HTMLElement|HTMLCollection|NodeList} trigger */ }, { key: 'listenClick', value: function listenClick(trigger) { var _this2 = this; this.listener = listen_default()(trigger, 'click', function (e) { return _this2.onClick(e); }); } /** * Defines a new `ClipboardAction` on each click event. * @param {Event} e */ }, { key: 'onClick', value: function onClick(e) { var trigger = e.delegateTarget || e.currentTarget; if (this.clipboardAction) { this.clipboardAction = null; } this.clipboardAction = new clipboard_action({ action: this.action(trigger), target: this.target(trigger), text: this.text(trigger), container: this.container, trigger: trigger, emitter: this }); } /** * Default `action` lookup function. * @param {Element} trigger */ }, { key: 'defaultAction', value: function defaultAction(trigger) { return getAttributeValue('action', trigger); } /** * Default `target` lookup function. * @param {Element} trigger */ }, { key: 'defaultTarget', value: function defaultTarget(trigger) { var selector = getAttributeValue('target', trigger); if (selector) { return document.querySelector(selector); } } /** * Returns the support of the given action, or all actions if no action is * given. * @param {String} [action] */ }, { key: 'defaultText', /** * Default `text` lookup function. * @param {Element} trigger */ value: function defaultText(trigger) { return getAttributeValue('text', trigger); } /** * Destroy lifecycle. */ }, { key: 'destroy', value: function destroy() { this.listener.destroy(); if (this.clipboardAction) { this.clipboardAction.destroy(); this.clipboardAction = null; } } }], [{ key: 'isSupported', value: function isSupported() { var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut']; var actions = typeof action === 'string' ? [action] : action; var support = !!document.queryCommandSupported; actions.forEach(function (action) { support = support && !!document.queryCommandSupported(action); }); return support; } }]); return Clipboard; }(tiny_emitter_default.a); /** * Helper function to retrieve attribute value. * @param {String} suffix * @param {Element} element */ function getAttributeValue(suffix, element) { var attribute = 'data-clipboard-' + suffix; if (!element.hasAttribute(attribute)) { return; } return element.getAttribute(attribute); } /* harmony default export */ var clipboard = __webpack_exports__["default"] = (clipboard_Clipboard); /***/ }) /******/ ])["default"]; }); ================================================ FILE: static/common/close.html ================================================ 抱歉,站点已暂停

    {if($webconf['closetip'])}{$webconf['closetip']}{else}抱歉!该站点已经被管理员停止运行,请联系管理员了解详情!{/if}

    ================================================ FILE: static/common/layui/css/layui.css ================================================ .layui-inline,img{display:inline-block;vertical-align:middle}h1,h2,h3,h4,h5,h6{font-weight:400}a,body{color:#333}.layui-edge,.layui-header,.layui-inline,.layui-main{position:relative}.layui-edge,hr{height:0;overflow:hidden}.layui-layout-body,.layui-side,.layui-side-scroll{overflow-x:hidden}.layui-edge,.layui-elip,hr{overflow:hidden}.layui-btn,.layui-edge,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-disabled,.layui-icon,.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h4,h5,h6{font-size:100%}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}body{line-height:1.6;color:rgba(0,0,0,.85);font:14px Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif}hr{line-height:0;margin:10px 0;padding:0;border:none!important;border-bottom:1px solid #eee!important;clear:both;background:0 0}a{text-decoration:none}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-border-box,.layui-border-box *{box-sizing:border-box}.layui-box,.layui-box *{box-sizing:content-box}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{*display:inline;*zoom:1}.layui-btn,.layui-btn-group,.layui-edge{display:inline-block}.layui-edge{width:0;border-width:6px;border-style:dashed;border-color:transparent}.layui-edge-top{top:-4px;border-bottom-color:#999;border-bottom-style:solid}.layui-edge-right{border-left-color:#999;border-left-style:solid}.layui-edge-bottom{top:2px;border-top-color:#999;border-top-style:solid}.layui-edge-left{border-right-color:#999;border-right-style:solid}.layui-elip{text-overflow:ellipsis;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-show-v{visibility:visible!important}.layui-hide-v{visibility:hidden!important}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=256);src:url(../font/iconfont.eot?v=256#iefix) format('embedded-opentype'),url(../font/iconfont.woff2?v=256) format('woff2'),url(../font/iconfont.woff?v=256) format('woff'),url(../font/iconfont.ttf?v=256) format('truetype'),url(../font/iconfont.svg?v=256#layui-icon) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-icon-reply-fill:before{content:"\e611"}.layui-icon-set-fill:before{content:"\e614"}.layui-icon-menu-fill:before{content:"\e60f"}.layui-icon-search:before{content:"\e615"}.layui-icon-share:before{content:"\e641"}.layui-icon-set-sm:before{content:"\e620"}.layui-icon-engine:before{content:"\e628"}.layui-icon-close:before{content:"\1006"}.layui-icon-close-fill:before{content:"\1007"}.layui-icon-chart-screen:before{content:"\e629"}.layui-icon-star:before{content:"\e600"}.layui-icon-circle-dot:before{content:"\e617"}.layui-icon-chat:before{content:"\e606"}.layui-icon-release:before{content:"\e609"}.layui-icon-list:before{content:"\e60a"}.layui-icon-chart:before{content:"\e62c"}.layui-icon-ok-circle:before{content:"\1005"}.layui-icon-layim-theme:before{content:"\e61b"}.layui-icon-table:before{content:"\e62d"}.layui-icon-right:before{content:"\e602"}.layui-icon-left:before{content:"\e603"}.layui-icon-cart-simple:before{content:"\e698"}.layui-icon-face-cry:before{content:"\e69c"}.layui-icon-face-smile:before{content:"\e6af"}.layui-icon-survey:before{content:"\e6b2"}.layui-icon-tree:before{content:"\e62e"}.layui-icon-ie:before{content:"\e7bb"}.layui-icon-upload-circle:before{content:"\e62f"}.layui-icon-add-circle:before{content:"\e61f"}.layui-icon-download-circle:before{content:"\e601"}.layui-icon-templeate-1:before{content:"\e630"}.layui-icon-util:before{content:"\e631"}.layui-icon-face-surprised:before{content:"\e664"}.layui-icon-edit:before{content:"\e642"}.layui-icon-speaker:before{content:"\e645"}.layui-icon-down:before{content:"\e61a"}.layui-icon-file:before{content:"\e621"}.layui-icon-layouts:before{content:"\e632"}.layui-icon-rate-half:before{content:"\e6c9"}.layui-icon-add-circle-fine:before{content:"\e608"}.layui-icon-prev-circle:before{content:"\e633"}.layui-icon-read:before{content:"\e705"}.layui-icon-404:before{content:"\e61c"}.layui-icon-carousel:before{content:"\e634"}.layui-icon-help:before{content:"\e607"}.layui-icon-code-circle:before{content:"\e635"}.layui-icon-windows:before{content:"\e67f"}.layui-icon-water:before{content:"\e636"}.layui-icon-username:before{content:"\e66f"}.layui-icon-find-fill:before{content:"\e670"}.layui-icon-about:before{content:"\e60b"}.layui-icon-location:before{content:"\e715"}.layui-icon-up:before{content:"\e619"}.layui-icon-pause:before{content:"\e651"}.layui-icon-date:before{content:"\e637"}.layui-icon-layim-uploadfile:before{content:"\e61d"}.layui-icon-delete:before{content:"\e640"}.layui-icon-play:before{content:"\e652"}.layui-icon-top:before{content:"\e604"}.layui-icon-firefox:before{content:"\e686"}.layui-icon-friends:before{content:"\e612"}.layui-icon-refresh-3:before{content:"\e9aa"}.layui-icon-ok:before{content:"\e605"}.layui-icon-layer:before{content:"\e638"}.layui-icon-face-smile-fine:before{content:"\e60c"}.layui-icon-dollar:before{content:"\e659"}.layui-icon-group:before{content:"\e613"}.layui-icon-layim-download:before{content:"\e61e"}.layui-icon-picture-fine:before{content:"\e60d"}.layui-icon-link:before{content:"\e64c"}.layui-icon-diamond:before{content:"\e735"}.layui-icon-log:before{content:"\e60e"}.layui-icon-key:before{content:"\e683"}.layui-icon-rate-solid:before{content:"\e67a"}.layui-icon-fonts-del:before{content:"\e64f"}.layui-icon-unlink:before{content:"\e64d"}.layui-icon-fonts-clear:before{content:"\e639"}.layui-icon-triangle-r:before{content:"\e623"}.layui-icon-circle:before{content:"\e63f"}.layui-icon-radio:before{content:"\e643"}.layui-icon-align-center:before{content:"\e647"}.layui-icon-align-right:before{content:"\e648"}.layui-icon-align-left:before{content:"\e649"}.layui-icon-loading-1:before{content:"\e63e"}.layui-icon-return:before{content:"\e65c"}.layui-icon-fonts-strong:before{content:"\e62b"}.layui-icon-upload:before{content:"\e67c"}.layui-icon-dialogue:before{content:"\e63a"}.layui-icon-video:before{content:"\e6ed"}.layui-icon-headset:before{content:"\e6fc"}.layui-icon-cellphone-fine:before{content:"\e63b"}.layui-icon-add-1:before{content:"\e654"}.layui-icon-face-smile-b:before{content:"\e650"}.layui-icon-fonts-html:before{content:"\e64b"}.layui-icon-screen-full:before{content:"\e622"}.layui-icon-form:before{content:"\e63c"}.layui-icon-cart:before{content:"\e657"}.layui-icon-camera-fill:before{content:"\e65d"}.layui-icon-tabs:before{content:"\e62a"}.layui-icon-heart-fill:before{content:"\e68f"}.layui-icon-fonts-code:before{content:"\e64e"}.layui-icon-ios:before{content:"\e680"}.layui-icon-at:before{content:"\e687"}.layui-icon-fire:before{content:"\e756"}.layui-icon-set:before{content:"\e716"}.layui-icon-fonts-u:before{content:"\e646"}.layui-icon-triangle-d:before{content:"\e625"}.layui-icon-tips:before{content:"\e702"}.layui-icon-picture:before{content:"\e64a"}.layui-icon-more-vertical:before{content:"\e671"}.layui-icon-bluetooth:before{content:"\e689"}.layui-icon-flag:before{content:"\e66c"}.layui-icon-loading:before{content:"\e63d"}.layui-icon-fonts-i:before{content:"\e644"}.layui-icon-refresh-1:before{content:"\e666"}.layui-icon-rmb:before{content:"\e65e"}.layui-icon-addition:before{content:"\e624"}.layui-icon-home:before{content:"\e68e"}.layui-icon-time:before{content:"\e68d"}.layui-icon-user:before{content:"\e770"}.layui-icon-notice:before{content:"\e667"}.layui-icon-chrome:before{content:"\e68a"}.layui-icon-edge:before{content:"\e68b"}.layui-icon-login-weibo:before{content:"\e675"}.layui-icon-voice:before{content:"\e688"}.layui-icon-upload-drag:before{content:"\e681"}.layui-icon-login-qq:before{content:"\e676"}.layui-icon-snowflake:before{content:"\e6b1"}.layui-icon-heart:before{content:"\e68c"}.layui-icon-logout:before{content:"\e682"}.layui-icon-file-b:before{content:"\e655"}.layui-icon-template:before{content:"\e663"}.layui-icon-transfer:before{content:"\e691"}.layui-icon-auz:before{content:"\e672"}.layui-icon-console:before{content:"\e665"}.layui-icon-app:before{content:"\e653"}.layui-icon-prev:before{content:"\e65a"}.layui-icon-website:before{content:"\e7ae"}.layui-icon-next:before{content:"\e65b"}.layui-icon-component:before{content:"\e857"}.layui-icon-android:before{content:"\e684"}.layui-icon-more:before{content:"\e65f"}.layui-icon-login-wechat:before{content:"\e677"}.layui-icon-shrink-right:before{content:"\e668"}.layui-icon-spread-left:before{content:"\e66b"}.layui-icon-camera:before{content:"\e660"}.layui-icon-note:before{content:"\e66e"}.layui-icon-refresh:before{content:"\e669"}.layui-icon-female:before{content:"\e661"}.layui-icon-male:before{content:"\e662"}.layui-icon-screen-restore:before{content:"\e758"}.layui-icon-password:before{content:"\e673"}.layui-icon-senior:before{content:"\e674"}.layui-icon-theme:before{content:"\e66a"}.layui-icon-tread:before{content:"\e6c5"}.layui-icon-praise:before{content:"\e6c6"}.layui-icon-star-fill:before{content:"\e658"}.layui-icon-rate:before{content:"\e67b"}.layui-icon-template-1:before{content:"\e656"}.layui-icon-vercode:before{content:"\e679"}.layui-icon-service:before{content:"\e626"}.layui-icon-cellphone:before{content:"\e678"}.layui-icon-print:before{content:"\e66d"}.layui-icon-cols:before{content:"\e610"}.layui-icon-wifi:before{content:"\e7e0"}.layui-icon-export:before{content:"\e67d"}.layui-icon-rss:before{content:"\e808"}.layui-icon-slider:before{content:"\e714"}.layui-icon-email:before{content:"\e618"}.layui-icon-subtraction:before{content:"\e67e"}.layui-icon-mike:before{content:"\e6dc"}.layui-icon-light:before{content:"\e748"}.layui-icon-gift:before{content:"\e627"}.layui-icon-mute:before{content:"\e685"}.layui-icon-reduce-circle:before{content:"\e616"}.layui-icon-music:before{content:"\e690"}.layui-main{width:1140px;margin:0 auto}.layui-header{z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;left:0;top:0;bottom:0;z-index:999;width:200px}.layui-side-scroll{position:relative;width:220px;height:100%}.layui-body{position:relative;left:200px;right:0;top:0;bottom:0;z-index:900;width:auto;box-sizing:border-box}.layui-layout-admin .layui-header{position:fixed;top:0;left:0;right:0;background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{position:absolute;top:60px;padding-bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;z-index:990;height:44px;line-height:44px;padding:0 15px;box-shadow:-1px 0 4px rgb(0 0 0 / 12%);background-color:#FAFAFA}.layui-layout-admin .layui-logo{position:absolute;left:0;top:0;width:200px;height:100%;line-height:60px;text-align:center;color:#009688;font-size:16px;box-shadow:0 1px 2px 0 rgb(0 0 0 / 15%)}.layui-layout-admin .layui-header .layui-nav{background:0 0}.layui-layout-left{position:absolute!important;left:200px;top:0}.layui-layout-right{position:absolute!important;right:0;top:0}.layui-container{position:relative;margin:0 auto;padding:0 15px;box-sizing:border-box}.layui-fluid{position:relative;margin:0 auto;padding:0 15px}.layui-row:after,.layui-row:before{content:"";display:block;clear:both}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9,.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9,.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9,.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{position:relative;display:block;box-sizing:border-box}.layui-col-xs1,.layui-col-xs10,.layui-col-xs11,.layui-col-xs12,.layui-col-xs2,.layui-col-xs3,.layui-col-xs4,.layui-col-xs5,.layui-col-xs6,.layui-col-xs7,.layui-col-xs8,.layui-col-xs9{float:left}.layui-col-xs1{width:8.33333333%}.layui-col-xs2{width:16.66666667%}.layui-col-xs3{width:25%}.layui-col-xs4{width:33.33333333%}.layui-col-xs5{width:41.66666667%}.layui-col-xs6{width:50%}.layui-col-xs7{width:58.33333333%}.layui-col-xs8{width:66.66666667%}.layui-col-xs9{width:75%}.layui-col-xs10{width:83.33333333%}.layui-col-xs11{width:91.66666667%}.layui-col-xs12{width:100%}.layui-col-xs-offset1{margin-left:8.33333333%}.layui-col-xs-offset2{margin-left:16.66666667%}.layui-col-xs-offset3{margin-left:25%}.layui-col-xs-offset4{margin-left:33.33333333%}.layui-col-xs-offset5{margin-left:41.66666667%}.layui-col-xs-offset6{margin-left:50%}.layui-col-xs-offset7{margin-left:58.33333333%}.layui-col-xs-offset8{margin-left:66.66666667%}.layui-col-xs-offset9{margin-left:75%}.layui-col-xs-offset10{margin-left:83.33333333%}.layui-col-xs-offset11{margin-left:91.66666667%}.layui-col-xs-offset12{margin-left:100%}@media screen and (max-width:768px){.layui-hide-xs{display:none!important}.layui-show-xs-block{display:block!important}.layui-show-xs-inline{display:inline!important}.layui-show-xs-inline-block{display:inline-block!important}}@media screen and (min-width:768px){.layui-container{width:750px}.layui-hide-sm{display:none!important}.layui-show-sm-block{display:block!important}.layui-show-sm-inline{display:inline!important}.layui-show-sm-inline-block{display:inline-block!important}.layui-col-sm1,.layui-col-sm10,.layui-col-sm11,.layui-col-sm12,.layui-col-sm2,.layui-col-sm3,.layui-col-sm4,.layui-col-sm5,.layui-col-sm6,.layui-col-sm7,.layui-col-sm8,.layui-col-sm9{float:left}.layui-col-sm1{width:8.33333333%}.layui-col-sm2{width:16.66666667%}.layui-col-sm3{width:25%}.layui-col-sm4{width:33.33333333%}.layui-col-sm5{width:41.66666667%}.layui-col-sm6{width:50%}.layui-col-sm7{width:58.33333333%}.layui-col-sm8{width:66.66666667%}.layui-col-sm9{width:75%}.layui-col-sm10{width:83.33333333%}.layui-col-sm11{width:91.66666667%}.layui-col-sm12{width:100%}.layui-col-sm-offset1{margin-left:8.33333333%}.layui-col-sm-offset2{margin-left:16.66666667%}.layui-col-sm-offset3{margin-left:25%}.layui-col-sm-offset4{margin-left:33.33333333%}.layui-col-sm-offset5{margin-left:41.66666667%}.layui-col-sm-offset6{margin-left:50%}.layui-col-sm-offset7{margin-left:58.33333333%}.layui-col-sm-offset8{margin-left:66.66666667%}.layui-col-sm-offset9{margin-left:75%}.layui-col-sm-offset10{margin-left:83.33333333%}.layui-col-sm-offset11{margin-left:91.66666667%}.layui-col-sm-offset12{margin-left:100%}}@media screen and (min-width:992px){.layui-container{width:970px}.layui-hide-md{display:none!important}.layui-show-md-block{display:block!important}.layui-show-md-inline{display:inline!important}.layui-show-md-inline-block{display:inline-block!important}.layui-col-md1,.layui-col-md10,.layui-col-md11,.layui-col-md12,.layui-col-md2,.layui-col-md3,.layui-col-md4,.layui-col-md5,.layui-col-md6,.layui-col-md7,.layui-col-md8,.layui-col-md9{float:left}.layui-col-md1{width:8.33333333%}.layui-col-md2{width:16.66666667%}.layui-col-md3{width:25%}.layui-col-md4{width:33.33333333%}.layui-col-md5{width:41.66666667%}.layui-col-md6{width:50%}.layui-col-md7{width:58.33333333%}.layui-col-md8{width:66.66666667%}.layui-col-md9{width:75%}.layui-col-md10{width:83.33333333%}.layui-col-md11{width:91.66666667%}.layui-col-md12{width:100%}.layui-col-md-offset1{margin-left:8.33333333%}.layui-col-md-offset2{margin-left:16.66666667%}.layui-col-md-offset3{margin-left:25%}.layui-col-md-offset4{margin-left:33.33333333%}.layui-col-md-offset5{margin-left:41.66666667%}.layui-col-md-offset6{margin-left:50%}.layui-col-md-offset7{margin-left:58.33333333%}.layui-col-md-offset8{margin-left:66.66666667%}.layui-col-md-offset9{margin-left:75%}.layui-col-md-offset10{margin-left:83.33333333%}.layui-col-md-offset11{margin-left:91.66666667%}.layui-col-md-offset12{margin-left:100%}}@media screen and (min-width:1200px){.layui-container{width:1170px}.layui-hide-lg{display:none!important}.layui-show-lg-block{display:block!important}.layui-show-lg-inline{display:inline!important}.layui-show-lg-inline-block{display:inline-block!important}.layui-col-lg1,.layui-col-lg10,.layui-col-lg11,.layui-col-lg12,.layui-col-lg2,.layui-col-lg3,.layui-col-lg4,.layui-col-lg5,.layui-col-lg6,.layui-col-lg7,.layui-col-lg8,.layui-col-lg9{float:left}.layui-col-lg1{width:8.33333333%}.layui-col-lg2{width:16.66666667%}.layui-col-lg3{width:25%}.layui-col-lg4{width:33.33333333%}.layui-col-lg5{width:41.66666667%}.layui-col-lg6{width:50%}.layui-col-lg7{width:58.33333333%}.layui-col-lg8{width:66.66666667%}.layui-col-lg9{width:75%}.layui-col-lg10{width:83.33333333%}.layui-col-lg11{width:91.66666667%}.layui-col-lg12{width:100%}.layui-col-lg-offset1{margin-left:8.33333333%}.layui-col-lg-offset2{margin-left:16.66666667%}.layui-col-lg-offset3{margin-left:25%}.layui-col-lg-offset4{margin-left:33.33333333%}.layui-col-lg-offset5{margin-left:41.66666667%}.layui-col-lg-offset6{margin-left:50%}.layui-col-lg-offset7{margin-left:58.33333333%}.layui-col-lg-offset8{margin-left:66.66666667%}.layui-col-lg-offset9{margin-left:75%}.layui-col-lg-offset10{margin-left:83.33333333%}.layui-col-lg-offset11{margin-left:91.66666667%}.layui-col-lg-offset12{margin-left:100%}}.layui-col-space1{margin:-.5px}.layui-col-space1>*{padding:.5px}.layui-col-space2{margin:-1px}.layui-col-space2>*{padding:1px}.layui-col-space4{margin:-2px}.layui-col-space4>*{padding:2px}.layui-col-space5{margin:-2.5px}.layui-col-space5>*{padding:2.5px}.layui-col-space6{margin:-3px}.layui-col-space6>*{padding:3px}.layui-col-space8{margin:-4px}.layui-col-space8>*{padding:4px}.layui-col-space10{margin:-5px}.layui-col-space10>*{padding:5px}.layui-col-space12{margin:-6px}.layui-col-space12>*{padding:6px}.layui-col-space14{margin:-7px}.layui-col-space14>*{padding:7px}.layui-col-space15{margin:-7.5px}.layui-col-space15>*{padding:7.5px}.layui-col-space16{margin:-8px}.layui-col-space16>*{padding:8px}.layui-col-space18{margin:-9px}.layui-col-space18>*{padding:9px}.layui-col-space20{margin:-10px}.layui-col-space20>*{padding:10px}.layui-col-space22{margin:-11px}.layui-col-space22>*{padding:11px}.layui-col-space24{margin:-12px}.layui-col-space24>*{padding:12px}.layui-col-space25{margin:-12.5px}.layui-col-space25>*{padding:12.5px}.layui-col-space26{margin:-13px}.layui-col-space26>*{padding:13px}.layui-col-space28{margin:-14px}.layui-col-space28>*{padding:14px}.layui-col-space30{margin:-15px}.layui-col-space30>*{padding:15px}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-appearance:none;transition:all .3s;-webkit-transition:all .3s;box-sizing:border-box}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:1.6;border-left:5px solid #5FB878;border-radius:0 2px 2px 0;background-color:#FAFAFA}.layui-quote-nm{border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border-width:1px;border-style:solid}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border-width:1px 0 0}.layui-field-box{padding:15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#eee}.layui-progress-bar{position:absolute;left:0;top:0;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-20px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border-width:1px;border-style:solid;border-radius:2px}.layui-colla-content,.layui-colla-item{border-top-width:1px;border-top-style:solid}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#FAFAFA;cursor:pointer;font-size:14px;overflow:hidden}.layui-colla-content{display:none;padding:10px 15px;line-height:1.6;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-card-body,.layui-card-header,.layui-form-label,.layui-form-mid,.layui-form-select,.layui-input-block,.layui-input-inline,.layui-panel,.layui-textarea{position:relative}.layui-card{margin-bottom:15px;border-radius:2px;background-color:#fff;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.layui-form-select dl,.layui-panel{box-shadow:1px 1px 4px rgb(0 0 0 / 8%)}.layui-card:last-child{margin-bottom:0}.layui-card-header{height:42px;line-height:42px;padding:0 15px;border-bottom:1px solid #f6f6f6;color:#333;border-radius:2px 2px 0 0;font-size:14px}.layui-card-body{padding:10px 15px;line-height:24px}.layui-card-body[pad15]{padding:15px}.layui-card-body[pad20]{padding:20px}.layui-card-body .layui-table{margin:5px 0}.layui-card .layui-tab{margin:0}.layui-panel{border-width:1px;border-style:solid;border-radius:2px;background-color:#fff;color:#666}.layui-bg-black,.layui-bg-blue,.layui-bg-cyan,.layui-bg-green,.layui-bg-orange,.layui-bg-red{color:#fff!important}.layui-panel-window{position:relative;padding:15px;border-radius:0;border-top:5px solid #eee;background-color:#fff}.layui-border,.layui-border-black,.layui-border-blue,.layui-border-cyan,.layui-border-green,.layui-border-orange,.layui-border-red{border-width:1px;border-style:solid}.layui-auxiliar-moving{position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;background:0 0;z-index:9999999999}.layui-bg-red{background-color:#FF5722!important}.layui-bg-orange{background-color:#FFB800!important}.layui-bg-green{background-color:#009688!important}.layui-bg-cyan{background-color:#2F4056!important}.layui-bg-blue{background-color:#1E9FFF!important}.layui-bg-black{background-color:#393D49!important}.layui-bg-gray{background-color:#FAFAFA!important;color:#666!important}.layui-badge-rim,.layui-border,.layui-colla-content,.layui-colla-item,.layui-collapse,.layui-elem-field,.layui-form-pane .layui-form-item[pane],.layui-form-pane .layui-form-label,.layui-input,.layui-layedit,.layui-layedit-tool,.layui-panel,.layui-quote-nm,.layui-select,.layui-tab-bar,.layui-tab-card,.layui-tab-title,.layui-tab-title .layui-this:after,.layui-textarea{border-color:#eee}.layui-border{color:#666!important}.layui-border-red{border-color:#FF5722!important;color:#FF5722!important}.layui-border-orange{border-color:#FFB800!important;color:#FFB800!important}.layui-border-green{border-color:#009688!important;color:#009688!important}.layui-border-cyan{border-color:#2F4056!important;color:#2F4056!important}.layui-border-blue{border-color:#1E9FFF!important;color:#1E9FFF!important}.layui-border-black{border-color:#393D49!important;color:#393D49!important}.layui-timeline-item:before{background-color:#eee}.layui-text{line-height:1.6;font-size:14px;color:#666}.layui-text h1,.layui-text h2,.layui-text h3{font-weight:500;color:#333}.layui-text h1{font-size:30px}.layui-text h2{font-size:24px}.layui-text h3{font-size:18px}.layui-text a:not(.layui-btn){color:#01AAED}.layui-text a:not(.layui-btn):hover{text-decoration:underline}.layui-text ul{padding:5px 0 5px 15px}.layui-text ul li{margin-top:5px;list-style-type:disc}.layui-text em,.layui-word-aux{color:#999!important;padding-left:5px!important;padding-right:5px!important}.layui-text p{margin:10px 0}.layui-text p:first-child{margin-top:0}.layui-font-12{font-size:12px!important}.layui-font-14{font-size:14px!important}.layui-font-16{font-size:16px!important}.layui-font-18{font-size:18px!important}.layui-font-20{font-size:20px!important}.layui-font-red{color:#FF5722!important}.layui-font-orange{color:#FFB800!important}.layui-font-green{color:#009688!important}.layui-font-cyan{color:#2F4056!important}.layui-font-blue{color:#01AAED!important}.layui-font-black{color:#000!important}.layui-font-gray{color:#c2c2c2!important}.layui-btn{height:38px;line-height:38px;border:1px solid transparent;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border-radius:2px;cursor:pointer}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-container{font-size:0}.layui-btn-container .layui-btn{margin-right:10px;margin-bottom:10px}.layui-btn-container .layui-btn+.layui-btn{margin-left:0}.layui-table .layui-btn-container .layui-btn{margin-bottom:9px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{padding:0 2px;vertical-align:middle\9;vertical-align:bottom}.layui-btn-primary{border-color:#d2d2d2;background:0 0;color:#666}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#FFB800}.layui-btn-danger{background-color:#FF5722}.layui-btn-checked{background-color:#5FB878}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border-color:#eee!important;background-color:#FBFBFB!important;color:#d2d2d2!important;cursor:not-allowed!important;opacity:1}.layui-btn-lg{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-sm{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-xs{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-xs i{font-size:12px!important}.layui-btn-group{vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#d2d2d2;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #d2d2d2}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-btn-fluid{width:100%}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:1.3;line-height:38px\9;border-width:1px;border-style:solid;background-color:#fff;color:rgba(0,0,0,.85);border-radius:2px}.layui-input::-webkit-input-placeholder,.layui-select::-webkit-input-placeholder,.layui-textarea::-webkit-input-placeholder{line-height:1.3}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#eee!important}.layui-input:focus,.layui-textarea:focus{border-color:#d2d2d2!important}.layui-textarea{min-height:100px;height:auto;line-height:20px;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form [lay-ignore]{display:initial}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;line-height:20px;text-align:right}.layui-form-label-col{display:block;float:none;padding:9px 0;line-height:20px;text-align:left}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:9px 0!important;line-height:20px;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border-color:#FF5722!important}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:899;min-width:100%;border:1px solid #eee;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#F6F6F6;-webkit-transition:.5s all;transition:.5s all}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-select-tips{padding-left:10px!important;color:#999}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-form-selectup dl{top:auto;bottom:42px}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:30px;margin-right:10px;padding-right:30px;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;min-width:18px;min-height:18px;border:none!important;margin-right:0;padding-left:28px;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{padding-left:0;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{right:auto;left:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878!important;background-color:#5FB878;color:#fff}.layui-checkbox-disabled[lay-skin=primary] span{background:0 0!important;color:#c2c2c2!important}.layui-checkbox-disabled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;min-width:35px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:relative;top:0;width:25px;margin-left:21px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-checkbox-disabled,.layui-checkbox-disabled i{border-color:#eee!important}.layui-form-onswitch i{left:100%;margin-left:-21px;background-color:#fff}.layui-form-onswitch em{margin-left:5px;margin-right:21px;color:#fff!important}.layui-checkbox-disabled span{background-color:#eee!important}.layui-checkbox-disabled em{color:#d2d2d2!important}.layui-checkbox-disabled:hover i{color:#fff!important}[lay-radio]{display:none}.layui-form-radio,.layui-form-radio *{display:inline-block;vertical-align:middle}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio *{font-size:14px}.layui-form-radio>i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio:hover *,.layui-form-radioed,.layui-form-radioed>i{color:#5FB878}.layui-radio-disabled>i{color:#eee!important}.layui-radio-disabled *{color:#c2c2c2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border-width:1px;border-style:solid;border-radius:2px 0 0 2px;text-align:center;background-color:#FAFAFA;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;box-sizing:border-box}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-radius:2px;box-sizing:border-box;text-align:left}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border-width:1px;border-style:solid}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto!important;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}.layui-layedit{border-width:1px;border-style:solid;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom-width:1px;border-bottom-style:solid;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #eee}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#eee;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>a:first-child,.layui-laypage>a:first-child em{border-radius:2px 0 0 2px}.layui-laypage>a:last-child,.layui-laypage>a:last-child em{border-radius:0 2px 2px 0}.layui-laypage>:first-child{margin-left:0!important}.layui-laypage>:last-child{margin-right:0!important}.layui-laypage a,.layui-laypage button,.layui-laypage input,.layui-laypage select,.layui-laypage span{border:1px solid #eee}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-flow-more a *,.layui-laypage input,.layui-table-view select[lay-ignore]{display:inline-block}.layui-laypage a:hover{color:#009688}.layui-laypage em{font-style:normal}.layui-laypage .layui-laypage-spr{color:#999;font-weight:700}.layui-laypage a{text-decoration:none}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-count,.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh,.layui-laypage .layui-laypage-skip{margin-left:10px;margin-right:10px;padding:0;border:none}.layui-laypage .layui-laypage-limits,.layui-laypage .layui-laypage-refresh{vertical-align:top}.layui-laypage .layui-laypage-refresh i{font-size:18px;cursor:pointer}.layui-laypage select{height:22px;padding:3px;border-radius:2px;cursor:pointer}.layui-laypage .layui-laypage-skip{height:30px;line-height:30px;color:#999}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box}.layui-laypage input{width:40px;margin:0 10px;padding:0 3px;text-align:center}.layui-laypage input:focus,.layui-laypage select:focus{border-color:#009688!important}.layui-laypage button{margin-left:10px;padding:0 10px;cursor:pointer}.layui-table,.layui-table-view{margin:10px 0}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-table{width:100%;background-color:#fff;color:#666}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table th{text-align:left;font-weight:400}.layui-table tbody tr:hover,.layui-table thead tr,.layui-table-click,.layui-table-header,.layui-table-hover,.layui-table-mend,.layui-table-patch,.layui-table-tool,.layui-table-total,.layui-table-total tr,.layui-table[lay-even] tr:nth-child(even){background-color:#FAFAFA}.layui-table td,.layui-table th,.layui-table-col-set,.layui-table-fixed-r,.layui-table-grid-down,.layui-table-header,.layui-table-page,.layui-table-tips-main,.layui-table-tool,.layui-table-total,.layui-table-view,.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border-width:1px;border-style:solid;border-color:#eee}.layui-table td,.layui-table th{position:relative;padding:9px 15px;min-height:20px;line-height:20px;font-size:14px}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border-width:0 0 1px}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border-width:0 1px 0 0}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-table img{max-width:100px}.layui-table[lay-size=lg] td,.layui-table[lay-size=lg] th{padding:15px 30px}.layui-table-view .layui-table[lay-size=lg] .layui-table-cell{height:40px;line-height:40px}.layui-table[lay-size=sm] td,.layui-table[lay-size=sm] th{font-size:12px;padding:5px 10px}.layui-table-view .layui-table[lay-size=sm] .layui-table-cell{height:20px;line-height:20px}.layui-table[lay-data]{display:none}.layui-table-box{position:relative;overflow:hidden}.layui-table-view .layui-table{position:relative;width:auto;margin:0}.layui-table-view .layui-table[lay-skin=line]{border-width:0 1px 0 0}.layui-table-view .layui-table[lay-skin=row]{border-width:0 0 1px}.layui-table-view .layui-table td,.layui-table-view .layui-table th{padding:5px 0;border-top:none;border-left:none}.layui-table-view .layui-table th.layui-unselect .layui-table-cell span{cursor:pointer}.layui-table-view .layui-table td{cursor:default}.layui-table-view .layui-table td[data-edit=text]{cursor:text}.layui-table-view .layui-form-checkbox[lay-skin=primary] i{width:18px;height:18px}.layui-table-view .layui-form-radio{line-height:0;padding:0}.layui-table-view .layui-form-radio>i{margin:0;font-size:20px}.layui-table-init{position:absolute;left:0;top:0;width:100%;height:100%;text-align:center;z-index:110}.layui-table-init .layui-icon{position:absolute;left:50%;top:50%;margin:-15px 0 0 -15px;font-size:30px;color:#c2c2c2}.layui-table-header{border-width:0 0 1px;overflow:hidden}.layui-table-header .layui-table{margin-bottom:-1px}.layui-table-tool .layui-inline[lay-event]{position:relative;width:26px;height:26px;padding:5px;line-height:16px;margin-right:10px;text-align:center;color:#333;border:1px solid #ccc;cursor:pointer;-webkit-transition:.5s all;transition:.5s all}.layui-table-tool .layui-inline[lay-event]:hover{border:1px solid #999}.layui-table-tool-temp{padding-right:120px}.layui-table-tool-self{position:absolute;right:17px;top:10px}.layui-table-tool .layui-table-tool-self .layui-inline[lay-event]{margin:0 0 0 10px}.layui-table-tool-panel{position:absolute;top:29px;left:-1px;padding:5px 0;min-width:150px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-table-cell,.layui-table-tool-panel li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.layui-table-tool-panel li{padding:0 10px;line-height:30px;-webkit-transition:.5s all;transition:.5s all}.layui-menu li,.layui-menu-body-title a:hover,.layui-menu-body-title>.layui-icon:hover{transition:all .3s}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary]{width:100%;padding-left:28px}.layui-table-tool-panel li:hover{background-color:#F6F6F6}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}.layui-table-tool-panel li .layui-form-checkbox[lay-skin=primary] span{padding:0}.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px}.layui-table-col-set{position:absolute;right:0;top:0;width:20px;height:100%;border-width:0 0 0 1px;background-color:#fff}.layui-table-sort{width:10px;height:20px;margin-left:5px;cursor:pointer!important}.layui-table-sort .layui-edge{position:absolute;left:5px;border-width:5px}.layui-table-sort .layui-table-sort-asc{top:3px;border-top:none;border-bottom-style:solid;border-bottom-color:#b2b2b2}.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color:#666}.layui-table-sort .layui-table-sort-desc{bottom:5px;border-bottom:none;border-top-style:solid;border-top-color:#b2b2b2}.layui-table-sort .layui-table-sort-desc:hover{border-top-color:#666}.layui-table-sort[lay-sort=asc] .layui-table-sort-asc{border-bottom-color:#000}.layui-table-sort[lay-sort=desc] .layui-table-sort-desc{border-top-color:#000}.layui-table-cell{height:28px;line-height:28px;padding:0 15px;position:relative;box-sizing:border-box}.layui-table-cell .layui-form-checkbox[lay-skin=primary]{top:-1px;padding:0}.layui-table-cell .layui-table-link{color:#01AAED}.laytable-cell-checkbox,.laytable-cell-numbers,.laytable-cell-radio,.laytable-cell-space{padding:0;text-align:center}.layui-table-body{position:relative;overflow:auto;margin-right:-1px;margin-bottom:-1px}.layui-table-body .layui-none{line-height:26px;padding:30px 15px;text-align:center;color:#999}.layui-table-fixed{position:absolute;left:0;top:0;z-index:101}.layui-table-fixed .layui-table-body{overflow:hidden}.layui-table-fixed-l{box-shadow:1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r{left:auto;right:-1px;border-width:0 0 0 1px;box-shadow:-1px 0 8px rgba(0,0,0,.08)}.layui-table-fixed-r .layui-table-header{position:relative;overflow:visible}.layui-table-mend{position:absolute;right:-49px;top:0;height:100%;width:50px}.layui-table-tool{position:relative;z-index:890;width:100%;min-height:50px;line-height:30px;padding:10px 15px;border-width:0 0 1px}.layui-table-tool .layui-btn-container{margin-bottom:-10px}.layui-table-page,.layui-table-total{border-width:1px 0 0;margin-bottom:-1px;overflow:hidden}.layui-table-page{position:relative;width:100%;padding:7px 7px 0;height:41px;font-size:12px;white-space:nowrap}.layui-table-page>div{height:26px}.layui-table-page .layui-laypage{margin:0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span{height:26px;line-height:26px;margin-bottom:10px;border:none;background:0 0}.layui-table-page .layui-laypage a,.layui-table-page .layui-laypage span.layui-laypage-curr{padding:0 12px}.layui-table-page .layui-laypage span{margin-left:0;padding:0}.layui-table-page .layui-laypage .layui-laypage-prev{margin-left:-7px!important}.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left:0;top:0;padding:0}.layui-table-page .layui-laypage button,.layui-table-page .layui-laypage input{height:26px;line-height:26px}.layui-table-page .layui-laypage input{width:40px}.layui-table-page .layui-laypage button{padding:0 10px}.layui-table-page select{height:18px}.layui-table-patch .layui-table-cell{padding:0;width:30px}.layui-table-edit{position:absolute;left:0;top:0;width:100%;height:100%;padding:0 14px 1px;border-radius:0;box-shadow:1px 1px 20px rgba(0,0,0,.15)}.layui-table-edit:focus{border-color:#5FB878!important}select.layui-table-edit{padding:0 0 0 10px;border-color:#d2d2d2}.layui-table-view .layui-form-checkbox,.layui-table-view .layui-form-radio,.layui-table-view .layui-form-switch{top:0;margin:0;box-sizing:content-box}.layui-colorpicker-alpha-slider,.layui-colorpicker-side-slider,.layui-menu,.layui-menu *,.layui-nav{box-sizing:border-box}.layui-table-view .layui-form-checkbox{top:-1px;height:26px;line-height:26px}.layui-table-view .layui-form-checkbox i{height:26px}.layui-table-grid .layui-table-cell{overflow:visible}.layui-table-grid-down{position:absolute;top:0;right:0;width:26px;height:100%;padding:5px 0;border-width:0 0 0 1px;text-align:center;background-color:#fff;color:#999;cursor:pointer}.layui-table-grid-down .layui-icon{position:absolute;top:50%;left:50%;margin:-8px 0 0 -8px}.layui-table-grid-down:hover{background-color:#fbfbfb}body .layui-table-tips .layui-layer-content{background:0 0;padding:0;box-shadow:0 1px 6px rgba(0,0,0,.12)}.layui-table-tips-main{margin:-44px 0 0 -1px;max-height:150px;padding:8px 15px;font-size:14px;overflow-y:scroll;background-color:#fff;color:#666}.layui-table-tips-c{position:absolute;right:-3px;top:-13px;width:20px;height:20px;padding:3px;cursor:pointer;background-color:#666;border-radius:50%;color:#fff}.layui-table-tips-c:hover{background-color:#777}.layui-table-tips-c:before{position:relative;right:-2px}.layui-upload-file{display:none!important;opacity:.01;filter:Alpha(opacity=1)}.layui-upload-drag,.layui-upload-form,.layui-upload-wrap{display:inline-block}.layui-upload-list{margin:10px 0}.layui-upload-choose{max-width:200px;padding:0 10px;color:#999;font-size:14px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-upload-drag{position:relative;padding:30px;border:1px dashed #e2e2e2;background-color:#fff;text-align:center;cursor:pointer;color:#999}.layui-upload-drag .layui-icon{font-size:50px;color:#009688}.layui-upload-drag[lay-over]{border-color:#009688}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-wrap{position:relative;vertical-align:middle}.layui-upload-wrap .layui-upload-file{display:block!important;position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-btn-container .layui-upload-choose{padding-left:0}.layui-menu{position:relative;margin:5px 0;background-color:#fff}.layui-menu li,.layui-menu-body-title a{padding:5px 15px}.layui-menu li{position:relative;margin:1px 0;width:calc(100% + 1px);line-height:26px;color:rgba(0,0,0,.8);font-size:14px;white-space:nowrap;cursor:pointer}.layui-menu li:hover{background-color:#F6F6F6}.layui-menu-item-parent:hover>.layui-menu-body-panel{display:block;animation-name:layui-fadein;animation-duration:.3s;animation-fill-mode:both;animation-delay:.2s}.layui-menu-item-group .layui-menu-body-title,.layui-menu-item-parent .layui-menu-body-title{padding-right:25px}.layui-menu .layui-menu-item-divider:hover,.layui-menu .layui-menu-item-group:hover,.layui-menu .layui-menu-item-none:hover{background:0 0;cursor:default}.layui-menu .layui-menu-item-group>ul{margin:5px 0 -5px}.layui-menu .layui-menu-item-group>.layui-menu-body-title{color:rgba(0,0,0,.35);user-select:none}.layui-menu .layui-menu-item-none{color:rgba(0,0,0,.35);cursor:default;text-align:center}.layui-menu .layui-menu-item-divider{margin:5px 0;padding:0;height:0;line-height:0;border-bottom:1px solid #eee;overflow:hidden}.layui-menu .layui-menu-item-down:hover,.layui-menu .layui-menu-item-up:hover{cursor:pointer}.layui-menu .layui-menu-item-up>.layui-menu-body-title{color:rgba(0,0,0,.8)}.layui-menu .layui-menu-item-up>ul{visibility:hidden;height:0;overflow:hidden}.layui-menu .layui-menu-item-down:hover>.layui-menu-body-title>.layui-icon,.layui-menu .layui-menu-item-up>.layui-menu-body-title:hover>.layui-icon{color:rgba(0,0,0,1)}.layui-menu .layui-menu-item-down>ul{visibility:visible;height:auto}.layui-breadcrumb,.layui-tree-btnGroup{visibility:hidden}.layui-menu .layui-menu-item-checked,.layui-menu .layui-menu-item-checked2{background-color:#F6F6F6!important;color:#5FB878}.layui-menu .layui-menu-item-checked a,.layui-menu .layui-menu-item-checked2 a{color:#5FB878}.layui-menu .layui-menu-item-checked:after{position:absolute;right:0;top:0;bottom:0;border-right:3px solid #5FB878;content:""}.layui-menu-body-title{position:relative;overflow:hidden;text-overflow:ellipsis}.layui-menu-body-title a{display:block;margin:-5px -15px;color:rgba(0,0,0,.8)}.layui-menu-body-title>.layui-icon{position:absolute;right:0;top:0;font-size:14px}.layui-menu-body-title>.layui-icon-right{right:-1px}.layui-menu-body-panel{display:none;position:absolute;top:-7px;left:100%;z-index:1000;margin-left:13px;padding:5px 0}.layui-menu-body-panel:before{content:"";position:absolute;width:20px;left:-16px;top:0;bottom:0}.layui-menu-body-panel-left{left:auto;right:100%;margin:0 13px}.layui-menu-body-panel-left:before{left:auto;right:-16px}.layui-menu-lg li{line-height:32px}.layui-menu-lg .layui-menu-body-title a:hover,.layui-menu-lg li:hover{background:0 0;color:#5FB878}.layui-menu-lg li .layui-menu-body-panel{margin-left:14px}.layui-menu-lg li .layui-menu-body-panel-left{margin:0 15px}.layui-dropdown{position:absolute;left:-999999px;top:-999999px;z-index:66666666;margin:5px 0;min-width:100px}.layui-dropdown:before{content:"";position:absolute;width:100%;height:6px;left:0;top:-6px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#fff;border-radius:2px;font-size:0}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#fff;color:rgba(255,255,255,.7);transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar{content:"";position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s;pointer-events:none}.layui-nav-bar{z-index:1000}.layui-nav[lay-bar=disabled] .layui-nav-bar{display:none}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{top:auto;bottom:0;width:100%}.layui-nav-img{width:30px;height:30px;margin-right:10px;border-radius:50%}.layui-nav .layui-nav-more{position:absolute;top:0;right:3px;left:auto!important;margin-top:0;font-size:12px;cursor:pointer;transition:all .2s;-webkit-transition:all .2s}.layui-nav .layui-nav-mored,.layui-nav-itemed>a .layui-nav-more{transform:rotate(180deg)}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #eee;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#666;color:rgba(0,0,0,.8)}.layui-nav .layui-nav-child a:hover{background-color:#F6F6F6;color:rgba(0,0,0,.8)}.layui-nav-child dd{margin:1px 0;position:relative}.layui-nav-child dd.layui-this{background-color:#F6F6F6;color:#000}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-child-r{left:auto;right:0}.layui-nav-child-c{text-align:center}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:40px}.layui-nav-tree .layui-nav-item a{position:relative;height:40px;line-height:40px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item>a{padding-top:5px;padding-bottom:5px}.layui-nav-tree .layui-nav-more{right:15px}.layui-nav-tree .layui-nav-item>a .layui-nav-more{padding:5px 0}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-side .layui-nav-tree .layui-nav-bar{width:2px}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-nav-child dd.layui-this a,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{color:#fff!important}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child dd{margin:0}.layui-nav-tree .layui-nav-child a{color:#fff;color:rgba(255,255,255,.7)}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-itemed>.layui-nav-child{display:block;background-color:rgba(0,0,0,.3)!important}.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display:block}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{font-size:0}.layui-breadcrumb>*{font-size:14px}.layui-breadcrumb a{color:#999!important}.layui-breadcrumb a:hover{color:#5FB878!important}.layui-breadcrumb a cite{color:#666;font-style:normal}.layui-breadcrumb span[lay-separator]{margin:0 10px;color:#999}.layui-tab{margin:10px 0;text-align:left!important}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom-width:1px;border-bottom-style:solid;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 15px;text-align:center;cursor:pointer}.layui-tab-title li a{display:block;padding:0 15px;margin:0 -15px}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:"";width:100%;height:41px;border-width:1px;border-style:solid;border-bottom-color:#fff;border-radius:2px 2px 0 0;box-sizing:border-box;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border-width:1px;border-style:solid;border-radius:2px;text-align:center;background-color:#fff;cursor:pointer}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item{display:none}.layui-tab-more{padding-right:30px;height:auto!important;white-space:normal!important}.layui-tab-more li.layui-this:after{border-bottom-color:#eee;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:15px 0}.layui-tab-title li .layui-tab-close{position:relative;display:inline-block;width:18px;height:18px;line-height:20px;margin-left:8px;top:1px;text-align:center;font-size:14px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:2px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border-width:1px;border-style:solid;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#FAFAFA}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-timeline{padding-left:5px}.layui-timeline-item{position:relative;padding-bottom:20px}.layui-timeline-axis{position:absolute;left:-5px;top:0;z-index:10;width:20px;height:20px;line-height:20px;background-color:#fff;color:#5FB878;border-radius:50%;text-align:center;cursor:pointer}.layui-timeline-axis:hover{color:#FF5722}.layui-timeline-item:before{content:"";position:absolute;left:5px;top:0;z-index:0;width:1px;height:100%}.layui-timeline-item:first-child:before{display:block}.layui-timeline-item:last-child:before{display:none}.layui-timeline-content{padding-left:25px}.layui-timeline-title{position:relative;margin-bottom:10px;line-height:22px}.layui-badge,.layui-badge-dot,.layui-badge-rim{position:relative;display:inline-block;padding:0 6px;font-size:12px;text-align:center;background-color:#FF5722;color:#fff;border-radius:2px}.layui-badge{height:18px;line-height:18px}.layui-badge-dot{width:8px;height:8px;padding:0;border-radius:50%}.layui-badge-rim{height:18px;line-height:18px;border-width:1px;border-style:solid;background-color:#fff;color:#666}.layui-btn .layui-badge,.layui-btn .layui-badge-dot{margin-left:5px}.layui-nav .layui-badge,.layui-nav .layui-badge-dot{position:absolute;top:50%;margin:-5px 6px 0}.layui-nav .layui-badge{margin-top:-10px}.layui-tab-title .layui-badge,.layui-tab-title .layui-badge-dot{left:5px;top:-2px}.layui-carousel{position:relative;left:0;top:0;background-color:#f8f8f8}.layui-carousel>[carousel-item]{position:relative;width:100%;height:100%;overflow:hidden}.layui-carousel>[carousel-item]:before{position:absolute;content:'\e63d';left:50%;top:50%;width:100px;line-height:20px;margin:-10px 0 0 -50px;text-align:center;color:#c2c2c2;font-family:layui-icon!important;font-size:30px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-carousel>[carousel-item]>*{display:none;position:absolute;left:0;top:0;width:100%;height:100%;background-color:#f8f8f8;transition-duration:.3s;-webkit-transition-duration:.3s}.layui-carousel-updown>*{-webkit-transition:.3s ease-in-out up;transition:.3s ease-in-out up}.layui-carousel-arrow{display:none\9;opacity:0;position:absolute;left:10px;top:50%;margin-top:-18px;width:36px;height:36px;line-height:36px;text-align:center;font-size:20px;border:0;border-radius:50%;background-color:rgba(0,0,0,.2);color:#fff;-webkit-transition-duration:.3s;transition-duration:.3s;cursor:pointer}.layui-carousel-arrow[lay-type=add]{left:auto!important;right:10px}.layui-carousel:hover .layui-carousel-arrow[lay-type=add],.layui-carousel[lay-arrow=always] .layui-carousel-arrow[lay-type=add]{right:20px}.layui-carousel[lay-arrow=always] .layui-carousel-arrow{opacity:1;left:20px}.layui-carousel[lay-arrow=none] .layui-carousel-arrow{display:none}.layui-carousel-arrow:hover,.layui-carousel-ind ul:hover{background-color:rgba(0,0,0,.35)}.layui-carousel:hover .layui-carousel-arrow{display:block\9;opacity:1;left:20px}.layui-carousel-ind{position:relative;top:-35px;width:100%;line-height:0!important;text-align:center;font-size:0}.layui-carousel[lay-indicator=outside]{margin-bottom:30px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind{top:10px}.layui-carousel[lay-indicator=outside] .layui-carousel-ind ul{background-color:rgba(0,0,0,.5)}.layui-carousel[lay-indicator=none] .layui-carousel-ind{display:none}.layui-carousel-ind ul{display:inline-block;padding:5px;background-color:rgba(0,0,0,.2);border-radius:10px;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li{display:inline-block;width:10px;height:10px;margin:0 3px;font-size:14px;background-color:#eee;background-color:rgba(255,255,255,.5);border-radius:50%;cursor:pointer;-webkit-transition-duration:.3s;transition-duration:.3s}.layui-carousel-ind li:hover{background-color:rgba(255,255,255,.7)}.layui-carousel-ind li.layui-this{background-color:#fff}.layui-carousel>[carousel-item]>.layui-carousel-next,.layui-carousel>[carousel-item]>.layui-carousel-prev,.layui-carousel>[carousel-item]>.layui-this{display:block}.layui-carousel>[carousel-item]>.layui-this{left:0}.layui-carousel>[carousel-item]>.layui-carousel-prev{left:-100%}.layui-carousel>[carousel-item]>.layui-carousel-next{left:100%}.layui-carousel>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel>[carousel-item]>.layui-carousel-prev.layui-carousel-right{left:0}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-left{left:-100%}.layui-carousel>[carousel-item]>.layui-this.layui-carousel-right{left:100%}.layui-carousel[lay-anim=updown] .layui-carousel-arrow{left:50%!important;top:20px;margin:0 0 0 -18px}.layui-carousel[lay-anim=updown]>[carousel-item]>*,.layui-carousel[lay-anim=fade]>[carousel-item]>*{left:0!important}.layui-carousel[lay-anim=updown] .layui-carousel-arrow[lay-type=add]{top:auto!important;bottom:20px}.layui-carousel[lay-anim=updown] .layui-carousel-ind{position:absolute;top:50%;right:20px;width:auto;height:auto}.layui-carousel[lay-anim=updown] .layui-carousel-ind ul{padding:3px 5px}.layui-carousel[lay-anim=updown] .layui-carousel-ind li{display:block;margin:6px 0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next{top:100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{top:0}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-left{top:-100%}.layui-carousel[lay-anim=updown]>[carousel-item]>.layui-this.layui-carousel-right{top:100%}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev{opacity:0}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-next.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-carousel-prev.layui-carousel-right{opacity:1}.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-left,.layui-carousel[lay-anim=fade]>[carousel-item]>.layui-this.layui-carousel-right{opacity:0}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:999999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;text-align:center;cursor:pointer;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face .layui-layer-TipsG{display:none}.layui-transfer-active,.layui-transfer-box{display:inline-block;vertical-align:middle}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{cursor:pointer;float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px;text-align:center}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New;font-size:12px}.layui-transfer-box,.layui-transfer-header,.layui-transfer-search{border-width:0;border-style:solid;border-color:#eee}.layui-transfer-box{position:relative;border-width:1px;width:200px;height:360px;border-radius:2px;background-color:#fff}.layui-transfer-box .layui-form-checkbox{width:100%;margin:0!important}.layui-transfer-header{height:38px;line-height:38px;padding:0 10px;border-bottom-width:1px}.layui-transfer-search{position:relative;padding:10px;border-bottom-width:1px}.layui-transfer-search .layui-input{height:32px;padding-left:30px;font-size:12px}.layui-transfer-search .layui-icon-search{position:absolute;left:20px;top:50%;margin-top:-8px;color:#666}.layui-transfer-active{margin:0 15px}.layui-transfer-active .layui-btn{display:block;margin:0;padding:0 15px;background-color:#5FB878;border-color:#5FB878;color:#fff}.layui-transfer-active .layui-btn-disabled{background-color:#FBFBFB;border-color:#eee;color:#d2d2d2}.layui-transfer-active .layui-btn:first-child{margin-bottom:15px}.layui-transfer-active .layui-btn .layui-icon{margin:0;font-size:14px!important}.layui-transfer-data{padding:5px 0;overflow:auto}.layui-transfer-data li{height:32px;line-height:32px;padding:0 10px}.layui-transfer-data li:hover{background-color:#F6F6F6;transition:.5s all}.layui-transfer-data .layui-none{padding:15px 10px;text-align:center;color:#999}.layui-rate,.layui-rate *{display:inline-block;vertical-align:middle}.layui-rate{padding:10px 5px 10px 0;font-size:0}.layui-rate li i.layui-icon{font-size:20px;color:#FFB800;margin-right:5px;transition:all .3s;-webkit-transition:all .3s}.layui-rate li i:hover{cursor:pointer;transform:scale(1.12);-webkit-transform:scale(1.12)}.layui-rate[readonly] li i:hover{cursor:default;transform:scale(1)}.layui-colorpicker{width:26px;height:26px;border:1px solid #eee;padding:5px;border-radius:2px;line-height:24px;display:inline-block;cursor:pointer;transition:all .3s;-webkit-transition:all .3s}.layui-colorpicker:hover{border-color:#d2d2d2}.layui-colorpicker.layui-colorpicker-lg{width:34px;height:34px;line-height:32px}.layui-colorpicker.layui-colorpicker-sm{width:24px;height:24px;line-height:22px}.layui-colorpicker.layui-colorpicker-xs{width:22px;height:22px;line-height:20px}.layui-colorpicker-trigger-bgcolor{display:block;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);border-radius:2px}.layui-colorpicker-trigger-span{display:block;height:100%;box-sizing:border-box;border:1px solid rgba(0,0,0,.15);border-radius:2px;text-align:center}.layui-colorpicker-trigger-i{display:inline-block;color:#FFF;font-size:12px}.layui-colorpicker-trigger-i.layui-icon-close{color:#999}.layui-colorpicker-main{position:absolute;left:-999999px;top:-999999px;z-index:66666666;width:280px;margin:5px 0;padding:7px;background:#FFF;border:1px solid #d2d2d2;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12)}.layui-colorpicker-main-wrapper{height:180px;position:relative}.layui-colorpicker-basis{width:260px;height:100%;position:relative}.layui-colorpicker-basis-white{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(90deg,#FFF,hsla(0,0%,100%,0))}.layui-colorpicker-basis-black{width:100%;height:100%;position:absolute;top:0;left:0;background:linear-gradient(0deg,#000,transparent)}.layui-colorpicker-basis-cursor{width:10px;height:10px;border:1px solid #FFF;border-radius:50%;position:absolute;top:-3px;right:-3px;cursor:pointer}.layui-colorpicker-side{position:absolute;top:0;right:0;width:12px;height:100%;background:linear-gradient(red,#FF0,#0F0,#0FF,#00F,#F0F,red)}.layui-colorpicker-side-slider{width:100%;height:5px;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;left:0}.layui-colorpicker-main-alpha{display:none;height:12px;margin-top:7px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-alpha-bgcolor{height:100%;position:relative}.layui-colorpicker-alpha-slider{width:5px;height:100%;box-shadow:0 0 1px #888;background:#FFF;border-radius:1px;border:1px solid #f0f0f0;cursor:pointer;position:absolute;top:0}.layui-colorpicker-main-pre{padding-top:7px;font-size:0}.layui-colorpicker-pre{width:20px;height:20px;border-radius:2px;display:inline-block;margin-left:6px;margin-bottom:7px;cursor:pointer}.layui-colorpicker-pre:nth-child(11n+1){margin-left:0}.layui-colorpicker-pre-isalpha{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.layui-colorpicker-pre.layui-this{box-shadow:0 0 3px 2px rgba(0,0,0,.15)}.layui-colorpicker-pre>div{height:100%;border-radius:2px}.layui-colorpicker-main-input{text-align:right;padding-top:7px}.layui-colorpicker-main-input .layui-btn-container .layui-btn{margin:0 0 0 10px}.layui-colorpicker-main-input div.layui-inline{float:left;margin-right:10px;font-size:14px}.layui-colorpicker-main-input input.layui-input{width:150px;height:30px;color:#666}.layui-slider{height:4px;background:#eee;border-radius:3px;position:relative;cursor:pointer}.layui-slider-bar{border-radius:3px;position:absolute;height:100%}.layui-slider-step{position:absolute;top:0;width:4px;height:4px;border-radius:50%;background:#FFF;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.layui-slider-wrap{width:36px;height:36px;position:absolute;top:-16px;-webkit-transform:translateX(-50%);transform:translateX(-50%);z-index:10;text-align:center}.layui-slider-wrap-btn{width:12px;height:12px;border-radius:50%;background:#FFF;display:inline-block;vertical-align:middle;cursor:pointer;transition:.3s}.layui-slider-wrap:after{content:"";height:100%;display:inline-block;vertical-align:middle}.layui-slider-wrap-btn.layui-slider-hover,.layui-slider-wrap-btn:hover{transform:scale(1.2)}.layui-slider-wrap-btn.layui-disabled:hover{transform:scale(1)!important}.layui-slider-tips{position:absolute;top:-42px;z-index:66666666;white-space:nowrap;display:none;-webkit-transform:translateX(-50%);transform:translateX(-50%);color:#FFF;background:#000;border-radius:3px;height:25px;line-height:25px;padding:0 10px}.layui-slider-tips:after{content:"";position:absolute;bottom:-12px;left:50%;margin-left:-6px;width:0;height:0;border-width:6px;border-style:solid;border-color:#000 transparent transparent}.layui-slider-input{width:70px;height:32px;border:1px solid #eee;border-radius:3px;font-size:16px;line-height:32px;position:absolute;right:0;top:-14px}.layui-slider-input-btn{position:absolute;top:0;right:0;width:20px;height:100%;border-left:1px solid #eee}.layui-slider-input-btn i{cursor:pointer;position:absolute;right:0;bottom:0;width:20px;height:50%;font-size:12px;line-height:16px;text-align:center;color:#999}.layui-slider-input-btn i:first-child{top:0;border-bottom:1px solid #eee}.layui-slider-input-txt{height:100%;font-size:14px}.layui-slider-input-txt input{height:100%;border:none}.layui-slider-input-btn i:hover{color:#009688}.layui-slider-vertical{width:4px;margin-left:33px}.layui-slider-vertical .layui-slider-bar{width:4px}.layui-slider-vertical .layui-slider-step{top:auto;left:0;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-wrap{top:auto;left:-16px;-webkit-transform:translateY(50%);transform:translateY(50%)}.layui-slider-vertical .layui-slider-tips{top:auto;left:2px}@media \0screen{.layui-slider-wrap-btn{margin-left:-20px}.layui-slider-vertical .layui-slider-wrap-btn{margin-left:0;margin-bottom:-20px}.layui-slider-vertical .layui-slider-tips{margin-left:-8px}.layui-slider>span{margin-left:8px}}.layui-tree{line-height:22px}.layui-tree .layui-form-checkbox{margin:0!important}.layui-tree-set{width:100%;position:relative}.layui-tree-pack{display:none;padding-left:20px;position:relative}.layui-tree-iconClick,.layui-tree-main{display:inline-block;vertical-align:middle}.layui-tree-line .layui-tree-pack{padding-left:27px}.layui-tree-line .layui-tree-set .layui-tree-set:after{content:"";position:absolute;top:14px;left:-9px;width:17px;height:0;border-top:1px dotted #c0c4cc}.layui-tree-entry{position:relative;padding:3px 0;height:20px;white-space:nowrap}.layui-tree-entry:hover{background-color:#eee}.layui-tree-line .layui-tree-entry:hover{background-color:rgba(0,0,0,0)}.layui-tree-line .layui-tree-entry:hover .layui-tree-txt{color:#999;text-decoration:underline;transition:.3s}.layui-tree-main{cursor:pointer;padding-right:10px}.layui-tree-line .layui-tree-set:before{content:"";position:absolute;top:0;left:-9px;width:0;height:100%;border-left:1px dotted #c0c4cc}.layui-tree-line .layui-tree-set.layui-tree-setLineShort:before{height:13px}.layui-tree-line .layui-tree-set.layui-tree-setHide:before{height:0}.layui-tree-iconClick{position:relative;height:20px;line-height:20px;margin:0 10px;color:#c0c4cc}.layui-tree-icon{height:12px;line-height:12px;width:12px;text-align:center;border:1px solid #c0c4cc}.layui-tree-iconClick .layui-icon{font-size:18px}.layui-tree-icon .layui-icon{font-size:12px;color:#666}.layui-tree-iconArrow{padding:0 5px}.layui-tree-iconArrow:after{content:"";position:absolute;left:4px;top:3px;z-index:100;width:0;height:0;border-width:5px;border-style:solid;border-color:transparent transparent transparent #c0c4cc;transition:.5s}.layui-tree-btnGroup,.layui-tree-editInput{position:relative;vertical-align:middle;display:inline-block}.layui-tree-spread>.layui-tree-entry>.layui-tree-iconClick>.layui-tree-iconArrow:after{transform:rotate(90deg) translate(3px,4px)}.layui-tree-txt{display:inline-block;vertical-align:middle;color:#555}.layui-tree-search{margin-bottom:15px;color:#666}.layui-tree-btnGroup .layui-icon{display:inline-block;vertical-align:middle;padding:0 2px;cursor:pointer}.layui-tree-btnGroup .layui-icon:hover{color:#999;transition:.3s}.layui-tree-entry:hover .layui-tree-btnGroup{visibility:visible}.layui-tree-editInput{height:20px;line-height:20px;padding:0 3px;border:none;background-color:rgba(0,0,0,.05)}.layui-tree-emptyText{text-align:center;color:#999}.layui-anim{-webkit-animation-duration:.3s;-webkit-animation-fill-mode:both;animation-duration:.3s;animation-fill-mode:both}.layui-anim.layui-icon{display:inline-block}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.layui-trans,.layui-trans a{transition:all .2s;-webkit-transition:all .2s}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,15px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,15px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@keyframes layui-down{0%{opacity:.3;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-down{animation-name:layui-down}@keyframes layui-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-anim-downbit{animation-name:layui-downbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;transform:scale(.5)}80%{opacity:.8;transform:scale(1.1)}100%{opacity:1;transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@keyframes layui-scalesmall{0%{opacity:.3;transform:scale(1.5)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall{animation-name:layui-scalesmall}@keyframes layui-scalesmall-spring{0%{opacity:.3;transform:scale(1.5)}80%{opacity:.8;transform:scale(.9)}100%{opacity:1;transform:scale(1)}}.layui-anim-scalesmall-spring{animation-name:layui-scalesmall-spring}@-webkit-keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}@keyframes layui-fadein{0%{opacity:0}100%{opacity:1}}.layui-anim-fadein{-webkit-animation-name:layui-fadein;animation-name:layui-fadein}@-webkit-keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}@keyframes layui-fadeout{0%{opacity:1}100%{opacity:0}}.layui-anim-fadeout{-webkit-animation-name:layui-fadeout;animation-name:layui-fadeout} ================================================ FILE: static/common/layui/css/modules/code.css ================================================ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none} ================================================ FILE: static/common/layui/css/modules/laydate/default/laydate.css ================================================ .laydate-set-ym,.layui-laydate,.layui-laydate *,.layui-laydate-list{box-sizing:border-box}html #layuicss-laydate{display:none;position:absolute;width:1989px}.layui-laydate *{margin:0;padding:0}.layui-laydate{position:absolute;z-index:66666666;margin:5px 0;border-radius:2px;font-size:14px;-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;animation-name:laydate-downbit}.layui-laydate-main{width:272px}.layui-laydate-content td,.layui-laydate-header *,.layui-laydate-list li{transition-duration:.3s;-webkit-transition-duration:.3s}@keyframes laydate-downbit{0%{opacity:.3;transform:translate3d(0,-5px,0)}100%{opacity:1;transform:translate3d(0,0,0)}}.layui-laydate-static{position:relative;z-index:0;display:inline-block;margin:0;-webkit-animation:none;animation:none}.laydate-ym-show .laydate-next-m,.laydate-ym-show .laydate-prev-m{display:none!important}.laydate-ym-show .laydate-next-y,.laydate-ym-show .laydate-prev-y{display:inline-block!important}.laydate-time-show .laydate-set-ym span[lay-type=month],.laydate-time-show .laydate-set-ym span[lay-type=year],.laydate-time-show .layui-laydate-header .layui-icon,.laydate-ym-show .laydate-set-ym span[lay-type=month]{display:none!important}.layui-laydate-header{position:relative;line-height:30px;padding:10px 70px 5px}.layui-laydate-header *{display:inline-block;vertical-align:bottom}.layui-laydate-header i{position:absolute;top:10px;padding:0 5px;color:#999;font-size:18px;cursor:pointer}.layui-laydate-header i.laydate-prev-y{left:15px}.layui-laydate-header i.laydate-prev-m{left:45px}.layui-laydate-header i.laydate-next-y{right:15px}.layui-laydate-header i.laydate-next-m{right:45px}.laydate-set-ym{width:100%;text-align:center;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate-set-ym span{padding:0 10px;cursor:pointer}.laydate-time-text{cursor:default!important}.layui-laydate-content{position:relative;padding:10px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-laydate-content table{border-collapse:collapse;border-spacing:0}.layui-laydate-content td,.layui-laydate-content th{width:36px;height:30px;padding:5px;text-align:center}.layui-laydate-content td{position:relative;cursor:pointer}.laydate-day-mark{position:absolute;left:0;top:0;width:100%;line-height:30px;font-size:12px;overflow:hidden}.laydate-day-mark::after{position:absolute;content:'';right:2px;top:2px;width:5px;height:5px;border-radius:50%}.layui-laydate-footer{position:relative;height:46px;line-height:26px;padding:10px}.layui-laydate-footer span{display:inline-block;vertical-align:top;height:26px;line-height:24px;padding:0 10px;border:1px solid #C9C9C9;border-radius:2px;background-color:#fff;font-size:12px;cursor:pointer;white-space:nowrap;transition:all .3s}.layui-laydate-list>li,.layui-laydate-range .layui-laydate-main{display:inline-block;vertical-align:middle}.layui-laydate-footer span:hover{color:#5FB878}.layui-laydate-footer span.layui-laydate-preview{cursor:default;border-color:transparent!important}.layui-laydate-footer span.layui-laydate-preview:hover{color:#666}.layui-laydate-footer span:first-child.layui-laydate-preview{padding-left:0}.laydate-footer-btns{position:absolute;right:10px;top:10px}.laydate-footer-btns span{margin:0 0 0 -1px}.layui-laydate-list{position:absolute;left:0;top:0;width:100%;height:100%;padding:10px;background-color:#fff}.layui-laydate-list>li{position:relative;width:33.3%;height:36px;line-height:36px;margin:3px 0;text-align:center;cursor:pointer}.laydate-month-list>li{width:25%;margin:17px 0}.laydate-time-list>li{height:100%;margin:0;line-height:normal;cursor:default}.laydate-time-list p{position:relative;top:-4px;line-height:29px}.laydate-time-list ol{height:181px;overflow:hidden}.laydate-time-list>li:hover ol{overflow-y:auto}.laydate-time-list ol li{width:130%;padding-left:33px;height:30px;line-height:30px;text-align:left;cursor:pointer}.layui-laydate-hint{position:absolute;top:115px;left:50%;width:250px;margin-left:-125px;line-height:20px;padding:15px;text-align:center;font-size:12px}.layui-laydate-range{width:546px}.layui-laydate-range .laydate-main-list-1 .layui-laydate-content,.layui-laydate-range .laydate-main-list-1 .layui-laydate-header{border-left:1px solid #e2e2e2}.layui-laydate,.layui-laydate-hint{border:1px solid #d2d2d2;box-shadow:0 2px 4px rgba(0,0,0,.12);background-color:#fff;color:#666}.layui-laydate-header{border-bottom:1px solid #e2e2e2}.layui-laydate-header i:hover,.layui-laydate-header span:hover{color:#5FB878}.layui-laydate-content{border-top:none 0;border-bottom:none 0}.layui-laydate-content th{font-weight:400;color:#333}.layui-laydate-content td{color:#666}.layui-laydate-content td.laydate-selected{background-color:#B5FFF8}.laydate-selected:hover{background-color:#00F7DE!important}.layui-laydate-content td:hover,.layui-laydate-list li:hover{background-color:#eee;color:#333}.laydate-time-list li ol{margin:0;padding:0;border:1px solid #e2e2e2;border-left-width:0}.laydate-time-list li:first-child ol{border-left-width:1px}.laydate-time-list>li:hover{background:0 0}.layui-laydate-content .laydate-day-next,.layui-laydate-content .laydate-day-prev{color:#d2d2d2}.laydate-selected.laydate-day-next,.laydate-selected.laydate-day-prev{background-color:#f8f8f8!important}.layui-laydate-footer{border-top:1px solid #e2e2e2}.layui-laydate-hint{color:#FF5722}.laydate-day-mark::after{background-color:#5FB878}.layui-laydate-content td.layui-this .laydate-day-mark::after{display:none}.layui-laydate-footer span[lay-type=date]{color:#5FB878}.layui-laydate .layui-this{background-color:#009688!important;color:#fff!important}.layui-laydate .laydate-disabled,.layui-laydate .laydate-disabled:hover{background:0 0!important;color:#d2d2d2!important;cursor:not-allowed!important;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.laydate-theme-molv{border:none}.laydate-theme-molv.layui-laydate-range{width:548px}.laydate-theme-molv .layui-laydate-main{width:274px}.laydate-theme-molv .layui-laydate-header{border:none;background-color:#009688}.laydate-theme-molv .layui-laydate-header i,.laydate-theme-molv .layui-laydate-header span{color:#f6f6f6}.laydate-theme-molv .layui-laydate-header i:hover,.laydate-theme-molv .layui-laydate-header span:hover{color:#fff}.laydate-theme-molv .layui-laydate-content{border:1px solid #e2e2e2;border-top:none;border-bottom:none}.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left:none}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li,.laydate-theme-grid .layui-laydate-content td,.laydate-theme-grid .layui-laydate-content thead,.laydate-theme-molv .layui-laydate-footer{border:1px solid #e2e2e2}.laydate-theme-grid .laydate-selected,.laydate-theme-grid .laydate-selected:hover{background-color:#f2f2f2!important;color:#009688!important}.laydate-theme-grid .laydate-selected.laydate-day-next,.laydate-theme-grid .laydate-selected.laydate-day-prev{color:#d2d2d2!important}.laydate-theme-grid .laydate-month-list,.laydate-theme-grid .laydate-year-list{margin:1px 0 0 1px}.laydate-theme-grid .laydate-month-list>li,.laydate-theme-grid .laydate-year-list>li{margin:0 -1px -1px 0}.laydate-theme-grid .laydate-year-list>li{height:43px;line-height:43px}.laydate-theme-grid .laydate-month-list>li{height:71px;line-height:71px} ================================================ FILE: static/common/layui/css/modules/layer/default/layer.css ================================================ .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:50px;line-height:50px;border-bottom:1px solid #F0F0F0;font-size:14px;color:#333;overflow:hidden;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:17px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:300px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:260px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:300px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:51px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{background:0 0;box-shadow:none}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgnext,.layui-layer-imgprev{position:fixed;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:30px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:30px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:fixed;left:0;right:0;bottom:0;width:100%;height:40px;line-height:40px;background-color:#000\9;filter:Alpha(opacity=60);background-color:rgba(2,0,0,.35);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} ================================================ FILE: static/common/layui/layui.js ================================================ ;function strhtml(str){var s="";if(!str){return''}str=htmlstr(str);if(str.length==0)return"";s=str.replace(/&/g,"&");s=s.replace(//g,">");s=s.replace(/ /g," ");s=s.replace(/\'/g,"'");s=s.replace(/\"/g,'"');return s}function htmlstr(str){var s="";if(!str){return''}if(str.length==0)return"";s=str.replace(/&/g,"&");s=s.replace(/</g,"<");s=s.replace(/>/g,">");s=s.replace(/ /g," ");s=s.replace(/'/g,"\'");s=s.replace(/"/g,"\"");return s}!function(t){"use strict";var e=t.document,n={modules:{},status:{},timeout:10,event:{}},r=function(){this.v="2.6.8"},o=t.LAYUI_GLOBAL||{},a=function(){var t=e.currentScript?e.currentScript.src:function(){for(var t,n=e.scripts,r=n.length-1,o=r;o>0;o--)if("interactive"===n[o].readyState){t=n[o].src;break}return t||n[r].src}();return n.dir=o.dir||t.substring(0,t.lastIndexOf("/")+1)}(),i=function(e,n){n=n||"log",t.console&&console[n]&&console[n]("layui error hint: "+e)},u="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),l=n.builtin={lay:"lay",layer:"layer",laydate:"laydate",laypage:"laypage",laytpl:"laytpl",layedit:"layedit",form:"form",upload:"upload",dropdown:"dropdown",transfer:"transfer",tree:"tree",table:"table",element:"element",rate:"rate",colorpicker:"colorpicker",slider:"slider",carousel:"carousel",flow:"flow",util:"util",code:"code",jquery:"jquery",all:"all","layui.all":"layui.all"};r.prototype.cache=n,r.prototype.define=function(t,e){var r=this,o="function"==typeof t,a=function(){var t=function(t,e){layui[t]=e,n.status[t]=!0};return"function"==typeof e&&e(function(r,o){t(r,o),n.callback[r]=function(){e(t)}}),this};return o&&(e=t,t=[]),r.use(t,a,null,"define"),r},r.prototype.use=function(r,o,c,s){function p(t,e){var r="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===t.type||r.test((t.currentTarget||t.srcElement).readyState))&&(n.modules[h]=e,v.removeChild(b),function o(){return++m>1e3*n.timeout/4?i(h+" is not a valid module","error"):void(n.status[h]?f():setTimeout(o,4))}())}function f(){c.push(layui[h]),r.length>1?y.use(r.slice(1),o,c,s):"function"==typeof o&&function(){return layui.jquery&&"function"==typeof layui.jquery&&"define"!==s?layui.jquery(function(){o.apply(layui,c)}):void o.apply(layui,c)}()}var y=this,d=n.dir=n.dir?n.dir:a,v=e.getElementsByTagName("head")[0];r=function(){return"string"==typeof r?[r]:"function"==typeof r?(o=r,["all"]):r}(),t.jQuery&&jQuery.fn.on&&(y.each(r,function(t,e){"jquery"===e&&r.splice(t,1)}),layui.jquery=layui.$=jQuery);var h=r[0],m=0;if(c=c||[],n.host=n.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===r.length||layui["layui.all"]&&l[h])return f(),y;var g=(l[h]?d+"modules/":/^\{\/\}/.test(y.modules[h])?"":n.base||"")+(y.modules[h]||h)+".js";if(g=g.replace(/^\{\/\}/,""),!n.modules[h]&&layui[h]&&(n.modules[h]=g),n.modules[h])!function S(){return++m>1e3*n.timeout/4?i(h+" is not a valid module","error"):void("string"==typeof n.modules[h]&&n.status[h]?f():setTimeout(S,4))}();else{var b=e.createElement("script");b.async=!0,b.charset="utf-8",b.src=g+function(){var t=n.version===!0?n.v||(new Date).getTime():n.version||"";return t?"?v="+t:""}(),v.appendChild(b),!b.attachEvent||b.attachEvent.toString&&b.attachEvent.toString().indexOf("[native code")<0||u?b.addEventListener("load",function(t){p(t,g)},!1):b.attachEvent("onreadystatechange",function(t){p(t,g)}),n.modules[h]=g}return y},r.prototype.getStyle=function(e,n){var r=e.currentStyle?e.currentStyle:t.getComputedStyle(e,null);return r[r.getPropertyValue?"getPropertyValue":"getAttribute"](n)},r.prototype.link=function(t,r,o){var a=this,u=e.getElementsByTagName("head")[0],l=e.createElement("link");"string"==typeof r&&(o=r);var c=(o||t).replace(/\.|\//g,""),s=l.id="layuicss-"+c,p="creating",f=0;return l.rel="stylesheet",l.href=t+(n.debug?"?v="+(new Date).getTime():""),l.media="all",e.getElementById(s)||u.appendChild(l),"function"!=typeof r?a:(function y(o){var u=100,l=e.getElementById(s);return++f>1e3*n.timeout/u?i(t+" timeout"):void(1989===parseInt(a.getStyle(l,"width"))?(o===p&&l.removeAttribute("lay-status"),l.getAttribute("lay-status")===p?setTimeout(y,u):r()):(l.setAttribute("lay-status",p),setTimeout(function(){y(p)},u)))}(),a)},r.prototype.addcss=function(t,e,r){return layui.link(n.dir+"css/"+t,e,r)},n.callback={},r.prototype.factory=function(t){if(layui[t])return"function"==typeof n.callback[t]?n.callback[t]:null},r.prototype.img=function(t,e,n){var r=new Image;return r.src=t,r.complete?e(r):(r.onload=function(){r.onload=null,"function"==typeof e&&e(r)},void(r.onerror=function(t){r.onerror=null,"function"==typeof n&&n(t)}))},r.prototype.config=function(t){t=t||{};for(var e in t)n[e]=t[e];return this},r.prototype.modules=function(){var t={};for(var e in l)t[e]=l[e];return t}(),r.prototype.extend=function(t){var e=this;t=t||{};for(var n in t)e[n]||e.modules[n]?i(n+" Module already exists","error"):e.modules[n]=t[n];return e},r.prototype.router=function(t){var e=this,t=t||location.hash,n={path:[],search:{},hash:(t.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(t)?(t=t.replace(/^#\//,""),n.href="/"+t,t=t.replace(/([^#])(#.*$)/,"$1").split("/")||[],e.each(t,function(t,e){/^\w+=/.test(e)?function(){e=e.split("="),n.search[e[0]]=e[1]}():n.path.push(e)}),n):n},r.prototype.url=function(t){var e=this,n={pathname:function(){var e=t?function(){var e=(t.match(/\.[^.]+?\/.+/)||[])[0]||"";return e.replace(/^[^\/]+/,"").replace(/\?.+/,"")}():location.pathname;return e.replace(/^\//,"").split("/")}(),search:function(){var n={},r=(t?function(){var e=(t.match(/\?.+/)||[])[0]||"";return e.replace(/\#.+/,"")}():location.search).replace(/^\?+/,"").split("&");return e.each(r,function(t,e){var r=e.indexOf("="),o=function(){return r<0?e.substr(0,e.length):0!==r&&e.substr(0,r)}();o&&(n[o]=r>0?e.substr(r+1):null)}),n}(),hash:e.router(function(){return t?(t.match(/#.+/)||[])[0]||"/":location.hash}())};return n},r.prototype.data=function(e,n,r){if(e=e||"layui",r=r||localStorage,t.JSON&&t.JSON.parse){if(null===n)return delete r[e];n="object"==typeof n?n:{key:n};try{var o=JSON.parse(r[e])}catch(a){var o={}}return"value"in n&&(o[n.key]=n.value),n.remove&&delete o[n.key],r[e]=JSON.stringify(o),n.key?o[n.key]:o}},r.prototype.sessionData=function(t,e){return this.data(t,e,sessionStorage)},r.prototype.device=function(e){var n=navigator.userAgent.toLowerCase(),r=function(t){var e=new RegExp(t+"/([^\\s\\_\\-]+)");return t=(n.match(e)||[])[1],t||!1},o={os:function(){return/windows/.test(n)?"windows":/linux/.test(n)?"linux":/iphone|ipod|ipad|ios/.test(n)?"ios":/mac/.test(n)?"mac":void 0}(),ie:function(){return!!(t.ActiveXObject||"ActiveXObject"in t)&&((n.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:r("micromessenger")};return e&&!o[e]&&(o[e]=r(e)),o.android=/android/.test(n),o.ios="ios"===o.os,o.mobile=!(!o.android&&!o.ios),o},r.prototype.hint=function(){return{error:i}},r.prototype._typeof=function(t){return null===t?String(t):"object"==typeof t||"function"==typeof t?function(){var e=Object.prototype.toString.call(t).match(/\s(.+)\]$/)||[],n="Function|Array|Date|RegExp|Object|Error|Symbol";return e=e[1]||"Object",new RegExp("\\b("+n+")\\b").test(e)?e.toLowerCase():"object"}():typeof t},r.prototype._isArray=function(e){var n,r=this,o=r._typeof(e);return!(!e||"object"!=typeof e||e===t)&&(n="length"in e&&e.length,"array"===o||0===n||"number"==typeof n&&n>0&&n-1 in e)},r.prototype.each=function(t,e){var n,r=this,o=function(t,n){return e.call(n[t],t,n[t])};if("function"!=typeof e)return r;if(t=t||[],r._isArray(t))for(n=0;no?1:r(t.innerHeight||n.documentElement.clientHeight)},r.position=function(e,o,i){if(o){i=i||{},e!==n&&e!==r("body")[0]||(i.clickType="right");var c="right"===i.clickType?function(){var e=i.e||t.event||{};return{left:e.clientX,top:e.clientY,right:e.clientX,bottom:e.clientY}}():e.getBoundingClientRect(),u=o.offsetWidth,a=o.offsetHeight,f=function(t){return t=t?"scrollLeft":"scrollTop",n.body[t]|n.documentElement[t]},s=function(t){return n.documentElement[t?"clientWidth":"clientHeight"]},l=5,h=c.left,p=c.bottom;"center"===i.align?h-=(u-e.offsetWidth)/2:"right"===i.align&&(h=h-u+e.offsetWidth),h+u+l>s("width")&&(h=s("width")-u-l),hs()&&(c.top>a+l?p=c.top-a-2*l:"right"===i.clickType&&(p=s()-a-2*l,p<0&&(p=0)));var y=i.position;if(y&&(o.style.position=y),o.style.left=h+("fixed"===y?0:f(1))+"px",o.style.top=p+("fixed"===y?0:f())+"px",!r.hasScrollbar()){var d=o.getBoundingClientRect();!i.SYSTEM_RELOAD&&d.bottom+l>s()&&(i.SYSTEM_RELOAD=!0,setTimeout(function(){r.position(e,o,i)},50))}}},r.options=function(t,e){var n=r(t),o=e||"lay-options";try{return new Function("return "+(n.attr(o)||"{}"))()}catch(i){return hint.error("parseerror\uff1a"+i,"error"),{}}},r.isTopElem=function(t){var e=[n,r("body")[0]],o=!1;return r.each(e,function(e,n){if(n===t)return o=!0}),o},o.addStr=function(t,e){return t=t.replace(/\s+/," "),e=e.replace(/\s+/," ").split(" "),r.each(e,function(e,n){new RegExp("\\b"+n+"\\b").test(t)||(t=t+" "+n)}),t.replace(/^\s|\s$/,"")},o.removeStr=function(t,e){return t=t.replace(/\s+/," "),e=e.replace(/\s+/," ").split(" "),r.each(e,function(e,n){var r=new RegExp("\\b"+n+"\\b");r.test(t)&&(t=t.replace(r,""))}),t.replace(/\s+/," ").replace(/^\s|\s$/,"")},o.prototype.find=function(t){var e=this,n=0,o=[],i="object"==typeof t;return this.each(function(r,c){for(var u=i?c.contains(t):c.querySelectorAll(t||null);n0)return n[0].style[t]}():n.each(function(n,i){"object"==typeof t?r.each(t,function(t,e){i.style[t]=o(e)}):i.style[t]=o(e)})},o.prototype.width=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].offsetWidth}():e.each(function(n,r){e.css("width",t)})},o.prototype.height=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].offsetHeight}():e.each(function(n,r){e.css("height",t)})},o.prototype.attr=function(t,e){var n=this;return void 0===e?function(){if(n.length>0)return n[0].getAttribute(t)}():n.each(function(n,r){r.setAttribute(t,e)})},o.prototype.removeAttr=function(t){return this.each(function(e,n){n.removeAttribute(t)})},o.prototype.html=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].innerHTML}():this.each(function(e,n){n.innerHTML=t})},o.prototype.val=function(t){var e=this;return void 0===t?function(){if(e.length>0)return e[0].value}():this.each(function(e,n){n.value=t})},o.prototype.append=function(t){return this.each(function(e,n){"object"==typeof t?n.appendChild(t):n.innerHTML=n.innerHTML+t})},o.prototype.remove=function(t){return this.each(function(e,n){t?n.removeChild(t):n.parentNode.removeChild(n)})},o.prototype.on=function(t,e){return this.each(function(n,r){r.attachEvent?r.attachEvent("on"+t,function(t){t.target=t.srcElement,e.call(r,t)}):r.addEventListener(t,e,!1)})},o.prototype.off=function(t,e){return this.each(function(n,r){r.detachEvent?r.detachEvent("on"+t,e):r.removeEventListener(t,e,!1)})},t.lay=r,t.layui&&layui.define&&layui.define(function(t){t(e,r)})}(window,window.document);layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error: ";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\(.)/g,"$1")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\(.)/g,"$1")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'\u5171 '+a.count+" \u6761",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
    ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
    "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(e,t){"use strict";var a=e.layui&&layui.define,n={getPath:e.lay&&lay.getPath?lay.getPath:"",link:function(t,a,n){l.path&&e.lay&&lay.layui&&lay.layui.link(l.path+t,a,n)}},i=e.LAYUI_GLOBAL||{},l={v:"5.3.1",config:{},index:e.laydate&&e.laydate.v?1e5:0,path:i.laydate_dir||n.getPath,set:function(e){var t=this;return t.config=lay.extend({},t.config,e),t},ready:function(e){var t="laydate",i="",r=(a?"modules/laydate/":"theme/")+"default/laydate.css?v="+l.v+i;return a?layui.addcss(r,e,t):n.link(r,e,t),this}},r=function(){var e=this,t=e.config,a=t.id;return r.that[a]=e,{hint:function(t){e.hint.call(e,t)},config:e.config}},o="laydate",s=".layui-laydate",y="layui-this",d="laydate-disabled",m=[100,2e5],c="layui-laydate-static",u="layui-laydate-list",h="layui-laydate-hint",f="layui-laydate-footer",p=".laydate-btns-confirm",g="laydate-time-text",v="laydate-btns-time",T="layui-laydate-preview",D=function(e){var t=this;t.index=++l.index,t.config=lay.extend({},t.config,l.config,e),e=t.config,e.id="id"in e?e.id:t.index,l.ready(function(){t.init()})},w="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s";r.formatArr=function(e){return(e||"").match(new RegExp(w+"|.","g"))||[]},D.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},D.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"click",show:!1,showBottom:!0,isPreview:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},D.prototype.lang=function(){var e=this,t=e.config,a={cn:{weeks:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d"],time:["\u65f6","\u5206","\u79d2"],timeTips:"\u9009\u62e9\u65f6\u95f4",startTime:"\u5f00\u59cb\u65f6\u95f4",endTime:"\u7ed3\u675f\u65f6\u95f4",dateTips:"\u8fd4\u56de\u65e5\u671f",month:["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"],tools:{confirm:"\u786e\u5b9a",clear:"\u6e05\u7a7a",now:"\u73b0\u5728"},timeout:"\u7ed3\u675f\u65f6\u95f4\u4e0d\u80fd\u65e9\u4e8e\u5f00\u59cb\u65f6\u95f4
    \u8bf7\u91cd\u65b0\u9009\u62e9",invalidDate:"\u4e0d\u5728\u6709\u6548\u65e5\u671f\u6216\u65f6\u95f4\u8303\u56f4\u5185",formatError:["\u65e5\u671f\u683c\u5f0f\u4e0d\u5408\u6cd5
    \u5fc5\u987b\u9075\u5faa\u4e0b\u8ff0\u683c\u5f0f\uff1a
    ","
    \u5df2\u4e3a\u4f60\u91cd\u7f6e"],preview:"\u5f53\u524d\u9009\u4e2d\u7684\u7ed3\u679c"},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"},timeout:"End time cannot be less than start Time
    Please re-select",invalidDate:"Invalid date",formatError:["The date format error
    Must be followed\uff1a
    ","
    It has been reset"],preview:"The selected result"}};return a[t.lang]||a.cn},D.prototype.init=function(){var t=this,a=t.config,n="static"===a.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};a.elem=lay(a.elem),a.eventElem=lay(a.eventElem),a.elem[0]&&(t.rangeStr=a.range?"string"==typeof a.range?a.range:"-":"","array"===layui._typeof(a.range)&&(t.rangeElem=[lay(a.range[0]),lay(a.range[1])]),i[a.type]||(e.console&&console.error&&console.error("laydate type error:'"+a.type+"' is not supported"),a.type="date"),a.format===i.date&&(a.format=i[a.type]||i.date),t.format=r.formatArr(a.format),t.EXP_IF="",t.EXP_SPLIT="",lay.each(t.format,function(e,a){var n=new RegExp(w).test(a)?"\\d{"+function(){return new RegExp(w).test(t.format[0===e?e+1:e-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;t.EXP_IF=t.EXP_IF+n,t.EXP_SPLIT=t.EXP_SPLIT+"("+n+")"}),t.EXP_IF_ONE=new RegExp("^"+t.EXP_IF+"$"),t.EXP_IF=new RegExp("^"+(a.range?t.EXP_IF+"\\s\\"+t.rangeStr+"\\s"+t.EXP_IF:t.EXP_IF)+"$"),t.EXP_SPLIT=new RegExp("^"+t.EXP_SPLIT+"$",""),t.isInput(a.elem[0])||"focus"===a.trigger&&(a.trigger="click"),a.elem.attr("lay-key")||(a.elem.attr("lay-key",t.index),a.eventElem.attr("lay-key",t.index)),a.mark=lay.extend({},a.calendar&&"cn"===a.lang?{"0-1-1":"\u5143\u65e6","0-2-14":"\u60c5\u4eba","0-3-8":"\u5987\u5973","0-3-12":"\u690d\u6811","0-4-1":"\u611a\u4eba","0-5-1":"\u52b3\u52a8","0-5-4":"\u9752\u5e74","0-6-1":"\u513f\u7ae5","0-9-10":"\u6559\u5e08","0-9-18":"\u56fd\u803b","0-10-1":"\u56fd\u5e86","0-12-25":"\u5723\u8bde"}:{},a.mark),lay.each(["min","max"],function(e,t){var n=[],i=[];if("number"==typeof a[t]){var l=a[t],r=(new Date).getTime(),o=864e5,s=new Date(l?l0)return!0;var t=lay.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=lay.elem("div",{"class":"laydate-set-ym"}),t=lay.elem("span"),a=lay.elem("span");return e.appendChild(t),e.appendChild(a),e}(),function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=lay.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],l=lay.elem("div",{"class":"layui-laydate-content"}),r=lay.elem("table"),m=lay.elem("thead"),c=lay.elem("tr");lay.each(i,function(e,a){t.appendChild(a)}),m.appendChild(c),lay.each(new Array(6),function(e){var t=r.insertRow(0);lay.each(new Array(7),function(a){if(0===e){var i=lay.elem("th");i.innerHTML=n.weeks[a],c.appendChild(i)}t.insertCell(a)})}),r.insertBefore(m,r.children[0]),l.appendChild(r),o[e]=lay.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),o[e].appendChild(t),o[e].appendChild(l),s.push(i),y.push(l),d.push(r)}),lay(m).html(function(){var e=[],t=[];return"datetime"===a.type&&e.push(''+n.timeTips+""),(a.range||"datetime"!==a.type)&&e.push(''),lay.each(a.btns,function(e,l){var r=n.tools[l]||"btn";a.range&&"now"===l||(i&&"clear"===l&&(r="cn"===a.lang?"\u91cd\u7f6e":"Reset"),t.push(''+r+""))}),e.push('"),e.join("")}()),lay.each(o,function(e,t){r.appendChild(t)}),a.showBottom&&r.appendChild(m),/^#/.test(a.theme)){var u=lay.elem("style"),h=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,a.theme);"styleSheet"in u?(u.setAttribute("type","text/css"),u.styleSheet.cssText=h):u.innerHTML=h,lay(r).addClass("laydate-theme-molv"),r.appendChild(u)}l.thisId=a.id,e.remove(D.thisElemDate),i?a.elem.append(r):(t.body.appendChild(r),e.position()),e.checkDate().calendar(null,0,"init"),e.changeEvent(),D.thisElemDate=e.elemID,"function"==typeof a.ready&&a.ready(lay.extend({},a.dateTime,{month:a.dateTime.month+1})),e.preview()},D.prototype.remove=function(e){var t=this,a=(t.config,lay("#"+(e||t.elemID)));return a[0]?(a.hasClass(c)||t.checkDate(function(){a.remove()}),t):t},D.prototype.position=function(){var e=this,t=e.config;return lay.position(e.bindElem||t.elem[0],e.elem,{position:t.position}),e},D.prototype.hint=function(e){var t=this,a=(t.config,lay.elem("div",{"class":h}));t.elem&&(a.innerHTML=e||"",lay(t.elem).find("."+h).remove(),t.elem.appendChild(a),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){lay(t.elem).find("."+h).remove()},3e3))},D.prototype.getAsYM=function(e,t,a){return a?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},D.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},D.prototype.checkDate=function(e){var t,a,n=this,i=(new Date,n.config),r=n.lang(),o=i.dateTime=i.dateTime||n.systemDate(),s=n.bindElem||i.elem[0],y=(n.isInput(s)?"val":"html",function(){if(n.rangeElem){var e=[n.rangeElem[0].val(),n.rangeElem[1].val()];if(e[0]&&e[1])return e.join(" "+n.rangeStr+" ")}return n.isInput(s)?s.value:"static"===i.position?"":lay(s).attr("lay-date")}()),d=function(e){e.year>m[1]&&(e.year=m[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=l.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},c=function(e,t,l){var r=["startTime","endTime"];t=(t.match(n.EXP_SPLIT)||[]).slice(1),l=l||0,i.range&&(n[r[l]]=n[r[l]]||{}),lay.each(n.format,function(o,s){var y=parseFloat(t[o]);t[o].lengthh(i.max)||h(o)h(i.max))&&(n.endDate=lay.extend({},i.max)),e&&e(),n},D.prototype.mark=function(e,t){var a,n=this,i=n.config;return lay.each(i.mark,function(e,n){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(a=n||t[2])}),a&&e.html(''+a+""),n},D.prototype.limit=function(e,t,a,n){var i,l=this,r=l.config,o={},s=r[a>41?"endDate":"dateTime"],y=lay.extend({},s,t||{});return lay.each({now:y,min:r.min,max:r.max},function(e,t){o[e]=l.newDate(lay.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return lay.each(n,function(a,n){e[n]=t[n]}),e}())).getTime()}),i=o.nowo.max,e&&e[i?"addClass":"removeClass"](d),i},D.prototype.thisDateTime=function(e){var t=this,a=t.config;return e?t.endDate:a.dateTime},D.prototype.calendar=function(e,t,a){var n,i,r,o=this,s=o.config,t=t?1:0,d=e||o.thisDateTime(t),c=new Date,u=o.lang(),h="date"!==s.type&&"datetime"!==s.type,f=lay(o.table[t]).find("td"),g=lay(o.elemHeader[t][2]).find("span");return d.yearm[1]&&(d.year=m[1],o.hint(u.invalidDate)),o.firstDate||(o.firstDate=lay.extend({},d)),c.setFullYear(d.year,d.month,1),n=c.getDay(),i=l.getEndDate(d.month||12,d.year),r=l.getEndDate(d.month+1,d.year),lay.each(f,function(e,t){var a=[d.year,d.month],l=0;t=lay(t),t.removeAttr("class"),e=n&&e=a.firstDate.year&&(l.month=n.max.month,l.date=n.max.date),a.limit(lay(i),l,t),M++}),lay(m[f?0:1]).attr("lay-ym",M-8+"-"+D[1]).html(E+T+" - "+(M-1+T))}else if("month"===e)lay.each(new Array(12),function(e){var i=lay.elem("li",{"lay-ym":e}),r={year:D[0],month:e};e+1==D[1]&&lay(i).addClass(y),i.innerHTML=l.month[e]+(f?"\u6708":""),o.appendChild(i),D[0]=a.firstDate.year&&(r.date=n.max.date),a.limit(lay(i),r,t)}),lay(m[f?0:1]).attr("lay-ym",D[0]+"-"+D[1]).html(D[0]+T);else if("time"===e){var C=function(){lay(o).find("ol").each(function(e,n){lay(n).find("li").each(function(n,i){a.limit(lay(i),[{hours:n},{hours:a[x].hours,minutes:n},{hours:a[x].hours,minutes:a[x].minutes,seconds:n}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),n.range||a.limit(lay(a.footer).find(p),a[x],0,["hours","minutes","seconds"])};n.range?a[x]||(a[x]="startTime"===x?i:a.endDate):a[x]=i,lay.each([24,60,60],function(e,t){var n=lay.elem("li"),i=["

    "+l.time[e]+"

      "];lay.each(new Array(t),function(t){i.push(""+lay.digit(t,2)+"")}),n.innerHTML=i.join("")+"
    ",o.appendChild(n)}),C()}if(h&&c.removeChild(h),c.appendChild(o),"year"===e||"month"===e)lay(a.elemMain[t]).addClass("laydate-ym-show"),lay(o).find("li").on("click",function(){var l=0|lay(this).attr("lay-ym");if(!lay(this).hasClass(d)){0===t?(i[e]=l,a.limit(lay(a.footer).find(p),null,0)):a.endDate[e]=l;var s="year"===n.type||"month"===n.type;s?(lay(o).find("."+y).removeClass(y),lay(this).addClass(y),"month"===n.type&&"year"===e&&(a.listYM[t][0]=l,r&&((t?a.endDate:i).year=l),a.list("month",t))):(a.checkDate("limit").calendar(null,t),a.closeList()),a.setBtnStatus(),n.range||("month"===n.type&&"month"===e||"year"===n.type&&"year"===e)&&a.setValue(a.parse()).remove().done(),a.done(null,"change"),lay(a.footer).find("."+v).removeClass(d)}});else{var I=lay.elem("span",{"class":g}),k=function(){lay(o).find("ol").each(function(e){var t=this,n=lay(t).find("li");t.scrollTop=30*(a[x][w[e]]-2),t.scrollTop<=0&&n.each(function(e,a){if(!lay(this).hasClass(d))return t.scrollTop=30*(e-2),!0})})},b=lay(s[2]).find("."+g);k(),I.innerHTML=n.range?[l.startTime,l.endTime][t]:l.timeTips,lay(a.elemMain[t]).addClass("laydate-time-show"),b[0]&&b.remove(),s[2].appendChild(I),lay(o).find("ol").each(function(e){var t=this;lay(t).find("li").on("click",function(){var l=0|this.innerHTML;lay(this).hasClass(d)||(n.range?a[x][w[e]]=l:i[w[e]]=l,lay(t).find("."+y).removeClass(y),lay(this).addClass(y),C(),k(),(a.endDate||"time"===n.type)&&a.done(null,"change"),a.setBtnStatus())})})}return a},D.prototype.listYM=[],D.prototype.closeList=function(){var e=this;e.config;lay.each(e.elemCont,function(t,a){lay(this).find("."+u).remove(),lay(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),lay(e.elem).find("."+g).remove()},D.prototype.setBtnStatus=function(e,t,a){var n,i=this,l=i.config,r=i.lang(),o=lay(i.footer).find(p);l.range&&"time"!==l.type&&(t=t||l.dateTime,a=a||i.endDate,n=i.newDate(t).getTime()>i.newDate(a).getTime(),i.limit(null,t)||i.limit(null,a)?o.addClass(d):o[n?"addClass":"removeClass"](d),e&&n&&i.hint("string"==typeof e?r.timeout.replace(/\u65e5\u671f/g,e):r.timeout))},D.prototype.parse=function(e,t){var a=this,n=a.config,i=t||("end"==e?lay.extend({},a.endDate,a.endTime):n.range?lay.extend({},n.dateTime,a.startTime):n.dateTime),r=l.parse(i,a.format,1);return n.range&&void 0===e?r+" "+a.rangeStr+" "+a.parse("end"):r},D.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},D.prototype.setValue=function(e){var t=this,a=t.config,n=t.bindElem||a.elem[0];return"static"===a.position?t:(e=e||"",t.isInput(n)?lay(n).val(e):t.rangeElem?(t.rangeElem[0].val(e?t.parse("start"):""),t.rangeElem[1].val(e?t.parse("end"):"")):(0===lay(n).find("*").length&&lay(n).html(e),lay(n).attr("lay-date",e)),t)},D.prototype.preview=function(){var e=this,t=e.config;if(t.isPreview){var a=lay(e.elem).find("."+T),n=t.range?e.endDate?e.parse():"":e.parse();a.html(n).css({color:"#5FB878"}),setTimeout(function(){a.css({color:"#666"})},300)}},D.prototype.done=function(e,t){var a=this,n=a.config,i=lay.extend({},lay.extend(n.dateTime,a.startTime)),l=lay.extend({},lay.extend(a.endDate,a.endTime));return lay.each([i,l],function(e,t){"month"in t&&lay.extend(t,{month:t.month+1})}),a.preview(),e=e||[a.parse(),i,l],"function"==typeof n[t||"done"]&&n[t||"done"].apply(n,e),a},D.prototype.choose=function(e,t){var a=this,n=a.config,i=a.thisDateTime(t),l=(lay(a.elem).find("td"),e.attr("lay-ymd").split("-"));l={year:0|l[0],month:(0|l[1])-1,date:0|l[2]},e.hasClass(d)||(lay.extend(i,l),n.range?(lay.each(["startTime","endTime"],function(e,t){a[t]=a[t]||{hours:0,minutes:0,seconds:0}}),a.calendar(null,t).done(null,"change")):"static"===n.position?a.calendar().done().done(null,"change"):"date"===n.type?a.setValue(a.parse()).remove().done():"datetime"===n.type&&a.calendar().done(null,"change"))},D.prototype.tool=function(e,t){var a=this,n=a.config,i=a.lang(),l=n.dateTime,r="static"===n.position,o={datetime:function(){lay(e).hasClass(d)||(a.list("time",0),n.range&&a.list("time",1),lay(e).attr("lay-type","date").html(a.lang().dateTips))},date:function(){a.closeList(),lay(e).attr("lay-type","datetime").html(a.lang().timeTips)},clear:function(){r&&(lay.extend(l,a.firstDate),a.calendar()),n.range&&(delete n.dateTime,delete a.endDate,delete a.startTime,delete a.endTime),a.setValue("").remove(),a.done(["",{},{}])},now:function(){var e=new Date;lay.extend(l,a.systemDate(),{hours:e.getHours(),minutes:e.getMinutes(),seconds:e.getSeconds()}),a.setValue(a.parse()).remove(),r&&a.calendar(),a.done()},confirm:function(){if(n.range){if(lay(e).hasClass(d))return a.hint("time"===n.type?i.timeout.replace(/\u65e5\u671f/g,"\u65f6\u95f4"):i.timeout)}else if(lay(e).hasClass(d))return a.hint(i.invalidDate);a.done(),a.setValue(a.parse()).remove()}};o[t]&&o[t]()},D.prototype.change=function(e){var t=this,a=t.config,n=t.thisDateTime(e),i=a.range&&("year"===a.type||"month"===a.type),l=t.elemCont[e||0],r=t.listYM[e],o=function(o){var s=lay(l).find(".laydate-year-list")[0],y=lay(l).find(".laydate-month-list")[0];return s&&(r[0]=o?r[0]-15:r[0]+15,t.list("year",e)),y&&(o?r[0]--:r[0]++,t.list("month",e)),(s||y)&&(lay.extend(n,{year:r[0]}),i&&(n.year=r[0]),a.range||t.done(null,"change"),a.range||t.limit(lay(t.footer).find(p),{year:r[0]})),t.setBtnStatus(),s||y};return{prevYear:function(){o("sub")||(n.year--,t.checkDate("limit").calendar(null,e),t.done(null,"change"))},prevMonth:function(){var a=t.getAsYM(n.year,n.month,"sub");lay.extend(n,{year:a[0],month:a[1]}),t.checkDate("limit").calendar(null,e),t.done(null,"change")},nextMonth:function(){var a=t.getAsYM(n.year,n.month);lay.extend(n,{year:a[0],month:a[1]}),t.checkDate("limit").calendar(null,e),t.done(null,"change")},nextYear:function(){o()||(n.year++,t.checkDate("limit").calendar(null,e),t.done(null,"change"))}}},D.prototype.changeEvent=function(){var e=this;e.config;lay(e.elem).on("click",function(e){lay.stope(e)}).on("mousedown",function(e){lay.stope(e)}),lay.each(e.elemHeader,function(t,a){lay(a[0]).on("click",function(a){e.change(t).prevYear()}),lay(a[1]).on("click",function(a){e.change(t).prevMonth()}),lay(a[2]).find("span").on("click",function(a){var n=lay(this),i=n.attr("lay-ym"),l=n.attr("lay-type");i&&(i=i.split("-"),e.listYM[t]=[0|i[0],0|i[1]],e.list(l,t),lay(e.footer).find("."+v).addClass(d))}),lay(a[3]).on("click",function(a){e.change(t).nextMonth()}),lay(a[4]).on("click",function(a){e.change(t).nextYear()})}),lay.each(e.table,function(t,a){var n=lay(a).find("td");n.on("click",function(){e.choose(lay(this),t)})}),lay(e.footer).find("span").on("click",function(){var t=lay(this).attr("lay-type");e.tool(this,t)})},D.prototype.isInput=function(e){return/input|textarea/.test(e.tagName.toLocaleLowerCase())},D.prototype.events=function(){var e=this,t=e.config,a=function(a,n){a.on(t.trigger,function(){n&&(e.bindElem=this),e.render()})};t.elem[0]&&!t.elem[0].eventHandler&&(a(t.elem,"bind"),a(t.eventElem),t.elem[0].eventHandler=!0)},r.that={},r.getThis=function(e){var t=r.that[e];return!t&&a&&layui.hint().error(e?o+" instance with ID '"+e+"' not found":"ID argument required"),t},n.run=function(a){a(t).on("mousedown",function(e){if(l.thisId){var t=r.getThis(l.thisId);if(t){var n=t.config;e.target!==n.elem[0]&&e.target!==n.eventElem[0]&&e.target!==a(n.closeStop)[0]&&t.remove()}}}).on("keydown",function(e){if(l.thisId){var t=r.getThis(l.thisId);t&&13===e.keyCode&&a("#"+t.elemID)[0]&&t.elemID===D.thisElemDate&&(e.preventDefault(),a(t.footer).find(p)[0].click())}}),a(e).on("resize",function(){if(l.thisId){var e=r.getThis(l.thisId);if(e)return!(!e.elem||!a(s)[0])&&void e.position()}})},l.render=function(e){var t=new D(e);return r.call(t)},l.parse=function(e,t,a){return e=e||{},"string"==typeof t&&(t=r.formatArr(t)),t=(t||[]).concat(),lay.each(t,function(n,i){/yyyy|y/.test(i)?t[n]=lay.digit(e.year,i.length):/MM|M/.test(i)?t[n]=lay.digit(e.month+(a||0),i.length):/dd|d/.test(i)?t[n]=lay.digit(e.date,i.length):/HH|H/.test(i)?t[n]=lay.digit(e.hours,i.length):/mm|m/.test(i)?t[n]=lay.digit(e.minutes,i.length):/ss|s/.test(i)&&(t[n]=lay.digit(e.seconds,i.length))}),t.join("")},l.getEndDate=function(e,t){var a=new Date;return a.setFullYear(t||a.getFullYear(),e||a.getMonth()+1,1),new Date(a.getTime()-864e5).getDate()},a?(l.ready(),layui.define("lay",function(e){l.path=layui.cache.dir,n.run(lay),e(o,l)})):"function"==typeof define&&define.amd?define(function(){return n.run(lay),l}):function(){l.ready(),n.run(e.lay),e.laydate=l}()}(window,window.document);!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
    a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",l.childNodes[0].style.borderCollapse="separate",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
    a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
    ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var t=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}(),i=e.LAYUI_GLOBAL||{};return i.layer_dir||t.substring(0,t.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c="creating",u=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function d(t){var n=100,a=document.getElementById(f);return++u>1e4/n?e.console&&console.error(l+".css: Invalid"):void(1989===parseInt(o.getStyle(a,"width"))?(t===c&&a.removeAttribute("lay-status"),a.getAttribute("lay-status")===c?setTimeout(d,n):i()):(a.setAttribute("lay-status",c),setTimeout(function(){d(c)},n)))}()}}},r={v:"3.5.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:260},n))}},s=function(e){var t=this,a=function(){t.creat()};t.index=++r.index,t.config.maxWidth=i(n).width()-30,t.config=i.extend({},t.config,o.config,e),document.body?a():setTimeout(function(){a()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],l.SHADE="layui-layer-shade",l.MOVE="layui-layer-move",s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,minStack:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
    '+(f?r.title[0]:r.title)+"
    ":"";return r.zIndex=s,t([r.shade?'
    ':"",'
    '+(e&&2!=r.type?"":u)+'
    '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
    '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
    '+e+"
    "}():"")+(r.resize?'':"")+"
    "],u,i('
    ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i("#"+l.MOVE)[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),e.shadeo=i("#"+l.SHADE+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),e.shadeo.css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():function(){e.offset(),parseInt(o.getStyle(document.getElementById(l.MOVE),"z-index"))||function(){e.layero.css("visibility","hidden"),r.ready(function(){e.offset(),e.layero.css("visibility","visible")})}()}(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index,t)}):a.success(n,t.index,t)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&t.shadeo.on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n,t.index);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n,t.index)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n,t.index)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){t=t||{};var a=i("#"+l[0]+e),s=i("#"+l.SHADE+e),f=a.find(l[1]).outerHeight()||0,c=a.attr("minLeft")||181*o.minIndex+"px",u=a.css("position"),d={width:180,height:f,position:"fixed",overflow:"hidden"};o.record(a),o.minLeft[0]&&(c=o.minLeft[0],o.minLeft.shift()),t.minStack&&(d.left=c,d.top=n.height()-f,a.attr("minLeft")||o.minIndex++,a.attr("minLeft",c)),a.attr("position",u),r.style(e,d,!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),s.hide()},r.restore=function(e){var t=i("#"+l[0]+e),n=i("#"+l.SHADE+e),a=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(a[0]),height:parseFloat(a[1]),top:parseFloat(a[2]),left:parseFloat(a[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e),n.show()},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e,t){var n=i("#"+l[0]+e),a=n.attr("type"),s="layer-anim-close";if(n[0]){var f="layui-layer-wrap",c=function(){if(a===o.type[1]&&"object"===n.attr("conType")){n.children(":not(."+l[5]+")").remove();for(var r=n.find("."+f),s=0;s<2;s++)r.unwrap();r.css("display",r.data("display")).removeClass(f)}else{if(a===o.type[2])try{var c=i("#"+l[4]+e)[0];c.contentWindow.document.write(""),c.contentWindow.close(),n.find("."+l[5])[0].removeChild(c)}catch(u){}n[0].innerHTML="",n.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e],"function"==typeof t&&t()};n.data("isOutAnim")&&n.addClass("layer-anim "+s),i("#layui-layer-moves, #"+l.SHADE+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),n.attr("minLeft")&&(o.minIndex--,o.minLeft.push(n.attr("minLeft"))),r.ie&&r.ie<10||!n.data("isOutAnim")?c():setTimeout(function(){c()},200)}},r.closeAll=function(e,t){"function"==typeof e&&(t=e,e=null);var n=i("."+l[0]);i.each(n,function(a){var o=i(this),s=e?o.attr("type")===e:1;s&&r.close(o.attr("times"),a===n.length-1?t:null),s=null}),0===n.length&&"function"==typeof t&&t()};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
      '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
    • '+(t[0].content||"no content")+"
    • ";i'+(t[i].content||"no content")+"";return a}()+"
    ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=!("string"==typeof t.photos||t.photos instanceof i),f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){h();var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0)}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev(!0)}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext(!0)}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),a&&(t.anim=-1),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||'+function(){return u.length>1?'
    '+(u[d].alt||"")+""+s.imgIndex+" / "+u.length+"
    ":""}()+"
    ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
    是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){r.ready(),o.run(e.jQuery)}()}(window);layui.define("jquery",function(e){"use strict";var t=layui.$,i=layui.hint(),n={fixbar:function(e){var i,n,r="layui-fixbar",a="layui-fixbar-top",o=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
      ',e.bar1?'
    • '+c[0]+"
    • ":"",e.bar2?'
    • '+c[1]+"
    • ":"",'
    • '+c[2]+"
    • ","
    "].join("")),u=g.find("."+a),s=function(){var t=o.scrollTop();t>=e.showHeight?i||(u.show(),i=1):i&&(u.hide(),i=0)};t("."+r)[0]||("object"==typeof e.css&&g.css(e.css),l.append(g),s(),g.find("li").on("click",function(){var i=t(this),n=i.attr("lay-type");"top"===n&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,n)}),o.on("scroll",function(){clearTimeout(n),n=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var n=this,r="function"==typeof t,a=new Date(e).getTime(),o=new Date(!t||r?(new Date).getTime():t).getTime(),l=a-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];r&&(i=t);var g=setTimeout(function(){n.countdown(e,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,g),l<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,n=[[],[]],r=(new Date).getTime()-new Date(e).getTime();return r>26784e5?(r=new Date(e),n[0][0]=i.digit(r.getFullYear(),4),n[0][1]=i.digit(r.getMonth()+1),n[0][2]=i.digit(r.getDate()),t||(n[1][0]=i.digit(r.getHours()),n[1][1]=i.digit(r.getMinutes()),n[1][2]=i.digit(r.getSeconds())),n[0].join("-")+" "+n[1].join(":")):r>=864e5?(r/1e3/60/60/24|0)+"\u5929\u524d":r>=36e5?(r/1e3/60/60|0)+"\u5c0f\u65f6\u524d":r>=18e4?(r/1e3/60|0)+"\u5206\u949f\u524d":r<0?"\u672a\u6765":"\u521a\u521a"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var n=e.length;n/g,">").replace(/'/g,"'").replace(/"/g,""")},unescape:function(e){return String(e||"").replace(/\&/g,"&").replace(/\</g,"<").replace(/\>/g,">").replace(/\'/,"'").replace(/\"/,'"')},toVisibleArea:function(e){if(e=t.extend({margin:160,duration:200,type:"y"},e),e.scrollElem[0]&&e.thisElem[0]){var i=e.scrollElem,n=e.thisElem,r="y"===e.type,a=r?"scrollTop":"scrollLeft",o=r?"top":"left",l=i[a](),c=i[r?"height":"width"](),g=i.offset()[o],u=n.offset()[o]-g,s={};(u>c-e.margin||u0&&t.unshift(""),t.join(" ")}()+">"+(a.title||"unnaming")+"";return s[0]?s.before(r):n.append(r),o.append('
    '+(a.content||"")+"
    "),b.hideTabMore(!0),b.tabAuto(),this},s.prototype.tabDelete=function(t,a){var e=".layui-tab-title",l=i(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+a+'"]');return b.tabDelete(null,s),this},s.prototype.tabChange=function(t,a){var e=".layui-tab-title",l=i(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+a+'"]');return b.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},m.on("click",t.headerElem,function(a){var e=i(this).index();b.tabClick.call(this,a,e,null,t)})},s.prototype.progress=function(t,a){var e="layui-progress",l=i("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",a).attr("lay-percent",a),s.text(a),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",y="layui-nav-child",d="layui-nav-child-c",f="layui-nav-more",h="layui-icon-down",p="layui-anim layui-anim-upbit",b={tabClick:function(t,a,s,o){o=o||{};var r=s||i(this),a=a||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?i(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),y=r.find("a"),d="javascript:;"!==y.attr("href")&&"_blank"===y.attr("target"),f="string"==typeof r.attr("lay-unselect"),h=c.attr("lay-filter");d||f||(r.addClass(l).siblings().removeClass(l),u.eq(a).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+h+")",{elem:c,index:a})},tabDelete:function(t,a){var n=a||i(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?b.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&b.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){b.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;i(".layui-tab").each(function(){var s=i(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=i('');if(n===window&&8!=a.ie&&b.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=i(this);if(!t.find("."+l)[0]){var a=i('');a.on("click",b.tabDelete),t.append(a)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(i){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"\u6536\u7f29"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var a=i(".layui-tab-title");t!==!0&&"tabmore"===i(t.target).attr("lay-stope")||(a.removeClass("layui-tab-more"),a.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=i(this),a=t.parents(o),n=a.attr("lay-filter"),s=t.parent(),c=t.siblings("."+y),d="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||d||c[0]||(a.find("."+l).removeClass(l),s.addClass(l)),a.hasClass(u)&&(c.removeClass(p),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===a.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=i(this),a=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),a.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){b.tabAuto.call({})},nav:function(){var t=200,e={},s={},v={},m="layui-nav-title",C=function(l,o,r){var c=i(this),h=c.find("."+y);if(o.hasClass(u)){if(!h[0]){var b=c.children("."+m);l.css({top:c.offset().top-o.offset().top,height:(b[0]?b:c).outerHeight(),opacity:1})}}else h.addClass(p),h.hasClass(d)&&h.css({left:-(h.outerWidth()-c.width())/2}),h[0]?l.css({left:l.position().left+l.width()/2,width:0,opacity:0}):l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:h[0]?0:c.width(),opacity:h[0]?0:1})},a.ie&&a.ie<10?0:t),clearTimeout(v[r]),"block"===h.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){h.addClass(n),c.find("."+f).addClass(f+"d")},300)};i(o+l).each(function(a){var l=i(this),o=i(''),d=l.find("."+r);l.find("."+c)[0]||(l.append(o),(l.hasClass(u)?d.find("dd,>."+m):d).on("mouseenter",function(){C.call(this,o,l,a)}).on("mouseleave",function(){l.hasClass(u)?o.css({height:0,opacity:0}):(clearTimeout(s[a]),s[a]=setTimeout(function(){l.find("."+y).removeClass(n),l.find("."+f).removeClass(f+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[a]),v[a]=setTimeout(function(){l.hasClass(u)||o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),d.find("a").each(function(){var t=i(this),a=(t.parent(),t.siblings("."+y));a[0]&&!t.children("."+f)[0]&&t.append(''),t.off("click",b.clickThis).on("click",b.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";i(t+l).each(function(){var t=i(this),a="lay-separator",e=t.attr(a)||"/",l=t.find("a");l.next("span["+a+"]")[0]||(l.each(function(t){t!==l.length-1&&i(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";i("."+t+l).each(function(){var a=i(this),e=a.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),a.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";i("."+t+l).each(function(){var t=i(this).find(".layui-colla-item");t.each(function(){var t=i(this),a=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");a.find(".layui-colla-icon").remove(),a.append(''+(l?"":"")+""),a.off("click",b.collapse).on("click",b.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,i){i()})},s.prototype.render=s.prototype.init;var v=new s,m=i(document);i(function(){v.render()});var C=".layui-tab-title li";m.on("click",C,b.tabClick),m.on("click",b.hideTabMore),i(window).on("resize",b.tabAuto),t(e,v)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,n=layui.hint(),o=layui.device(),a={config:{},set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,r,e,t)}},l=function(){var e=this;return{upload:function(t){e.upload.call(e,t)},reload:function(t){e.reload.call(e,t)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var i=this;i.config=t.extend({},i.config,a.config,e),i.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",acceptMime:"",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var i=this,e=i.config;e.elem=t(e.elem),e.bindAction=t(e.bindAction),i.file(),i.events()},p.prototype.file=function(){var e=this,i=e.config,n=e.elemFile=t(['"].join("")),a=i.elem.next();(a.hasClass(u)||a.hasClass(c))&&a.remove(),o.ie&&o.ie<10&&i.elem.wrap('
    '),e.isFile()?(e.elemFile=i.elem,i.field=i.elem[0].name):i.elem.after(n),o.ie&&o.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,i=e.config,n=t(''),o=t(['
    ',"
    "].join(""));t("#"+f)[0]||t("body").append(n),i.elem.next().hasClass(c)||(e.elemFile.wrap(o),i.elem.next("."+c).append(function(){var e=[];return layui.each(i.data,function(t,i){i="function"==typeof i?i():i,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return i.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var t=this;window.FileReader&&layui.each(t.chooseFiles,function(t,i){var n=new FileReader;n.readAsDataURL(i),n.onload=function(){e&&e(t,i,this.result)}})},p.prototype.upload=function(e,i){var n,a=this,l=a.config,r=a.elemFile[0],u=function(){var i=0,n=0,o=e||a.files||a.chooseFiles||r.files,u=function(){l.multiple&&i+n===a.fileLength&&"function"==typeof l.allDone&&l.allDone({total:a.fileLength,successful:i,aborted:n})};layui.each(o,function(e,o){var r=new FormData;r.append(l.field,o),layui.each(l.data,function(e,t){t="function"==typeof t?t():t,r.append(e,t)});var c={url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(t){i++,d(e,t),u()},error:function(){n++,a.msg("\u8bf7\u6c42\u4e0a\u4f20\u63a5\u53e3\u51fa\u73b0\u5f02\u5e38"),m(e),u()}};"function"==typeof l.progress&&(c.xhr=function(){var i=t.ajaxSettings.xhr();return i.upload.addEventListener("progress",function(t){if(t.lengthComputable){var i=Math.floor(t.loaded/t.total*100);l.progress(i,l.item?l.item[0]:l.elem[0],t,e)}}),i}),t.ajax(c)})},c=function(){var e=t("#"+f);a.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var t,i=e.contents().find("body");try{t=i.text()}catch(n){a.msg("\u83b7\u53d6\u4e0a\u4f20\u540e\u7684\u54cd\u5e94\u4fe1\u606f\u51fa\u73b0\u5f02\u5e38"),clearInterval(p.timer),m()}t&&(clearInterval(p.timer),i.html(""),d(0,t))},30)},d=function(e,t){if(a.elemFile.next("."+s).remove(),r.value="","object"!=typeof t)try{t=JSON.parse(t)}catch(i){return t={},a.msg("\u8bf7\u5bf9\u4e0a\u4f20\u63a5\u53e3\u8fd4\u56de\u6709\u6548JSON")}"function"==typeof l.done&&l.done(t,e||0,function(e){a.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){a.upload(e)})},h=l.exts,v=function(){var t=[];return layui.each(e||a.chooseFiles,function(e,i){t.push(i.name)}),t}(),g={preview:function(e){a.preview(e)},upload:function(e,t){var i={};i[e]=t,a.upload(i)},pushFile:function(){return a.files=a.files||{},layui.each(a.chooseFiles,function(e,t){a.files[e]=t}),a.files},resetFile:function(e,t,i){var n=new File([t],i);a.files=a.files||{},a.files[e]=n}},y=function(){if(!(("choose"===i||l.auto)&&(l.choose&&l.choose(g),"choose"===i)||l.before&&l.before(g)===!1))return o.ie?o.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return a.msg("\u9009\u62e9\u7684\u6587\u4ef6\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return a.msg("\u9009\u62e9\u7684\u89c6\u9891\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return a.msg("\u9009\u62e9\u7684\u97f3\u9891\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),r.value="";break;default:if(layui.each(v,function(e,t){RegExp("\\w\\.("+(h||"ico|webp|svg|jpg|png|gif|bmp|jpeg$")+")","i").test(escape(t))||(n=!0)}),n)return a.msg("\u9009\u62e9\u7684\u56fe\u7247\u4e2d\u5305\u542b\u4e0d\u652f\u6301\u7684\u683c\u5f0f"),r.value=""}if(a.fileLength=function(){var t=0,i=e||a.files||a.chooseFiles||r.files;return layui.each(i,function(){t++}),t}(),l.number&&a.fileLength>l.number)return a.msg("\u540c\u65f6\u6700\u591a\u53ea\u80fd\u4e0a\u4f20\u7684\u6570\u91cf\u4e3a\uff1a"+l.number);if(l.size>0&&!(o.ie&&o.ie<10)){var F;if(layui.each(a.chooseFiles,function(e,t){if(t.size>1024*l.size){var i=l.size/1024;i=i>=1?i.toFixed(2)+"MB":l.size+"KB",r.value="",F=i}}),F)return a.msg("\u6587\u4ef6\u4e0d\u80fd\u8d85\u8fc7"+F)}y()}},p.prototype.reload=function(e){e=e||{},delete e.elem,delete e.bindAction;var i=this,e=i.config=t.extend({},i.config,a.config,e),n=e.elem.next();n.attr({name:e.name,accept:e.acceptMime,multiple:e.multiple})},p.prototype.events=function(){var e=this,i=e.config,a=function(t){e.chooseFiles={},layui.each(t,function(t,i){var n=(new Date).getTime();e.chooseFiles[n+"-"+t]=i})},l=function(t,n){var o=e.elemFile,a=(i.item?i.item:i.elem,t.length>1?t.length+"\u4e2a\u6587\u4ef6":(t[0]||{}).name||o[0].value.match(/[^\/\\]+\..+/g)||[]||"");o.next().hasClass(s)&&o.next().remove(),e.upload(null,"choose"),e.isFile()||i.choose||o.after(''+a+"")};i.elem.off("upload.start").on("upload.start",function(){var o=t(this),a=o.attr("lay-data");if(a)try{a=new Function("return "+a)(),e.config=t.extend({},i,a)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+a)}e.config.item=o,e.elemFile[0].click()}),o.ie&&o.ie<10||i.elem.off("upload.over").on("upload.over",function(){var e=t(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=t(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,o){var r=t(this),u=o.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),a(u),i.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var t=this.files||[];a(t),i.auto?e.upload():l(t)}),i.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),i.elem.data("haveEvents")||(e.elemFile.on("change",function(){t(this).trigger("upload.change")}),i.elem.on("click",function(){e.isFile()||t(this).trigger("upload.start")}),i.drag&&i.elem.on("dragover",function(e){e.preventDefault(),t(this).trigger("upload.over")}).on("dragleave",function(e){t(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),t(this).trigger("upload.drop",e)}),i.bindAction.on("click",function(){t(this).trigger("upload.action")}),i.elem.data("haveEvents",!0))},a.render=function(e){var t=new p(e);return l.call(t)},e(r,a)});layui.define(["jquery","laytpl","lay"],function(e){"use strict";var i=layui.$,n=layui.laytpl,t=layui.hint(),a=layui.device(),l=a.mobile?"click":"mousedown",r="dropdown",o="layui_"+r+"_index",u={config:{},index:layui[r]?layui[r].index+1e4:0,set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,r,e,i)}},d=function(){var e=this,i=e.config,n=i.id;return d.that[n]=e,{config:i,reload:function(i){e.reload.call(e,i)}}},s="layui-dropdown",m="layui-menu-item-up",c="layui-menu-item-down",p="layui-menu-body-title",y="layui-menu-item-group",f="layui-menu-item-parent",v="layui-menu-item-divider",g="layui-menu-item-checked",h="layui-menu-item-checked2",w="layui-menu-body-panel",C="layui-menu-body-panel-left",V="."+y+">."+p,k=function(e){var n=this;n.index=++u.index,n.config=i.extend({},n.config,u.config,e),n.init()};k.prototype.config={trigger:"click",content:"",className:"",style:"",show:!1,isAllowSpread:!0,isSpreadItem:!0,data:[],delay:300},k.prototype.reload=function(e){var n=this;n.config=i.extend({},n.config,e),n.init(!0)},k.prototype.init=function(e){var n=this,t=n.config,a=t.elem=i(t.elem);if(a.length>1)return layui.each(a,function(){u.render(i.extend({},t,{elem:this}))}),n;if(!e&&a[0]&&a.data(o)){var l=d.getThis(a.data(o));if(!l)return;return l.reload(t)}t.id="id"in t?t.id:n.index,t.show&&n.render(e),n.events()},k.prototype.render=function(e){var t=this,a=t.config,r=i("body"),s=function(){var e=i('
      ');return a.data.length>0?m(e,a.data):e.html('
    • no menu
    • '),e},m=function(e,t){return layui.each(t,function(t,l){var r=l.child&&l.child.length>0,o="isSpreadItem"in l?l.isSpreadItem:a.isSpreadItem,u=l.templet?n(l.templet).render(l):a.templet?n(a.templet).render(l):l.title,d=function(){return r&&(l.type=l.type||"parent"),l.type?{group:"group",parent:"parent","-":"-"}[l.type]||"parent":""}();if("-"===d||l.title||l.id||r){var s=i(["",function(){var e="href"in l?''+u+"":u;return r?'
      '+e+function(){return"parent"===d?'':"group"===d&&a.isAllowSpread?'':""}()+"
      ":'
      '+e+"
      "}(),""].join(""));if(s.data("item",l),r){var c=i('
      '),y=i("
        ");"parent"===d?(c.append(m(y,l.child)),s.append(c)):s.append(m(y,l.child))}e.append(s)}}),e},c=['
        ',"
        "].join("");("contextmenu"===a.trigger||lay.isTopElem(a.elem[0]))&&(e=!0),!e&&a.elem.data(o+"_opened")||(t.elemView=i(c),t.elemView.append(a.content||s()),a.className&&t.elemView.addClass(a.className),a.style&&t.elemView.attr("style",a.style),u.thisId=a.id,t.remove(),r.append(t.elemView),a.elem.data(o+"_opened",!0),t.position(),d.prevElem=t.elemView,d.prevElem.data("prevElem",a.elem),t.elemView.find(".layui-menu").on(l,function(e){layui.stope(e)}),t.elemView.find(".layui-menu li").on("click",function(e){var n=i(this),l=n.data("item")||{},r=l.child&&l.child.length>0;r||"-"===l.type||(t.remove(),"function"==typeof a.click&&a.click(l,n))}),t.elemView.find(V).on("click",function(e){var n=i(this),t=n.parent(),l=t.data("item")||{};"group"===l.type&&a.isAllowSpread&&d.spread(t)}),"mouseenter"===a.trigger&&t.elemView.on("mouseenter",function(){clearTimeout(d.timer)}).on("mouseleave",function(){t.delayRemove()}))},k.prototype.position=function(e){var i=this,n=i.config;lay.position(n.elem[0],i.elemView[0],{position:n.position,e:i.e,clickType:"contextmenu"===n.trigger?"right":null,align:n.align||null})},k.prototype.remove=function(){var e=this,i=(e.config,d.prevElem);i&&(i.data("prevElem")&&i.data("prevElem").data(o+"_opened",!1),i.remove())},k.prototype.delayRemove=function(){var e=this,i=e.config;clearTimeout(d.timer),d.timer=setTimeout(function(){e.remove()},i.delay)},k.prototype.events=function(){var e=this,i=e.config;"hover"===i.trigger&&(i.trigger="mouseenter"),e.prevElem&&e.prevElem.off(i.trigger,e.prevElemCallback),e.prevElem=i.elem,e.prevElemCallback=function(n){clearTimeout(d.timer),e.e=n,e.render(),n.preventDefault(),"function"==typeof i.ready&&i.ready(e.elemView,i.elem,e.e.target)},i.elem.on(i.trigger,e.prevElemCallback),"mouseenter"===i.trigger&&i.elem.on("mouseleave",function(){e.delayRemove()})},d.that={},d.getThis=function(e){var i=d.that[e];return i||t.error(e?r+" instance with ID '"+e+"' not found":"ID argument required"),i},d.spread=function(e){var i=e.children("."+p).find(".layui-icon");e.hasClass(m)?(e.removeClass(m).addClass(c),i.removeClass("layui-icon-down").addClass("layui-icon-up")):(e.removeClass(c).addClass(m),i.removeClass("layui-icon-up").addClass("layui-icon-down"))},!function(){var e=i(window),n=i(document);e.on("resize",function(){if(u.thisId){var e=d.getThis(u.thisId);if(e){if(!e.elemView[0]||!i("."+s)[0])return!1;var n=e.config;"contextmenu"===n.trigger?e.remove():e.position()}}}),n.on(l,function(e){if(u.thisId){var i=d.getThis(u.thisId);if(i){var n=i.config;!lay.isTopElem(n.elem[0])&&"contextmenu"!==n.trigger&&(e.target===n.elem[0]||n.elem.find(e.target)[0]||e.target===i.elemView[0]||i.elemView&&i.elemView.find(e.target)[0])||i.remove()}}});var t=".layui-menu:not(.layui-dropdown-menu) li";n.on("click",t,function(e){var n=i(this),t=n.parents(".layui-menu").eq(0),a=n.hasClass(y)||n.hasClass(f),l=t.attr("lay-filter")||t.attr("id"),o=lay.options(this);n.hasClass(v)||a||(t.find("."+g).removeClass(g),t.find("."+h).removeClass(h),n.addClass(g),n.parents("."+f).addClass(h),layui.event.call(this,r,"click("+l+")",o))}),n.on("click",t+V,function(e){var n=i(this),t=n.parents("."+y+":eq(0)"),a=lay.options(t[0]);"isAllowSpread"in a&&!a.isAllowSpread||d.spread(t)});var a=".layui-menu ."+f;n.on("mouseenter",a,function(n){var t=i(this),a=t.find("."+w);if(a[0]){var l=a[0].getBoundingClientRect();l.right>e.width()&&(a.addClass(C),l=a[0].getBoundingClientRect(),l.left<0&&a.removeClass(C)),l.bottom>e.height()&&a.eq(0).css("margin-top",-(l.bottom-e.height()))}}).on("mouseleave",a,function(e){var n=i(this),t=n.children("."+w);t.removeClass(C),t.css("margin-top",0)})}(),u.reload=function(e,i){var n=d.getThis(e);return n?(n.reload(i),d.call(n)):this},u.render=function(e){var i=new k(e);return d.call(i)},e(r,u)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(t,a){return i.value=t,e.slide("set",t,a||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",p="layui-slider-input-btn",m="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),p=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var p=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var m=t.disabled?"#c2c2c2":t.theme,f='
        '+(t.tips?'
        ':"")+'
        '+(t.range?'
        ':"")+"
        ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
        ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
        ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),s.find("."+d).html(l.setTips?l.setTips(u):u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
        f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(m),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(m),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.children("."+p).children("i").each(function(e){i(this).on("click",function(){g=y.children("."+c).children("input").val(),g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define(["jquery","lay"],function(e){"use strict";var i=layui.jquery,r=layui.lay,o=layui.device(),n=o.mobile?"click":"mousedown",l={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var r=this;return r.config=i.extend({},r.config,e),r},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},t=function(){var e=this,i=e.config;return{config:i}},c="colorpicker",a="layui-show",s="layui-colorpicker",f=".layui-colorpicker-main",d="layui-icon-down",u="layui-icon-close",p="layui-colorpicker-trigger-span",g="layui-colorpicker-trigger-i",v="layui-colorpicker-side",h="layui-colorpicker-side-slider",b="layui-colorpicker-basis",k="layui-colorpicker-alpha-bgcolor",y="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",x="layui-colorpicker-main-input",P=function(e){var i={h:0,s:0,b:0},r=Math.min(e.r,e.g,e.b),o=Math.max(e.r,e.g,e.b),n=o-r;return i.b=o,i.s=0!=o?255*n/o:0,0!=i.s?e.r==o?i.h=(e.g-e.b)/n:e.g==o?i.h=2+(e.b-e.r)/n:i.h=4+(e.r-e.g)/n:i.h=-1,o==r&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},C=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var r={r:e>>16,g:(65280&e)>>8,b:255&e};return P(r)},B=function(e){var i={},r=e.h,o=255*e.s/100,n=255*e.b/100;if(0==o)i.r=i.g=i.b=n;else{var l=n,t=(255-o)*n/255,c=(l-t)*(r%60)/60;360==r&&(r=0),r<60?(i.r=l,i.b=t,i.g=t+c):r<120?(i.g=l,i.b=t,i.r=l-c):r<180?(i.g=l,i.r=t,i.b=t+c):r<240?(i.b=l,i.r=t,i.g=l-c):r<300?(i.b=l,i.g=t,i.r=t+c):r<360?(i.r=l,i.g=t,i.b=l-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},w=function(e){var r=B(e),o=[r.r.toString(16),r.g.toString(16),r.b.toString(16)];return i.each(o,function(e,i){1==i.length&&(o[e]="0"+i)}),o.join("")},D=function(e){var i=/[0-9]{1,3}/g,r=e.match(i)||[];return{r:r[0],g:r[1],b:r[2]}},j=i(window),E=i(document),F=function(e){var r=this;r.index=++l.index,r.config=i.extend({},r.config,l.config,e),r.render()};F.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},F.prototype.render=function(){var e=this,r=e.config,o=i(['
        ',"",'3&&(r.alpha&&"rgb"==r.format||(e="#"+w(P(D(r.color))))),"background: "+e):e}()+'">','',"","","
        "].join("")),n=i(r.elem);r.size&&o.addClass("layui-colorpicker-"+r.size),n.addClass("layui-inline").html(e.elemColorBox=o),e.color=e.elemColorBox.find("."+p)[0].style.background,e.events()},F.prototype.renderPicker=function(){var e=this,r=e.config,o=e.elemColorBox[0],n=e.elemPicker=i(['
        ','
        ','
        ','
        ','
        ','
        ',"
        ",'
        ','
        ',"
        ","
        ",'
        ','
        ','
        ',"
        ","
        ",function(){if(r.predefine){var e=['
        '];return layui.each(r.colors,function(i,r){e.push(['
        ','
        ',"
        "].join(""))}),e.push("
        "),e.join("")}return""}(),'
        ','
        ','',"
        ",'
        ','','',"","
        "].join(""));e.elemColorBox.find("."+p)[0];i(f)[0]&&i(f).data("index")==e.index?e.removePicker(F.thisElemInd):(e.removePicker(F.thisElemInd),i("body").append(n)),F.thisElemInd=e.index,F.thisColor=o.style.background,e.position(),e.pickerEvents()},F.prototype.removePicker=function(e){var r=this;r.config;return i("#layui-colorpicker"+(e||r.index)).remove(),r},F.prototype.position=function(){var e=this,i=e.config;return r.position(e.bindElem||e.elemColorBox[0],e.elemPicker[0],{position:i.position,align:"center"}),e},F.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+p)),r=e.elemPicker.find("."+x),o=i[0],n=o.style.backgroundColor;if(n){var l=P(D(n)),t=i.attr("lay-type");if(e.select(l.h,l.s,l.b),"torgb"===t&&r.find("input").val(n),"rgba"===t){var c=D(n);if(3==(n.match(/[0-9]{1,3}/g)||[]).length)r.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+y).css("left",280);else{r.find("input").val(n);var a=280*n.slice(n.lastIndexOf(",")+1,n.length-1);e.elemPicker.find("."+y).css("left",a)}e.elemPicker.find("."+k)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),r.find("input").val(""),e.elemPicker.find("."+k)[0].style.background="",e.elemPicker.find("."+y).css("left",280)},F.prototype.side=function(){var e=this,r=e.config,o=e.elemColorBox.find("."+p),n=o.attr("lay-type"),l=e.elemPicker.find("."+v),t=e.elemPicker.find("."+h),c=e.elemPicker.find("."+b),a=e.elemPicker.find("."+m),s=e.elemPicker.find("."+k),f=e.elemPicker.find("."+y),C=t[0].offsetTop/180*360,w=100-(a[0].offsetTop+3)/180*100,E=(a[0].offsetLeft+3)/260*100,F=Math.round(f[0].offsetLeft/280*100)/100,H=e.elemColorBox.find("."+g),M=e.elemPicker.find(".layui-colorpicker-pre").children("div"),Y=function(i,l,t,c){e.select(i,l,t);var a=B({h:i,s:l,b:t});if(H.addClass(d).removeClass(u),o[0].style.background="rgb("+a.r+", "+a.g+", "+a.b+")","torgb"===n&&e.elemPicker.find("."+x).find("input").val("rgb("+a.r+", "+a.g+", "+a.b+")"),"rgba"===n){var p=0;p=280*c,f.css("left",p),e.elemPicker.find("."+x).find("input").val("rgba("+a.r+", "+a.g+", "+a.b+", "+c+")"),o[0].style.background="rgba("+a.r+", "+a.g+", "+a.b+", "+c+")",s[0].style.background="linear-gradient(to right, rgba("+a.r+", "+a.g+", "+a.b+", 0), rgb("+a.r+", "+a.g+", "+a.b+"))"}r.change&&r.change(e.elemPicker.find("."+x).find("input").val())},I=i(['
        '].join("")),L=function(e){i("#LAY-colorpicker-moving")[0]||i("body").append(I),I.on("mousemove",e),I.on("mouseup",function(){I.remove()}).on("mouseleave",function(){I.remove()})};t.on("mousedown",function(e){var i=this.offsetTop,r=e.clientY,o=function(e){var o=i+(e.clientY-r),n=l[0].offsetHeight;o<0&&(o=0),o>n&&(o=n);var t=o/180*360;C=t,Y(t,E,w,F),e.preventDefault()};L(o),e.preventDefault()}),l.on("click",function(e){var r=e.clientY-i(this).offset().top;r<0&&(r=0),r>this.offsetHeight&&(r=this.offsetHeight);var o=r/180*360;C=o,Y(o,E,w,F),e.preventDefault()}),a.on("mousedown",function(e){var i=this.offsetTop,r=this.offsetLeft,o=e.clientY,n=e.clientX,l=function(e){var l=i+(e.clientY-o),t=r+(e.clientX-n),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;l<-3&&(l=-3),l>a&&(l=a),t<-3&&(t=-3),t>s&&(t=s);var f=(t+3)/260*100,d=100-(l+3)/180*100;w=d,E=f,Y(C,f,d,F),e.preventDefault()};layui.stope(e),L(l),e.preventDefault()}),c.on("mousedown",function(e){var r=e.clientY-i(this).offset().top-3+j.scrollTop(),o=e.clientX-i(this).offset().left-3+j.scrollLeft();r<-3&&(r=-3),r>this.offsetHeight-3&&(r=this.offsetHeight-3),o<-3&&(o=-3),o>this.offsetWidth-3&&(o=this.offsetWidth-3);var n=(o+3)/260*100,l=100-(r+3)/180*100;w=l,E=n,Y(C,n,l,F),layui.stope(e),e.preventDefault(),a.trigger(e,"mousedown")}),f.on("mousedown",function(e){var i=this.offsetLeft,r=e.clientX,o=function(e){var o=i+(e.clientX-r),n=s[0].offsetWidth;o<0&&(o=0),o>n&&(o=n);var l=Math.round(o/280*100)/100;F=l,Y(C,E,w,l),e.preventDefault()};L(o),e.preventDefault()}),s.on("click",function(e){var r=e.clientX-i(this).offset().left;r<0&&(r=0),r>this.offsetWidth&&(r=this.offsetWidth);var o=Math.round(r/280*100)/100;F=o,Y(C,E,w,o),e.preventDefault()}),M.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,r=this.style.backgroundColor,o=P(D(r)),n=r.slice(r.lastIndexOf(",")+1,r.length-1);C=o.h,E=o.s,w=o.b,3==(r.match(/[0-9]{1,3}/g)||[]).length&&(n=1),F=n,e=280*n,Y(o.h,o.s,o.b,n)})})},F.prototype.select=function(e,i,r,o){var n=this,l=(n.config,w({h:e,s:100,b:100})),t=w({h:e,s:i,b:r}),c=e/360*180,a=180-r/100*180-3,s=i/100*260-3;n.elemPicker.find("."+h).css("top",c),n.elemPicker.find("."+b)[0].style.background="#"+l,n.elemPicker.find("."+m).css({top:a,left:s}),"change"!==o&&n.elemPicker.find("."+x).find("input").val("#"+t)},F.prototype.pickerEvents=function(){var e=this,r=e.config,o=e.elemColorBox.find("."+p),n=e.elemPicker.find("."+x+" input"),l={clear:function(i){o[0].style.background="",e.elemColorBox.find("."+g).removeClass(d).addClass(u),e.color="",r.done&&r.done(""),e.removePicker()},confirm:function(i,l){var t=n.val(),c=t,a={};if(t.indexOf(",")>-1){if(a=P(D(t)),e.select(a.h,a.s,a.b),o[0].style.background=c="#"+w(a),(t.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===o.attr("lay-type")){var s=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+y).css("left",s),o[0].style.background=t,c=t}}else a=C(t),o[0].style.background=c="#"+w(a),e.elemColorBox.find("."+g).removeClass(u).addClass(d);return"change"===l?(e.select(a.h,a.s,a.b,l),void(r.change&&r.change(c))):(e.color=t,r.done&&r.done(t),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),r=e.attr("colorpicker-events");l[r]&&l[r].call(this,e)}),n.on("keyup",function(e){var r=i(this);l.confirm.call(this,r,13===e.keyCode?null:"change")})},F.prototype.events=function(){var e=this,r=e.config,o=e.elemColorBox.find("."+p);e.elemColorBox.on("click",function(){e.renderPicker(),i(f)[0]&&(e.val(),e.side())}),r.elem[0]&&!e.elemColorBox[0].eventHandler&&(E.on(n,function(r){if(!i(r.target).hasClass(s)&&!i(r.target).parents("."+s)[0]&&!i(r.target).hasClass(f.replace(/\./g,""))&&!i(r.target).parents(f)[0]&&e.elemPicker){if(e.color){var n=P(D(e.color));e.select(n.h,n.s,n.b)}else e.elemColorBox.find("."+g).removeClass(d).addClass(u);o[0].style.background=e.color||"",e.removePicker()}}),j.on("resize",function(){return!(!e.elemPicker||!i(f)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},l.render=function(e){var i=new F(e);return t.call(i)},e(c,l)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",o="layui-this",s="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"\u5fc5\u586b\u9879\u4e0d\u80fd\u4e3a\u7a7a"],phone:[/^1\d{10}$/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e"],url:[/^(#|(http(s?)):\/\/|\/\/)[^\s]+\.[^\s]+$/,"\u94fe\u63a5\u683c\u5f0f\u4e0d\u6b63\u786e"],number:function(e){if(!e||isNaN(e))return"\u53ea\u80fd\u586b\u5199\u6570\u5b57"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"\u65e5\u671f\u683c\u5f0f\u4e0d\u6b63\u786e"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u8eab\u4efd\u8bc1\u53f7"]},autocomplete:null}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=this,n=t(r+'[lay-filter="'+e+'"]');return n.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value==t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e),a.getValue(e)},u.prototype.getValue=function(e,i){i=i||t(r+'[lay-filter="'+e+'"]').eq(0);var a={},n={},l=i.find("input,select,textarea");return layui.each(l,function(e,i){var l;t(this);if(i.name=(i.name||"").replace(/^\s*|\s*&/,""),i.name){if(/^.*\[\]$/.test(i.name)){var r=i.name.match(/^(.*)\[\]$/g)[0];a[r]=0|a[r],l=i.name.replace(/^(.*)\[\]$/,"$1["+a[r]++ +"]")}/^checkbox|radio$/.test(i.type)&&!i.checked||(n[l||i.name]=i.value)}}),n},u.prototype.render=function(e,i){var n=this,u=n.config,d=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),f={input:function(){var e=d.find("input,textarea");u.autocomplete&&e.attr("autocomplete",u.autocomplete)},select:function(){var e,i="\u8bf7\u9009\u62e9",a="layui-form-select",n="layui-select-title",r="layui-select-none",u="",f=d.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&u&&e.val(u)),e=null},y=function(i,d,f){var y,p=t(this),m=i.find("."+n),g=m.find("input"),k=i.find("dl"),x=k.children("dd"),b=this.selectedIndex;if(!d){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=k.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),x.removeClass(s),y=null,x.eq(b).addClass(o).siblings().removeClass(o),e+t>h.height()&&e>=t&&i.addClass(a+"up"),T()},w=function(e){i.removeClass(a+"ed "+a+"up"),g.blur(),y=null,e||$(g.val(),function(e){var i=p[0].selectedIndex;e&&(u=t(p[0].options[i]).html(),0===i&&u===g.attr("placeholder")&&(u=""),g.val(u||""))})},T=function(){var e=k.children("dd."+o);if(e[0]){var t=e.position().top,i=k.height(),a=e.height();t>i&&k.scrollTop(t+k.scrollTop()-i+a-5),t<0&&k.scrollTop(t+k.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),k.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){g.focus()}),g.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=k.children("dd."+o);if(k.children("dd."+s)[0]&&"next"===t){var i=k.children("dd:not(."+s+",."+c+")"),n=i.eq(0).index();if(n>=0&&n\u65e0\u5339\u914d\u9879

        '):k.find("."+r).remove()},"keyup"),""===t&&k.find("."+r).remove(),void T())};f&&g.on("keyup",q).on("blur",function(i){var a=p[0].selectedIndex;e=g,u=t(p[0].options[a]).html(),0===a&&u===g.attr("placeholder")&&(u=""),setTimeout(function(){$(g.val(),function(e){u||g.val("")},"blur")},200)}),x.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?g.val(""):(g.val(e.text()),e.addClass(o)),e.siblings().removeClass(o),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),s=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
        ','
        ','','
        ','
        ',function(e){var a=[];return layui.each(e,function(e,n){0!==e||n.value?"optgroup"===n.tagName.toLowerCase()?a.push("
        "+n.label+"
        "):a.push('
        '+t.trim(n.innerHTML)+"
        "):a.push('
        '+t.trim(n.innerHTML||i)+"
        ")}),0===a.length&&a.push('
        \u6ca1\u6709\u9009\u9879
        '),a.join("")}(r.find("*"))+"
        ","
        "].join(""));s[0]&&s.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=d.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),o=(l.attr("lay-text")||"").split("|"),s=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
        ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?o[0]:o[1])||"")+""};return t[r]||t.checkbox}(),"
        "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=d.find("input[type=radio]"),n=function(a){var n=t(this),o="layui-anim-scaleSpring";a.on("click",function(){var s=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+s.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(o).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(o).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),o=r.next("."+e),s=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();o[0]&&o.remove();var u=t(['
        ',''+i[l.checked?0:1]+"","
        "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html()),e}()+"
        ","
        "].join(""));r.after(u),n.call(this,u)})}};return e?f[e]?f[e]():a.error('\u4e0d\u652f\u6301\u7684 "'+e+'" \u8868\u5355\u6e32\u67d3'):layui.each(f,function(e,t){t()}),n};var d=function(){var e=null,a=f.config.verify,o="layui-form-danger",s={},c=t(this),u=c.parents(r).eq(0),d=u.find("*[lay-verify]"),h=c.parents("form")[0],y=c.attr("lay-filter");return layui.each(d,function(l,r){var s=t(this),c=s.attr("lay-verify").split("|"),u=s.attr("lay-verType"),d=s.val();if(s.removeClass(o),layui.each(c,function(t,l){var c,f="",h="function"==typeof a[l];if(a[l]){var c=h?f=a[l](d,r):!a[l][0].test(d),y="select"===r.tagName.toLowerCase()||/^checkbox|radio$/.test(r.type);if(f=f||a[l][1],"required"===l&&(f=s.attr("lay-reqText")||f),c)return"tips"===u?i.tips(f,function(){return"string"!=typeof s.attr("lay-ignore")&&y?s.next():s}(),{tips:1}):"alert"===u?i.alert(f,{title:"\u63d0\u793a",shadeClose:!0}):/\bstring|number\b/.test(typeof f)&&i.msg(f,{icon:5,shift:6}),n.mobile?v.scrollTop(function(){try{return(y?s.next():s).offset().top-15}catch(e){return 0}}()):setTimeout(function(){(y?s.next().find("input"):r).focus()},7),s.addClass(o),e=!0}}),e)return e}),!e&&(s=f.getValue(null,u),layui.event.call(this,l,"submit("+y+")",{elem:this,form:h,field:s}))},f=new u,v=t(document),h=t(window);t(function(){f.render()}),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("form",function(e){"use strict";var i=layui.$,a=layui.form,n=layui.layer,t="tree",r={config:{},index:layui[t]?layui[t].index+1e4:0,set:function(e){var a=this;return a.config=i.extend({},a.config,e),a},on:function(e,i){return layui.onevent.call(this,t,e,i)}},l=function(){var e=this,i=e.config,a=i.id||e.index;return l.that[a]=e,l.config[a]=i,{config:i,reload:function(i){e.reload.call(e,i)},getChecked:function(){return e.getChecked.call(e)},setChecked:function(i){return e.setChecked.call(e,i)}}},c="layui-hide",d="layui-disabled",s="layui-tree-set",o="layui-tree-iconClick",h="layui-icon-addition",u="layui-icon-subtraction",p="layui-tree-entry",f="layui-tree-main",y="layui-tree-txt",v="layui-tree-pack",C="layui-tree-spread",k="layui-tree-setLineShort",m="layui-tree-showLine",x="layui-tree-lineExtend",b=function(e){var a=this;a.index=++r.index,a.config=i.extend({},a.config,r.config,e),a.render()};b.prototype.config={data:[],showCheckbox:!1,showLine:!0,accordion:!1,onlyIconControl:!1,isJump:!1,edit:!1,text:{defaultNodeName:"\u672a\u547d\u540d",none:"\u65e0\u6570\u636e"}},b.prototype.reload=function(e){var a=this;layui.each(e,function(e,i){"array"===layui._typeof(i)&&delete a.config[e]}),a.config=i.extend(!0,{},a.config,e),a.render()},b.prototype.render=function(){var e=this,a=e.config;e.checkids=[];var n=i('
        ');e.tree(n);var t=a.elem=i(a.elem);if(t[0]){if(e.key=a.id||e.index,e.elem=n,e.elemNone=i('
        '+a.text.none+"
        "),t.html(e.elem),0==e.elem.find(".layui-tree-set").length)return e.elem.append(e.elemNone);a.showCheckbox&&e.renderForm("checkbox"),e.elem.find(".layui-tree-set").each(function(){var e=i(this);e.parent(".layui-tree-pack")[0]||e.addClass("layui-tree-setHide"),!e.next()[0]&&e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend")&&e.addClass(k),e.next()[0]||e.parents(".layui-tree-set").eq(0).next()[0]||e.addClass(k)}),e.events()}},b.prototype.renderForm=function(e){a.render(e,"LAY-tree-"+this.index)},b.prototype.tree=function(e,a){var n=this,t=n.config,r=a||t.data;layui.each(r,function(a,r){var l=r.children&&r.children.length>0,o=i('
        "),h=i(['
        ','
        ','
        ',function(){return t.showLine?l?'':'':''}(),function(){return t.showCheckbox?'':""}(),function(){return t.isJump&&r.href?''+(r.title||r.label||t.text.defaultNodeName)+"":''+(r.title||r.label||t.text.defaultNodeName)+""}(),"
        ",function(){if(!t.edit)return"";var e={add:'',update:'',del:''},i=['
        '];return t.edit===!0&&(t.edit=["update","del"]),"object"==typeof t.edit?(layui.each(t.edit,function(a,n){i.push(e[n]||"")}),i.join("")+"
        "):void 0}(),"
        "].join(""));l&&(h.append(o),n.tree(o,r.children)),e.append(h),h.prev("."+s)[0]&&h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"),l||h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"),n.spread(h,r),t.showCheckbox&&(r.checked&&n.checkids.push(r.id),n.checkClick(h,r)),t.edit&&n.operate(h,r)})},b.prototype.spread=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f),c=r.find("."+o),k=r.find("."+y),m=t.onlyIconControl?c:l,x="";m.on("click",function(i){var a=e.children("."+v),n=m.children(".layui-icon")[0]?m.children(".layui-icon"):m.find(".layui-tree-icon").children(".layui-icon");if(a[0]){if(e.hasClass(C))e.removeClass(C),a.slideUp(200),n.removeClass(u).addClass(h);else if(e.addClass(C),a.slideDown(200),n.addClass(u).removeClass(h),t.accordion){var r=e.siblings("."+s);r.removeClass(C),r.children("."+v).slideUp(200),r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)}}else x="normal"}),k.on("click",function(){var n=i(this);n.hasClass(d)||(x=e.hasClass(C)?t.onlyIconControl?"open":"close":t.onlyIconControl?"close":"open",t.click&&t.click({elem:e,state:x,data:a}))})},b.prototype.setCheckbox=function(e,i,a){var n=this,t=(n.config,a.prop("checked"));if(!a.prop("disabled")){if("object"==typeof i.children||e.find("."+v)[0]){var r=e.find("."+v).find('input[same="layuiTreeCheck"]');r.each(function(){this.disabled||(this.checked=t)})}var l=function(e){if(e.parents("."+s)[0]){var i,a=e.parent("."+v),n=a.parent(),r=a.prev().find('input[same="layuiTreeCheck"]');t?r.prop("checked",t):(a.find('input[same="layuiTreeCheck"]').each(function(){this.checked&&(i=!0)}),i||r.prop("checked",!1)),l(n)}};l(e),n.renderForm("checkbox")}},b.prototype.checkClick=function(e,a){var n=this,t=n.config,r=e.children("."+p),l=r.children("."+f);l.on("click",'input[same="layuiTreeCheck"]+',function(r){layui.stope(r);var l=i(this).prev(),c=l.prop("checked");l.prop("disabled")||(n.setCheckbox(e,a,l),t.oncheck&&t.oncheck({elem:e,checked:c,data:a}))})},b.prototype.operate=function(e,a){var t=this,r=t.config,l=e.children("."+p),d=l.children("."+f);l.children(".layui-tree-btnGroup").on("click",".layui-icon",function(l){layui.stope(l);var f=i(this).data("type"),b=e.children("."+v),g={data:a,type:f,elem:e};if("add"==f){b[0]||(r.showLine?(d.find("."+o).addClass("layui-tree-icon"),d.find("."+o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")):d.find(".layui-tree-iconArrow").removeClass(c),e.append('
        '));var w=r.operate&&r.operate(g),N={};if(N.title=r.text.defaultNodeName,N.id=w,t.tree(e.children("."+v),[N]),r.showLine)if(b[0])b.hasClass(x)||b.addClass(x),e.find("."+v).each(function(){i(this).children("."+s).last().addClass(k)}),b.children("."+s).last().prev().hasClass(k)?b.children("."+s).last().prev().removeClass(k):b.children("."+s).last().removeClass(k),!e.parent("."+v)[0]&&e.next()[0]&&b.children("."+s).last().removeClass(k);else{var T=e.siblings("."+s),L=1,I=e.parent("."+v);layui.each(T,function(e,a){i(a).children("."+v)[0]||(L=0)}),1==L?(T.children("."+v).addClass(m),T.children("."+v).children("."+s).removeClass(k),e.children("."+v).addClass(m),I.removeClass(x),I.children("."+s).last().children("."+v).children("."+s).last().addClass(k)):e.children("."+v).children("."+s).addClass(k)}if(!r.showCheckbox)return;if(d.find('input[same="layuiTreeCheck"]')[0].checked){var A=e.children("."+v).children("."+s).last();A.find('input[same="layuiTreeCheck"]')[0].checked=!0}t.renderForm("checkbox")}else if("update"==f){var F=d.children("."+y).html();d.children("."+y).html(""),d.append(''),d.children(".layui-tree-editInput").val(F).focus();var j=function(e){var i=e.val().trim();i=i?i:r.text.defaultNodeName,e.remove(),d.children("."+y).html(i),g.data.title=i,r.operate&&r.operate(g)};d.children(".layui-tree-editInput").blur(function(){j(i(this))}),d.children(".layui-tree-editInput").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),j(i(this)))})}else n.confirm('\u786e\u8ba4\u5220\u9664\u8be5\u8282\u70b9 "'+(a.title||"")+'" \u5417\uff1f',function(a){if(r.operate&&r.operate(g),g.status="remove",n.close(a),!e.prev("."+s)[0]&&!e.next("."+s)[0]&&!e.parent("."+v)[0])return e.remove(),void t.elem.append(t.elemNone);if(e.siblings("."+s).children("."+p)[0]){if(r.showCheckbox){var l=function(e){if(e.parents("."+s)[0]){var a=e.siblings("."+s).children("."+p),n=e.parent("."+v).prev(),r=n.find('input[same="layuiTreeCheck"]')[0],c=1,d=0;0==r.checked&&(a.each(function(e,a){var n=i(a).find('input[same="layuiTreeCheck"]')[0];0!=n.checked||n.disabled||(c=0),n.disabled||(d=1)}),1==c&&1==d&&(r.checked=!0,t.renderForm("checkbox"),l(n.parent("."+s))))}};l(e)}if(r.showLine){var d=e.siblings("."+s),h=1,f=e.parent("."+v);layui.each(d,function(e,a){i(a).children("."+v)[0]||(h=0)}),1==h?(b[0]||(f.removeClass(x),d.children("."+v).addClass(m),d.children("."+v).children("."+s).removeClass(k)),e.next()[0]?f.children("."+s).last().children("."+v).children("."+s).last().addClass(k):e.prev().children("."+v).children("."+s).last().addClass(k),e.next()[0]||e.parents("."+s)[1]||e.parents("."+s).eq(0).next()[0]||e.prev("."+s).addClass(k)):!e.next()[0]&&e.hasClass(k)&&e.prev().addClass(k)}}else{var y=e.parent("."+v).prev();if(r.showLine){y.find("."+o).removeClass("layui-tree-icon"),y.find("."+o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");var w=y.parents("."+v).eq(0);w.addClass(x),w.children("."+s).each(function(){i(this).children("."+v).children("."+s).last().addClass(k)})}else y.find(".layui-tree-iconArrow").addClass(c);e.parents("."+s).eq(0).removeClass(C),e.parent("."+v).remove()}e.remove()})})},b.prototype.events=function(){var e=this,a=e.config;e.elem.find(".layui-tree-checkedFirst");e.setChecked(e.checkids),e.elem.find(".layui-tree-search").on("keyup",function(){var n=i(this),t=n.val(),r=n.nextAll(),l=[];r.find("."+y).each(function(){var e=i(this).parents("."+p);if(i(this).html().indexOf(t)!=-1){l.push(i(this).parent());var a=function(e){e.addClass("layui-tree-searchShow"),e.parent("."+v)[0]&&a(e.parent("."+v).parent("."+s))};a(e.parent("."+s))}}),r.find("."+p).each(function(){var e=i(this).parent("."+s);e.hasClass("layui-tree-searchShow")||e.addClass(c)}),0==r.find(".layui-tree-searchShow").length&&e.elem.append(e.elemNone),a.onsearch&&a.onsearch({elem:l})}),e.elem.find(".layui-tree-search").on("keydown",function(){i(this).nextAll().find("."+p).each(function(){var e=i(this).parent("."+s);e.removeClass("layui-tree-searchShow "+c)}),i(".layui-tree-emptyText")[0]&&i(".layui-tree-emptyText").remove()})},b.prototype.getChecked=function(){var e=this,a=e.config,n=[],t=[];e.elem.find(".layui-form-checked").each(function(){n.push(i(this).prev()[0].value)});var r=function(e,a){layui.each(e,function(e,t){layui.each(n,function(e,n){if(t.id==n){var l=i.extend({},t);return delete l.children,a.push(l),t.children&&(l.children=[],r(t.children,l.children)),!0}})})};return r(i.extend({},a.data),t),t},b.prototype.setChecked=function(e){var a=this;a.config;a.elem.find("."+s).each(function(a,n){var t=i(this).data("id"),r=i(n).children("."+p).find('input[same="layuiTreeCheck"]'),l=r.next();if("number"==typeof e){if(t==e)return r[0].checked||l.click(),!1}else"object"==typeof e&&layui.each(e,function(e,i){if(i==t&&!r[0].checked)return l.click(),!0})})},l.that={},l.config={},r.reload=function(e,i){var a=l.that[e];return a.reload(i),l.call(a)},r.getChecked=function(e){var i=l.that[e];return i.getChecked()},r.setChecked=function(e,i){var a=l.that[e];return a.setChecked(i)},r.render=function(e){var i=new b(e);return l.call(i)},e(t,r)});layui.define(["laytpl","form"],function(e){"use strict";var a=layui.$,t=layui.laytpl,i=layui.form,n="transfer",l={config:{},index:layui[n]?layui[n].index+1e4:0,set:function(e){var t=this;return t.config=a.extend({},t.config,e),t},on:function(e,a){return layui.onevent.call(this,n,e,a)}},r=function(){var e=this,a=e.config,t=a.id||e.index;return r.that[t]=e,r.config[t]=a,{config:a,reload:function(a){e.reload.call(e,a)},getData:function(){return e.getData.call(e)}}},c="layui-hide",o="layui-btn-disabled",d="layui-none",s="layui-transfer-box",u="layui-transfer-header",h="layui-transfer-search",f="layui-transfer-active",y="layui-transfer-data",p=function(e){return e=e||{},['
        ','
        ','","
        ","{{# if(d.data.showSearch){ }}",'","{{# } }}",'
          ',"
          "].join("")},v=['
          ',p({index:0,checkAllName:"layTransferLeftCheckAll"}),'
          ','",'","
          ",p({index:1,checkAllName:"layTransferRightCheckAll"}),"
          "].join(""),x=function(e){var t=this;t.index=++l.index,t.config=a.extend({},t.config,l.config,e),t.render()};x.prototype.config={title:["\u5217\u8868\u4e00","\u5217\u8868\u4e8c"],width:200,height:360,data:[],value:[],showSearch:!1,id:"",text:{none:"\u65e0\u6570\u636e",searchNone:"\u65e0\u5339\u914d\u6570\u636e"}},x.prototype.reload=function(e){var t=this;t.config=a.extend({},t.config,e),t.render()},x.prototype.render=function(){var e=this,i=e.config,n=e.elem=a(t(v).render({data:i,index:e.index})),l=i.elem=a(i.elem);l[0]&&(i.data=i.data||[],i.value=i.value||[],e.key=i.id||e.index,l.html(e.elem),e.layBox=e.elem.find("."+s),e.layHeader=e.elem.find("."+u),e.laySearch=e.elem.find("."+h),e.layData=n.find("."+y),e.layBtn=n.find("."+f+" .layui-btn"),e.layBox.css({width:i.width,height:i.height}),e.layData.css({height:function(){return i.height-e.layHeader.outerHeight()-e.laySearch.outerHeight()-2}()}),e.renderData(),e.events())},x.prototype.renderData=function(){var e=this,a=(e.config,[{checkName:"layTransferLeftCheck",views:[]},{checkName:"layTransferRightCheck",views:[]}]);e.parseData(function(e){var t=e.selected?1:0,i=["
        • ",'',"
        • "].join("");a[t].views.push(i),delete e.selected}),e.layData.eq(0).html(a[0].views.join("")),e.layData.eq(1).html(a[1].views.join("")),e.renderCheckBtn()},x.prototype.renderForm=function(e){i.render(e,"LAY-transfer-"+this.index)},x.prototype.renderCheckBtn=function(e){var t=this,i=t.config;e=e||{},t.layBox.each(function(n){var l=a(this),r=l.find("."+y),d=l.find("."+u).find('input[type="checkbox"]'),s=r.find('input[type="checkbox"]'),h=0,f=!1;if(s.each(function(){var e=a(this).data("hide");(this.checked||this.disabled||e)&&h++,this.checked&&!e&&(f=!0)}),d.prop("checked",f&&h===s.length),t.layBtn.eq(n)[f?"removeClass":"addClass"](o),!e.stopNone){var p=r.children("li:not(."+c+")").length;t.noneView(r,p?"":i.text.none)}}),t.renderForm("checkbox")},x.prototype.noneView=function(e,t){var i=a('

          '+(t||"")+"

          ");e.find("."+d)[0]&&e.find("."+d).remove(),t.replace(/\s/g,"")&&e.append(i)},x.prototype.setValue=function(){var e=this,t=e.config,i=[];return e.layBox.eq(1).find("."+y+' input[type="checkbox"]').each(function(){var e=a(this).data("hide");e||i.push(this.value)}),t.value=i,e},x.prototype.parseData=function(e){var t=this,i=t.config,n=[];return layui.each(i.data,function(t,l){l=("function"==typeof i.parseData?i.parseData(l):l)||l,n.push(l=a.extend({},l)),layui.each(i.value,function(e,a){a==l.value&&(l.selected=!0)}),e&&e(l)}),i.data=n,t},x.prototype.getData=function(e){var a=this,t=a.config,i=[];return a.setValue(),layui.each(e||t.value,function(e,a){layui.each(t.data,function(e,t){delete t.selected,a==t.value&&i.push(t)})}),i},x.prototype.events=function(){var e=this,t=e.config;e.elem.on("click",'input[lay-filter="layTransferCheckbox"]+',function(){var t=a(this).prev(),i=t[0].checked,n=t.parents("."+s).eq(0).find("."+y);t[0].disabled||("all"===t.attr("lay-type")&&n.find('input[type="checkbox"]').each(function(){this.disabled||(this.checked=i)}),e.renderCheckBtn({stopNone:!0}))}),e.layBtn.on("click",function(){var i=a(this),n=i.data("index"),l=e.layBox.eq(n),r=[];if(!i.hasClass(o)){e.layBox.eq(n).each(function(t){var i=a(this),n=i.find("."+y);n.children("li").each(function(){var t=a(this),i=t.find('input[type="checkbox"]'),n=i.data("hide");i[0].checked&&!n&&(i[0].checked=!1,l.siblings("."+s).find("."+y).append(t.clone()),t.remove(),r.push(i[0].value)),e.setValue()})}),e.renderCheckBtn();var c=l.siblings("."+s).find("."+h+" input");""===c.val()||c.trigger("keyup"),t.onchange&&t.onchange(e.getData(r),n)}}),e.laySearch.find("input").on("keyup",function(){var i=this.value,n=a(this).parents("."+h).eq(0).siblings("."+y),l=n.children("li");l.each(function(){var e=a(this),t=e.find('input[type="checkbox"]'),n=t[0].title.indexOf(i)!==-1;e[n?"removeClass":"addClass"](c),t.data("hide",!n)}),e.renderCheckBtn();var r=l.length===n.children("li."+c).length;e.noneView(n,r?t.text.searchNone:"")})},r.that={},r.config={},l.reload=function(e,a){var t=r.that[e];return t.reload(a),r.call(t)},l.getData=function(e){var a=r.that[e];return a.getData()},l.render=function(e){var a=new x(e);return r.call(a)},e(n,l)});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.util,r=layui.hint(),c=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,h,e,t)}},s=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(s.that[i]=e,s.config[i]=t),{config:t,reload:function(t,i){e.reload.call(e,t,i)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)}}},u=function(e){var t=s.config[e];return t||r.error(e?"The table instance with ID '"+e+"' not found":"ID argument required"),t||null},y=function(e,a,l,n){var r=this.config||{};r.escape&&(a=o.escape(a));var c=e.templet?function(){return"function"==typeof e.templet?e.templet(l):i(t(e.templet).html()||String(a)).render(l)}():a;return n?t("
          "+c+"
          ").text():c},h="table",f=".layui-table",p="layui-hide",v="layui-none",m="layui-table-view",g=".layui-table-tool",b=".layui-table-box",x=".layui-table-init",k=".layui-table-header",C=".layui-table-body",w=".layui-table-main",T=".layui-table-fixed",N=".layui-table-fixed-l",L=".layui-table-fixed-r",_=".layui-table-total",S=".layui-table-page",A=".layui-table-sort",R="layui-table-edit",W="layui-table-hover",z=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
          ','
          ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
          ","
          "].join("")},E=['',"","
          "].join(""),j=['
          ',"{{# if(d.data.toolbar){ }}",'
          ','
          ','
          ',"
          ","{{# } }}",'
          ',"{{# if(d.data.loading){ }}",'
          ','',"
          ","{{# } }}","{{# var left, right; }}",'
          ',z(),"
          ",'
          ',E,"
          ","{{# if(left){ }}",'
          ','
          ',z({fixed:!0}),"
          ",'
          ',E,"
          ","
          ","{{# }; }}","{{# if(right){ }}",'
          ','
          ',z({fixed:"right"}),'
          ',"
          ",'
          ',E,"
          ","
          ","{{# }; }}","
          ","{{# if(d.data.totalRow){ }}",'
          ','','',"
          ","
          ","{{# } }}","{{# if(d.data.page){ }}",'
          ','
          ',"
          ","{{# } }}","","
          "].join(""),F=t(window),I=t(document),H=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};H.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"\u65e0\u6570\u636e"}},H.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",totalRowName:"totalRow",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=F.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+m),o=e.elem=t(i(j).render({VIEW_CLASS:m,data:a,index:e.index}));if(a.index=e.index,e.key=a.id||a.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(g),e.layBox=o.find(b),e.layHeader=o.find(k),e.layMain=o.find(w),e.layBody=o.find(C),e.layFixed=o.find(T),e.layFixLeft=o.find(N),e.layFixRight=o.find(L),e.layTotal=o.find(_),e.layPage=o.find(S),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(k).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},H.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},H.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},H.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
          ','
          ','
          '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"\u7b5b\u9009\u5217",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"\u5bfc\u51fa",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"\u6253\u5370",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},c=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i="string"==typeof t?r[t]:t;i&&c.push('
          ')}),e.layTool.find(".layui-table-tool-self").html(c.join(""))},H.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](p),r.colspan=n,r.hide=n<1;var c=l.data("parentkey");c&&i.setParentCol(e,c)}},H.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},H.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,c){var d=0,s=c.minWidth||t.cellMinWidth;return c?void(c.colGroup||c.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var c=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&c>=-i&&c<=i){var d=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?d(t.prev()):t},s=d(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+c+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},H.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},H.prototype.reload=function(e,i){var a=this;e=e||{},delete a.haveInit,layui.each(e,function(e,t){"array"===layui._typeof(t)&&delete a.config[e]}),a.config=t.extend(i,{},a.config,e),a.render()},H.prototype.errorView=function(e){var i=this,a=i.layMain.find("."+v),l=t('
          '+(e||"Error")+"
          ");a[0]&&(i.layNone.remove(),a.remove()),i.layFixed.addClass(p),i.layMain.find("tbody").html(""),i.layMain.append(i.layNone=l),d.cache[i.key]=[]},H.prototype.page=1,H.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var c=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(c=JSON.stringify(c)),i.loading(),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:c,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.errorView(t[n.msgName]||'\u8fd4\u56de\u7684\u6570\u636e\u4e0d\u7b26\u5408\u89c4\u8303\uff0c\u6b63\u786e\u7684\u6210\u529f\u72b6\u6001\u7801\u5e94\u4e3a\uff1a"'+n.statusName+'": '+n.statusCode)):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.errorView("\u8bf7\u6c42\u5f02\u5e38\uff0c\u9519\u8bef\u63d0\u793a\uff1a"+t),i.renderForm(),i.setColsWidth(),"function"==typeof a.error&&a.error(e,t)}})}else if("array"===layui._typeof(a.data)){var d={},s=e*a.limit-a.limit;d[n.dataName]=a.data.concat().splice(s,a.limit),d[n.countName]=a.data.length,"object"==typeof a.totalRow&&(d[n.totalRowName]=t.extend({},a.totalRow)),i.renderData(d,e,d[n.countName]),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(d,e,d[n.countName])}},H.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},H.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=e[s.response.totalRowName],f=[],m=[],g=[],b=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],h=[],v=a+s.limit*(n-1)+1;"array"===layui._typeof(l)&&0===l.length||(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var f=r.field||n,m=s.index+"-"+r.key,g=l[f];if(void 0!==g&&null!==g||(g=""),!r.colGroup){var b=['','
          '+function(){var n=t.extend(!0,{LAY_INDEX:v,LAY_COL:r},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return v}return r.toolbar?i(t(r.toolbar).html()||"").render(n):y.call(c,r,g,n)}(),"
          "].join("");o.push(b),r.fixed&&"right"!==r.fixed&&u.push(b),"right"===r.fixed&&h.push(b)}}),f.push(''+o.join("")+""),m.push(''+u.join("")+""),g.push(''+h.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+v).remove(),c.layMain.find("tbody").html(f.join("")),c.layFixLeft.find("tbody").html(m.join("")),c.layFixRight.find("tbody").html(g.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](p),0===u.length?(c.renderForm(),c.errorView(s.text.none)):(c.layFixed.removeClass(p),r?b():(b(),c.renderTotal(u,h),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page)))))},H.prototype.renderTotal=function(e,a){var l=this,n=l.config,o={};if(n.totalRow){layui.each(e,function(e,t){"array"===layui._typeof(t)&&0===t.length||l.eachCols(function(e,i){var a=i.field||e,l=t[a];i.totalRow&&(o[a]=(o[a]||0)+(parseFloat(l)||0))})}),l.dataTotal={};var r=[];l.eachCols(function(e,c){var d=c.field||e,s=function(){var e,t=c.totalRowText||"",i=parseFloat(o[d]).toFixed(2),n={};return n[d]=i,e=c.totalRow?y.call(l,c,i,n)||t:t,a?a[c.field]||e:e}(),u=['','
          '+function(){var e=c.totalRow||n.totalRow;return"string"==typeof e?i(e).render(t.extend({TOTAL_NUMS:s},c)):s}(),"
          "].join("");c.field&&(l.dataTotal[d]=s),r.push(u)}),l.layTotal.find("tbody").html(""+r.join("")+"")}},H.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},H.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},H.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},H.prototype.sort=function(e,i,a,l){var n,o,c=this,s={},u=c.config,y=u.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&(n=e,c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1}));try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(A);c.layHeader.find("th").find(A).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){r.error("Table modules: sort field '"+n+"' not matched")}c.sortKey={field:n,sort:i},u.autoSort&&("asc"===i?o=layui.sort(f,n):"desc"===i?o=layui.sort(f,n,!0):(o=layui.sort(f,d.config.indexName),delete c.sortKey)),s[u.response.dataName]=o||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,h,"sort("+y+")",{field:n,type:i})},H.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(x).remove()):(i.layInit=t(['
          ','',"
          "].join("")),i.layBox.append(i.layInit)))},H.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&"array"!==layui._typeof(l[e])&&(l[e][a.checkName]=t)},H.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},H.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},H.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=F.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e-=t.layPage.outerHeight()||41),t.layMain.css("height",e-2))},H.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},H.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
          ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),c=r-l;e.layFixed.find(C).css("height",i.height()>=c?c:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](p),e.layFixRight.css("right",a-1)},H.prototype.events=function(){var e,i=this,a=i.config,o=t("body"),r={},s=i.layHeader.find("th"),u=".layui-table-cell",f=a.elem.attr("lay-filter");i.layTool.on("click","*[lay-event]",function(e){var o=t(this),r=o.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
            ');n.html(l),a.height&&n.css("max-height",a.height-(i.layTool.outerHeight()||50)),o.find(".layui-table-tool-panel")[0]||o.append(n),i.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),I.trigger("table.tool.panel.remove"),l.close(i.tipsIndex),r){case"LAYTABLE_COLS":s({list:function(){var e=[];return i.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
          • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var l=t(e.elem),n=this.checked,o=l.data("key"),r=l.data("parentkey");layui.each(a.cols,function(e,t){layui.each(t,function(t,l){if(e+"-"+t===o){var c=l.hide;l.hide=!n,i.elem.find('*[data-key="'+a.index+"-"+o+'"]')[n?"removeClass":"addClass"](p),c!=l.hide&&i.setParentCol(!n,r),i.resize()}})})})}});break;case"LAYTABLE_EXPORT":c.ie?l.tips("\u5bfc\u51fa\u529f\u80fd\u4e0d\u652f\u6301 IE\uff0c\u8bf7\u7528 Chrome \u7b49\u9ad8\u7ea7\u6d4f\u89c8\u5668\u5bfc\u51fa",this,{tips:3}):s({list:function(){return['
          • \u5bfc\u51fa\u5230 Csv \u6587\u4ef6
          • ','
          • \u5bfc\u51fa\u5230 Excel \u6587\u4ef6
          • '].join("")}(),done:function(e,l){l.on("click",function(){var e=t(this).data("type");d.exportFile.call(i,a.id,null,e)})}});break;case"LAYTABLE_PRINT":var u=window.open("\u6253\u5370\u7a97\u53e3","_blank"),y=[""].join(""),v=t(i.layHeader.html());v.append(i.layMain.find("table").html()),v.append(i.layTotal.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),u.document.write(y+v.prop("outerHTML")),u.document.close(),u.print(),u.close()}layui.event.call(this,h,"toolbar("+f+")",t.extend({event:r,config:a},{}))}),s.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||r.resizeStart||(r.allowResize=i.width()-l<=10,o.css("cursor",r.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);r.resizeStart||o.css("cursor","")}).on("mousedown",function(e){var l=t(this);if(r.allowResize){var n=l.data("key");e.preventDefault(),r.resizeStart=!0,r.offset=[e.clientX,e.clientY],i.getCssRule(n,function(e){var t=e.style.width||l.outerWidth();r.rule=e,r.ruleWidth=parseFloat(t),r.minWidth=l.data("minwidth")||a.cellMinWidth})}}),I.on("mousemove",function(t){if(r.resizeStart){if(t.preventDefault(),r.rule){var a=r.ruleWidth+t.clientX-r.offset[0];a');return n[0].value=strhtml(i.data("content"))||strhtml(l.text()),i.find("."+R)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(u);if(!i.data("off"))if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
            ')}};i.layBody.on("click","."+g,function(e){var n=t(this),o=n.parent(),r=o.children(u);i.tipsIndex=l.tips(['
            ',r.html(),"
            ",''].join(""),r[0],{tips:[3,""],time:-1,anim:-1,maxWidth:c.ios||c.android?300:i.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),i.layBody.on("click","*[lay-event]",function(){var e=t(this),a=e.parents("tr").eq(0).data("index");layui.event.call(this,h,"tool("+f+")",v.call(this,{event:e.attr("lay-event")})),i.setThisRowChecked(a)}),i.layMain.on("scroll",function(){var e=t(this),a=e.scrollLeft(),n=e.scrollTop();i.layHeader.scrollLeft(a),i.layTotal.scrollLeft(a),i.layFixed.find(C).scrollTop(n),l.close(i.tipsIndex)}),F.on("resize",function(){i.resize()})},function(){I.on("click",function(){I.trigger("table.remove.tool.panel")}),I.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()})}(),d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':f+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(o){r.error(n+l,"error")}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(o){return r.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},s.that={},s.config={},d.eachCols=function(e,i,a){var l=s.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return"array"===layui._typeof(l)?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.getData=function(e){var t=[],i=d.cache[e]||[];return layui.each(i,function(e,i){"array"!==layui._typeof(i)&&t.push(d.clearCacheKey(i))}),t},d.exportFile=function(e,t,i){var a=this;t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var l=s.that[e],n=s.config[e]||{},o={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],u=document.createElement("a");return c.ie?r.error("IE_NOT_SUPPORT_EXPORTS"):(u.href="data:"+o+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],n=[],o=[];return layui.each(t,function(t,a){var o=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(a),function(e,t){o.push('"'+(t||"")+'"')})):d.eachCols(e,function(e,n){if(n.field&&"normal"==n.type&&!n.hide){var r=a[n.field];void 0!==r&&null!==r||(r=""),0==t&&i.push(n.title||""),o.push('"'+y.call(l,n,r,a,"text")+'"')}}),n.push(o.join(","))}),layui.each(a.dataTotal,function(e,t){o.push(t)}),i.join(",")+"\r\n"+n.join("\r\n")+"\r\n"+o.join(",")}()),u.download=(n.title||"table_"+(n.index||""))+"."+i,document.body.appendChild(u),u.click(),void document.body.removeChild(u))},d.resize=function(e){if(e){var t=u(e);if(!t)return;s.that[e].resize()}else layui.each(s.that,function(){this.resize()})},d.reload=function(e,t,i){var a=u(e);if(a){var l=s.that[e];return l.reload(t,i),s.call(l)}},d.render=function(e){var t=new H(e);return s.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},t(function(){d.init()}),e(h,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(clearInterval(e.timer),e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
              ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
            "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):al.length&&(l.value=l.length),parseInt(l.value)!==l.value&&(l.half||(l.value=Math.ceil(l.value)-l.value<.5?Math.ceil(l.value):Math.floor(l.value)));for(var n='
              ",s=1;s<=l.length;s++){var r='
            • ";l.half&&parseInt(l.value)!==l.value&&s==Math.ceil(l.value)?n=n+'
            • ":n+=r}n+="
            "+(l.text?''+l.value+"\u661f":"")+"";var c=l.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),l.span=e.elemTemp.next("span"),l.setText&&l.setText(l.value),c.html(e.elemTemp),c.addClass("layui-inline"),l.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,l=a.config;l.value=e,a.render()},v.prototype.action=function(){var e=this,l=e.config,i=e.elemTemp,n=i.find("i").width();i.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(l.value=t,l.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(l.value=l.value-.5)}l.text&&i.next("span").text(l.value+"\u661f"),l.choose&&l.choose(l.value),l.setText&&l.setText(l.value)}),v.on("mousemove",function(e){if(i.find("i").each(function(){a(this).addClass(o).removeClass(r)}),i.find("i:lt("+t+")").each(function(){a(this).addClass(u).removeClass(f)}),l.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(s).removeClass(u)}}),v.on("mouseleave",function(){i.find("i").each(function(){a(this).addClass(o).removeClass(r)}),i.find("i:lt("+Math.floor(l.value)+")").each(function(){a(this).addClass(u).removeClass(f)}),l.half&&parseInt(l.value)!==l.value&&i.children("li:eq("+Math.floor(l.value)+")").children("i").addClass(s).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},l.render=function(e){var a=new v(e);return i.call(a)},e(n,l)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var m=l(e.elem);if(m[0]){var f=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,y=e.end||"\u6ca1\u6709\u66f4\u591a\u4e86",v=e.scrollElem&&e.scrollElem!==document,d="\u52a0\u8f7d\u66f4\u591a",h=l('");m.find(".layui-flow-more")[0]||m.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(y):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(f.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),!i&&m.width()&&(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&e.attr("lay-src")){var f=e.attr("lay-src");layui.img(f,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",f).removeAttr("lay-src"),l[0]&&m(l),i++},function(){t.lazyimg.elem.eq(i);e.removeAttr("lay-src")})}},m=function(e,o){var m=a?(o||n).height():l(window).height(),f=n.scrollTop(),u=f+m;if(t.lazyimg.elem=l(r),e)c(e,m);else for(var s=0;su)break}};if(m(),!o){var f;n.on("scroll",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){m(null,e)},50)}),o=!0}return m},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
            ','
            '+f+"
            ",'
            ','',"
            ","
            "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("\u8bf7\u6682\u65f6\u7528shift+enter"),!1}r.execCommand("formatBlock",!1,"

            ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

            "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"\u4e0a\u4f20\u5931\u8d25")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"\u5e2e\u52a9",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

            "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"\u8d85\u94fe\u63a5",skin:"layui-layer-msg",content:['

              ','
            • ','','
              ','',"
              ","
            • ",'
            • ','','
              ','",'","
              ","
            • ",'
            • ','','',"
            • ","
            "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[\u5fae\u7b11]","[\u563b\u563b]","[\u54c8\u54c8]","[\u53ef\u7231]","[\u53ef\u601c]","[\u6316\u9f3b]","[\u5403\u60ca]","[\u5bb3\u7f9e]","[\u6324\u773c]","[\u95ed\u5634]","[\u9119\u89c6]","[\u7231\u4f60]","[\u6cea]","[\u5077\u7b11]","[\u4eb2\u4eb2]","[\u751f\u75c5]","[\u592a\u5f00\u5fc3]","[\u767d\u773c]","[\u53f3\u54fc\u54fc]","[\u5de6\u54fc\u54fc]","[\u5618]","[\u8870]","[\u59d4\u5c48]","[\u5410]","[\u54c8\u6b20]","[\u62b1\u62b1]","[\u6012]","[\u7591\u95ee]","[\u998b\u5634]","[\u62dc\u62dc]","[\u601d\u8003]","[\u6c57]","[\u56f0]","[\u7761]","[\u94b1]","[\u5931\u671b]","[\u9177]","[\u8272]","[\u54fc]","[\u9f13\u638c]","[\u6655]","[\u60b2\u4f24]","[\u6293\u72c2]","[\u9ed1\u7ebf]","[\u9634\u9669]","[\u6012\u9a82]","[\u4e92\u7c89]","[\u5fc3]","[\u4f24\u5fc3]","[\u732a\u5934]","[\u718a\u732b]","[\u5154\u5b50]","[ok]","[\u8036]","[good]","[NO]","[\u8d5e]","[\u6765]","[\u5f31]","[\u8349\u6ce5\u9a6c]","[\u795e\u9a6c]","[\u56e7]","[\u6d6e\u4e91]","[\u7ed9\u529b]","[\u56f4\u89c2]","[\u5a01\u6b66]","[\u5965\u7279\u66fc]","[\u793c\u7269]","[\u949f]","[\u8bdd\u7b52]","[\u8721\u70db]","[\u86cb\u7cd5]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
          • '+e+'
          • ')}),'
              '+t.join("")+"
            "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"\u63d2\u5165\u4ee3\u7801",skin:"layui-layer-msg",content:['
              ','
            • ','','
              ','","
              ","
            • ",'
            • ','','
              ','',"
              ","
            • ",'
            • ','','',"
            • ","
            "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},L=new c;t(n,L)});layui.define("jquery",function(a){"use strict";var e=layui.$;a("code",function(a){var l=[];a=a||{},a.elem=e(a.elem||".layui-code"),a.lang="lang"in a?a.lang:"code",a.elem.each(function(){l.push(this)}),layui.each(l.reverse(),function(l,i){var t=e(i),c=t.html();(t.attr("lay-encode")||a.encode)&&(c=c.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),t.html('
            1. '+c.replace(/[\r\t\n]+/g,"
            2. ")+"
            "),t.find(">.layui-code-h3")[0]||t.prepend('

            '+(t.attr("lay-title")||a.title||"</>")+''+(t.attr("lay-lang")||a.lang||"")+"

            ");var n=t.find(">.layui-code-ol");t.addClass("layui-box layui-code-view"),(t.attr("lay-skin")||a.skin)&&t.addClass("layui-code-"+(t.attr("lay-skin")||a.skin)),(n.find("li").length/100|0)>0&&n.css("margin-left",(n.find("li").length/100|0)+"px"),(t.attr("lay-height")||a.height)&&n.css("max-height",t.attr("lay-height")||a.height)})})}).addcss("modules/code.css?v=2","skincodecss"); ================================================ FILE: static/common/md5.js ================================================ var hexcase = 0; var b64pad = ""; var chrsz = 8; function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } function calcMD5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} function md5_vm_test() { return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; } function core_md5(x, len) { x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for(var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i+10], 17, -42063); b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return Array(a, b, c, d); } function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } function core_hmac_md5(key, data) { var bkey = str2binl(key); if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); var ipad = Array(16), opad = Array(16); for(var i = 0; i < 16; i++) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); return core_md5(opad.concat(hash), 512 + 128); } function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } function str2binl(str) { var bin = Array(); var mask = (1 << chrsz) - 1; for(var i = 0; i < str.length * chrsz; i += chrsz) bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); return bin; } function binl2hex(binarray) { var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; for(var i = 0; i < binarray.length * 4; i++) { str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); } return str; } function binl2b64(binarray) { var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var str = ""; for(var i = 0; i < binarray.length * 4; i += 3) { var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); for(var j = 0; j < 4; j++) { if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); } } return str; } ================================================ FILE: static/common/uediter.php ================================================
            '; break; case 'product_zdy': return '
            '; break; default: return '
            '; break; } } ================================================ FILE: static/common/user/css/font_1546140_sw4m5ivcrg9.css ================================================ @font-face {font-family: "iconfont"; src: url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.eot?t=1575558014483'); /* IE9 */ src: url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.eot?t=1575558014483#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAG88AAsAAAAAuvwAAG7oAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCQagqCzQyCgGABNgIkA4NEC4FkAAQgBYRtB4oVGyGTF1SvOcbdDsBx0afHHVE1K41E2AtOisn+//+aIMcYjWkHaJX/gqzWovet8gSWWk9cEe3d8R2q0F/Igf7m39NaR4xhMOCId0jG1pzsUHFhYYQnZmimpF1cprBN3DnWp7/sUIbAjI2tPXYqvkvpwIA2jkowBFQob7oCmQgd8n23O/qVSZWD6z0q979gl+kR7FJe5JCkaJrwD4zD3kCwkyVDpW35xH8O+Q51vq+zgE6y0I4TfnGRePy8dpj+unVbCgLomc4n6F/mvk6/ckdIuOvDxLBAvkym//b8/dpUjZFtJUaimcYDzzX/RfJoggPe8xNaBQCmSDbw3gUAz///ffpz98kwUwBT7PrYlmfjggTwmxW02gDFO/H8hufn1vv/L5PIFdELKlbA6I1IiRqhwgBhiIqkDBOQPkXCAgurETPPs9A+o7AuLNr8fOD/UW0WfOE7EplhIpDAoBEkIepkk+rusGdZUftO7qlq1V3r8r3z+d6pNSPFBzOSvSBIckCB5S/CvwPMqyBUCJXJB5p3fzO/ZHPaGgItB2g5tMCSfQT//6uufx149Qhu3WcfW0rIFNlyYsqdSyDQb2du6SqUWwKhTGvrDYN/pF/p9xSXEHgzdqfVIWV6seVXQJ17hJLjDBZV1QjggTjcc+t8iXT3REtljInRHuc5FBZx598c//yrmq7g8Qp1TpFSZU+nd8+tD0tK3zxsWcb/PyAJHyApflLSCYB0R1CyI5DKhYBc+CGdS+XJ6X2qfcMHdQ5AuQBUCimlAKliKpUqe3PGTG5Thi0ZlkmXqdRly7Csgf9Zo+IV62HnBB+oVm0zyRiMuTyoH1OflMx8QhzM9238GGMYcxWl1e3Gdi1QKSk3oKD2/xkGCJaWohm0r9XNKDBx2QBnIxobQFHqYIqoAVUXkrdxcjB0CRXu1SVwwv/e4EcrmEEM8Yj4q/pOyTD5J7+q1bXod9JRHeZGwNY7ghFCNDBGjJrSqWGDUV6K5hUj+zXj4CfI5c/Y8lmjXpMWbXoMGDFmwrxVm7btO3bq3pOXy3Ql97Km7fa76svV5Gur3+ov0DXQHRlOy9Kz4o2By14lgW1kn+r1n8RDGEdWRiEixbDTWIpjSzouiYkDLEWukqVwkilHPhNrN9R0dMk80WeTxYuFcwoFxctTZcCgydjE1MzcQltIp5UoZz12to5ObszGPbx9/Qy9/Om4K5AyzG/AxZVbKYWvJO5ZUzIyVykuVTHBWQFs3JVVIm2GQ5og/iZhkIJTawRMKrqchwCDMAgCRwgGK0QIBEMoCIHQEAlhIAbCgh0iHBgiwoMvRIA4iAi2iEgl0BUZkAhRIAmiggkiGkRBdLBExAAHiAmuEAuSITakQEbgBBlDJmQCOZAp5ENmZcSqOcAakQUUQZZQBllBDWQNtRAHTBFxoQ7iQT3EBx9IAFmQDXhBtmCByA4yIHsohBzKoOoIiIecIA9yhirIBRogV3CD3KAJEkIzJIIWSAytkATaIHdohzygA/KEasgLIiBv6IR8oAvyhWjID5whf+iBAqAPCoReKAgGISkMQTIYg+TgCSlgHFLCBBQM01AIzEKhMAepoBEKgykoPHP5q0YAXKBIcIeioABSQwIUB8NQAoRCSTAAzYIRKB1GoWwIhPKgFMoHc0QF0A8VgTEiHVRAFWVcVOcB7KFKMEJUBd5QTZk+V5cAYqGlkAqthGKoDQwQ7YZ0aB8EQFfABtFfUI4fnpCLH1FQgh9LIBs/lsIMfnSBH348hTT8dIEg/CKO8Hd/I4sHJgEs4MUXwGiBlA0KR8QJo97DoTHANGkyaBiyQumMYhxKHBPAJAuBWeQBYG5IHCOKUiAohUaIoFTmXBEaIosO53dAz8DgJMXQwYhSMCWzUiOuocxEC8wFiUy3T0QNZi4gICSiROvYB+3IAxMyM42Lan+PkdoVuiB37IOygXnpEGsc4FvbdxCYVw6Gbn+Bg+v0E++l1V6DsLPMIbDoMn7wq/8+UGQIWFU6H++dhLnVy6lZcl8mfTAmGUAJY/De+FAM+k6BBSIbSnCnJwIXGLG9kPI91CbtjLqDuUrJqLhHfFs9BK8yhjewOM7VAVfk5jKFBFRYc9Jj32oIoSRsceFSloYxlAW3wRDjYbZRWklmdTCNxeI3uN2kGG2CyINOtiIw52ZHtl11rb+MRpjWnO9rTeNQuvoWeg+616dP79XSQg8LYcFRBRHn6KGitDEewZUpFvgjB/GY80atK6dYVMt/vtxA7SZM9KGN0zJai7i20cNq/8Rv2mI1ggpnmyrezCrCWKbUkSPDdIrSSHCgQTKTqzkCn85yY40AExAYeztuSkmUC6vuTCCsDgyttIUAKIWK3EgBvBiwb8/RFaLBjiARHBQx5eiddifdTGxlweWzM1Wb3P6Oy2EWlwY3SbMK5AzWimUSL+5T1sEBMnAhzhC3Os1PCmK3X+duHF8Krb1vd+Un4Rx6b73Q6ErnB3MpXET37Mz5vgWYVAcTSBnxGgy4KKoY+z+2nFPOaJyXsZmivNEpa/iiv6EUHtPNXGa7W9hkmf2ID6+vt/vNUEOWrZIateWZXPJo60V0flnHQ55ET7xaT6EKydws1EkUxq2uhx3TdPN2fW0w53F1PNWF2bD07Wq5GSvAcl+Ha9di9HG73b1r3KzdcTOMXOx3EXE2Tjwr1bFKULDCxgXrQPuW87t2MahfKdLapZzXdP7QvuPsq57P+1VDmHs5o7Za8Gt5r7qY39+664atWZjLBbN51Q477u9bt92DjSUraMxCP7BJ4U2Pg5er5nK+ZPsUBk7TccyY3gaL7WLRgb4e89CqW1ZAMOJqHtoN2w4UeUMy3+24bmjEjL4GC61CgZivwTozX8vnuz2fKd4mkUgW4+KFr6zy19nlb53KN/sMHWkGMDWsm9la19Byy853GqvWvxbXTLM5iPvUiBE6ouBM2O+KXujPEyUAPGmGrMNVHwNfdPgxXcdANeGwqJ0x7uMc+D0/PRzYVnX7l1aT5YmIQXIDMg7TbtQzMwy13shMmDJaLSAdHZpC2mnq3MowgviiJInoB+qrr94yVFZfHAzumgfvDBoxKfRR1dFSFkm90eCx3Xjj6oO7d012+36P9a7na4YQNahWBUwQn40sdRhTnkodoWZBCH3VbzdzD4nqYrtPxBCq3eyySb92//33q7dtm5oikCC4gGvA3DqjthytFDZq+ZV0zV5vNtfi1WMPxBpeisUN4fy4JiWvm3+2XqQSvuOzaJreDKa0HOoLlTuFmQaVt2+p3aSnbpNKCHbdcCtTEUlz1ZiPb8lOkeoYV7OAQ3o08ILSSgGUQMJkXCskIeNEWURuRYIxuFEV5tnJIkVUDpXVvIEHUojdjkVggaLaL9SJAaGQzHQNWsuRSHIzzkAuGRGmQqPYRqQpUOkA84woGRKWMFNQECFECX+MSEqB3C2JGggrOGGcvLO94cP7BwhsOIRXWe+noaBdR7AZZNMLyxP/Ul7Z8d3ltal/raw+gXTs36QInH3ZihF1kuMpBLF2CA/Kz2CY2ZoQJHCkyEOd9iLH21ifQ11ng18Pk2CgXsQpRPvxwDRZL/9vOUfcMLRQQQasjoe3pA3MfC8d2GYBQnkL07yNNRVnVJNe+SY3aKCIrU9g4x1/9dv84td29FYYXkFUEZ0opFzAukhQtPRNCBJ1/t5cOXhmLd1/auXSLKXCAKUvBKyuzZkH55LSSXNxZdKozRZMM9L5ms1BhcyoOzRNv/J1RF8XC9O3znAkgMh4c2a1Mi0j2CfaOKPasEtUDZDriZeCheIe1YSSI31AxbysG7g1ByFAE23ipr1N14MDlIM6jW5u8b0dmyhAM8mMqHe37CwAeD9iXCL9E/0W2TJx3QBifBN915LBHaq/nm1bKEPPB1+AtdtY3s7lnu+LlagKaRZNaNKHkiTjWSKpanmw4/vpdG/CoLTUnYzytfsmHjbCdfdBWmjl/xYPXjt81WxVJzC8nfnbJNjoHh0adXwzC1AvRs3CtVFTCVjSeF6qpmC18lOb5WSzWmP3R+AwwrK2nxx9a2QLXyW8kU25GU+sbVXtTCqs7HaqrocQQQRSwxDvhwIEMQQBbaACvRZchU5+tcSHgnFVhBUfpqPpzZINpoxwdrrcnxlsKw5BsE9FXzX3i0H5q+zW0ZEhPWdKAvKaH1p+vGu8r8eBwM42B3/SeXKG6fIydgE8ml2zdwdjBZBj075oS97IbYbNYYPlGaq00/Dk9yUTOtZ2DfIG59tsm3RbP0ac2eEiQAfLTnqgZ3ZX+Ik/wcbITRiT+W/MFrP7jRxsEQ5C8gDOJHN7byhVcN1gG7enyPct3IobaebA7bHtLNJRCytXK9sjuTCMJpKNz2W5GCHaMibh13lUGekYYBSWujk8d4M0frNR7oFZC8qQkbP0G2b6TPPSy7cQRiKXobAOPkT6SdfgaQUA9FQ6ICCaYQ+h+8b28ezXs9XBwlb291amkZqG0zeHrTGSYH3v8+7jqfnTpq0VKooIUTwUS6MCAfd2Af+LXTMBkvnS6KRUVCUzG8ZSVPilWRd2LO9aBLO7S8U2RXCYUor9GdXvo9KmYIUWh6Pf7jF5ZnZuFyTrubrTYhKtqdmFak6EQHX/SINfv5Qc18Am1pRP0z7oUMvYwZgBfS5hOy9Nl9fGw8yLJkBUY0tcad54I5stdNjxdhZA0tolJqRZf9+prmJ2mRNzS+6jzRYDY3voqvIqy+MoLvtlPsRMzAhs5lBTBgPUD2PixQclGiLnkEadwByoTUqRyrpN2gLxtkWKrgl7qJUoJGTObFusLG/UngUKsJCMFAYFs9nLGbUZ6lBCKCqbcEERsH9aKxkCTcUfTkNujxA2Xgth0WSMzOZ8g9qFsbIu2eCkOW2+x2DeOWOyHn7qDEX1tYkMFrSoy4wc7xP91EM1+pFhWs8PF6bQx/oLlu0Uc05hYdp2i5ZTzOcCt0Bux3NOfr5glU4dJFfPebThFPK2awUzYaR8aLUyvJitpH2FYHj3B7xA/buOL+6l4TPRsCc5GBK26PLac0n3NlnUYJK1W/dHQcO6+oa49LsCwOKa274A7juBUsvd0GVz+dl8hfCsvThrzf3ZZTwPk1KA40prtDwrfEhya5gmzrihsylEl4WTDnr+z+yjHBhVPx9Eh3vWo3PW7GOuRpwNY1Acy3Uru/nHfRH3vZhKkyD0reCQy+c8+NfhtmPZEOTq2T9PsJjyCF6cu47tT5vLY0feSTIPvTfg/IgVPVWKJCOkufp6liLAaavQQkv4DJ+aws3glZZ0ynyKbquBZ4peXgRUs4iX8/MYfY4YwrSBtIz9NAeCPX44wDAxb+EJBh5v9+s8RDQ+6ChcFLEvosrfri/977XyX67O///GXvyCJDppU1SrghHZ8tx//mj/658D//+7629/jRP7SxQ029KnRYER+wefWRcNuR6ju7a9Mf6cBKKrU401E8OFYcO2MqsfEn36yDMeMOsrRmk3gMCdRD76yLBBWserQ+RL7zyUDgdj+jjbWjl/aqXYvpKpz16q1lfnOh9L6StlZZumadUA5cT2mTRNpkmxT43rWV1GSUNYQwQvV9zQzvu2eCDb0KyyERM1dv5zn+a1KcWP6Yb/jbyy8JkVvZ1d/tKpvgNUxTqV1ebCwleHf13g2kfNnVfm45kD/aT0J/+p4KQfeOFYutaNeoXvNgeE9CuoWZeE65qj9KPozOYrM/1PArS0POqcLVDmtrmxUW9yzmRhnQkLq4F6wFvEIGW0WOp+FJaoxkuJ5lqz9D7rjTQioP2JO7f0GhNs2MQ4kGeLnXTjkAmMEd8LTJlCT0O6ZyycSlpr+XJrrLP6A4KFUzGD+CjEl0T7gsy80Ke1S0f94dC/W5b9+oUM4YV3iZdivjLihXIqFypyPnBKrEGeLFrz1qT545pvXsofqd13K52r1tH6m87ZeoNXdI8dkVU4K9pYSUesP1OB+Cz0j+mWZ0cknh0iK/t81LznltyUURpbSAz1j/SekQzihntKrNJtF+3wdMVuMeg0LMnPX5r1bt2xAncyDLzu0C+DMQjpLlzcfPsQF/Be7uYuhQ/K7Zlr+xQOxs6zTbA0f44x9Fdzc7Hl1vJh3hMQcq9XGNiBwqJdkCys5g5tgtfEz3dnFc5pfOQXfk+wJ9UcDHLTjifehmVGuTBf0eWyHrPZUYbDn074k69G3dkh1O5MXdgeXl0rfyuOYIi8eWJMytaPI01ZnCTrmwxCfwT/RZo7j5tjMvVKFjZqQy1Gs/y+CWEGNxtkuNCGyqOzdfnb5odxKtCyl8cunR+D1VECJk3NrcuXd8lXqNu96NJrtBik4tt884p9LJBLFwbuQlh8kN7P+8frvfOL4B3JL96r1Niw7cOaijPqKfTr2XJAYeOGxZXPXDpm1OcKqGRMWPONjYWRqn4LHcU5vbEDiouF23JEsB0t1nn5zgbbDoTjdAwxhI8PwwtZmHuvPvL/ok165O2ncctiXEGzvo0Jk1o58BZlnuy7+cltXbKKojGMAdVlBcLDlEWbWJKTpVs/5iRzjb7aJtQeDp5IVMzDDbTeME3FpBEYvE94jO9OqwbeRiYjUUFtpS1chCFqWvnjoNkc+9ukVT7QIExns36k1uLZ3ofrwxF4SSbg+aFS+EIYvOGHwYgxw5rK37VLS81NerW+HZ5pUqXLHDZLNGmaYru/RPTsQ9llALr0lU/AILVY60Yfj4frhbTFWvnDNbEqjcj/Y7OBaoHd7p2PFru3kjv9pfjC4O5xUzz/ZK1aFbzFezTtZ5gRzRS/Q/v9JQwyjmi7XidkUDC9p1heymXy2ef8EyMmxKAWsRTp/E1SJXe+5/3jpuzo+jStLRundhAD6AOap1nd9V9uyd4DSKtB8FBj0hnRjUEM0UT4gh+EQeB5/tT4gZFgIvTHPF98QKdujIczW7K2Q5qgXKXLHS2+E74ukiKrdJL2B2yj6nXpgVp/UMj2PD3YOKZNbSKbdF9m4KFsNS2yD5UO+WFqL6/P4XjyyAYRsJlMuSawYAfR2qXPKd3Nu+80RAYUjEWmL5nzop1RpOqoEtgHQlArMsiY4sSNY+Kgwk1BUQa2xExeQ9vsIFeVFr9nRLGn/GR7vJ0t0EqiMBn6hEg1j78NMn08yg3xdsULMQ4fcEGyfCXMl722cUbFA/pqjl41uIhqd/uZNBp1z6BVLclKp5HopfVdJV3/ip99uZCUGxm43633jI5897lMKu3TNoGkk0oDRLmNPGBe6Q5oSc5UNpnRPUM5mRSO3FOpMxZ38EI42meWS91rE9XFXI/XHgleJjfG6QcZOT/cHEXqatkuc3UHM97IlnA6GaPGF/P+SOrUZ1Op5uP/65TmscJ6ViXbk7VRpQA9nJ/kpri5Dif+TzDjlHzJeYwY8lTqDilkhl/rMTHUZGaosfmmAJBv69dA8h2DNrdIxmQTVJ+oDpfzFgYituVyTchIoNpqKRRdIJNVarYlF/XoHkubovPHJ2NUqhljlWpj3Iib/plSkJes1AxDadeVW9jjyi3UA55uEQKxvEtILQEsdH+dGDOGkmjGvIyKBLgwdtspFttezSmt6U75j5rlI/hdmAoIQyRsO63Hz99vWQk4nsUIxGdSFVqNCib3ZBnJzU5PSJr8YGKSfJ9rrrCYIHqRYUsBpR15xm1XxzgzNTvjD4Evw6UJKHc0vzkW/X9ElcxbxYQ8DlU+Nz1V5jstRa5YuSFO55adIfLWWN8u+bH+Iaun7odUmv823hbqDdS0A29N1D4KU5HqsrzL745tjYYGD3ChuVuQiFZZrwHE8h5x0c5JELJQjZi2i0px/hrXrwdsNQUnp2Bbsvdep5tkC3H44Ofv/NbVW78GkXWMNy1ZSzP9mXZxxjmDzXul7tKJam7R4DkQhcPG8rLGZC/fmIH13bjnzM42713KXXz4fIv90vfx7a2Z/9T9bOwjb2QXM3ejx65Xrtao5UH8482eL7OG2lALgzD0/XMUjEtb6Hq5S3Av2aOuWEpzzWpf813Tip3w8En6h+kd7GdOqBQGZ/fql/lQax5e/XLhxySX5+gvfm6Xh1EPBPjQP2B7QL3arYoIOCJPdIF6CxPV89O+PG8ArzQtUzfUdxnz7+/VF6ygfpWHeCz1i0H7TQzq/UoAW6GMOUR4BWVZBoCPEKNciy/WeibuOX69mA0aS0+xHmsnjh68tvRFFc59tjSknZqfPiQT8Ylr+csji9eYqTQfw5WwZMqIPVzN1BI5aO6Q0HHzpbcUVO/F3z7cXt20PqOVlp0NMGQDm96iPjhco843qidg+490N3d8FLJs9Ks8jL+gp35TR+h3En0m1J4mQns7yEaj9eheUaLDDY/7+EzFEO2pUZfWZ/2NQetDZa3a9Bxfal5CkfL7oaozHhQfkJ5fQ/P3z3AYTC8zwVq9WrTYbSZtYyluDDrU7UBtf4NMeEWqfI8avvnXR42jdTy6fA4TsVPK/KfBuJTcNa+i+AyIxW6Cf/kMPTX1O47lu+J//aavnyl3Y1GnVsJizfRzUhCFfRwLAAteAde7YC3m6kGazXzFW4CUFF687I7PtauTn2Rc1jnXHTZiR4AG93CAZkkdX8+6vlITK8OaUlHRq6+31J+J6rvxz+WiLyWsjpL5/OTR17MhqQNZadLQ+MtGrke0sU6ufzP0n6X0K+sv5WtfZ/GikUOo4byn6grkz+vJuLg+Nw56zFzM42aJ+dIbc0fIssrAbDPWW2zSU+QKQVLmuOIbhQGMDIKV1Z0bRMAFgwptNNxxLY+dUZ/KPlF8UJ6po7p3EL2Njk3/uefC746uH0okm97sf0ndT5UJQ4IHkVH+kq38wmi5sS24N5zOZLMYpuBrezAjBpJNUYVCRNJcHR3GAq2ClCbT/FNaLBXlVcNRaMEFDdrzr8h3Kam3m1Dq7hp+oyHeBVxCMlN9PLm6wiQ3VYP/6yXZ7kZsBaFvB496Kedr4yNKEENSO1Ts5WmAx8p1lqJayaOVwsD+rGt2lyCXgiThLUyhQA/xmJMd52TAx0KlfT+lZ8SbHFzV5riR/JW1TwiCGZdHJHiBFIL5MuWhPlkBZjrsz53g9YjnDfomgZXBjo2QDKZPyRp0LlkbbfucQRv3JtZFY02nAkasRKpF7EqaiUJyLmU59y+Ml/TdVCF2bRxixiq/FzGznwozGYkjBvv06nia/jLbsT4sHPhA3FihsFFuO7fUFL0iYcSDI6hxlNwqhKPO680rRYl53Knq4xfuci/WysG52WbXKDByTsIeBkz/SNZYrUCa5TOD+AWI6GrRcF0z8fKUtpZ2Uup0JEhkQGuRmZgNuCZQ1evtCkrQMFqqmvioz6B8vzO4w0L/5AMdpCjpJ+kjG9RXouVkNV47YkB59dDAHjWyxz7ZL5Xv843Nm5ziltJ2i2PUN1HUKYLZagxe9UMPNPnhwZPCYR33oAAhZUtmiVEdVKAPyrWtw0hqjfUZJSJWCxjvFKSRtvNj2qyIy3UgU5VJzYQFswviGg3lK01P0HxvhzhVtkqMXCelkYkR0pynmsjfckf3Tjo8jU2Nfy7lkE6SN2yttiuYEPyScZvHryCIXQxvbmfXfuTFnDMQhs8VJxhEtinMDCOuJJDg0qaMS2pIAai5Nk3BfAlGxGl6ojaj+lbM03aEqNImVtIQedYym+WGrTQzWQSUGlDD5B7rziavQqIoB4NSYQg7jj+g0ARiFeNZohSltpjZUCFm0uAWjctIFIHoQCtuQpKyMwlN8+u1Og1S6Buc1hut2jOiACwtar0/qcyltVeNOlNoC/IrkNSYyev97lEUtTpxu2k5r0x1rBJhErVW2mlUfIiSOl75jcj/9xBalj+aysF7QzuRok3bG0tcP3DTlULn2+H6x7H6orOhsWS64Qkq0jhZgCkf+lxz9vy1X2y/Rh8vrISlr7zfQl1ckigVM2kTjc0AJgd8LlBbHXLl/GHrI+lxPKA02y8Lkh/UCvaJo+LjLMB8hV36CgaPeFZ9mptIHTE2ORpJqRPZ0ehRKLOc8GipCsafxJif7NjTuIz97brM+/vfQ//9s+Pyqf/q369wl054XAqcUfrP6ld6/EktoSQUT/441yqvydRn/Dnx3nDk9mVCMM2jv0ec4Xo/jL27YE4eufzy8MS8OiZqcFg08YSq82O6w440P/jptcfXPvy28taQ5z9uDLoXQ3/+jRufhE8uqNvslFyEeXEHT6sGryiFbVdr3mA2W2g5QkDVOnvhC/k5/qg+ca5I4AxXN7BegGjecUSV1aznCIGGnpT6nXt9krWEQrxyc/x10pYCvGeFHfdJ6Uz7ih0Gc0s2KT5wQ4FHv1+/v6Tk+flLTvfEiK2Nd6wgVBZyjXog20lkllfLiRrzPV5ruaYr471ocNTeES3TNF0lqSYOZfsJFNFb3UWjQ/JtSZGl/p1XisXwJ3/b0PVsbH2slIco23ZRFK9++uWHj167R+k3m2S301qtsY1Kz58XmapRpyHKfLUGn5w2Q/NjA+zKF94PFuLCAEKEjjK5G5SqcWCwUsnq3vqtmcaOCQtuxke9rHYdNWoQMJ/fEM6n05VMQQtnNjY1m5bPjCn3BsClL8K8XW/wD2WtqL76AcnI4YQsEJ/nrePCGOQf8T9QU/mu6gVLtaDuIVGDtMeOia4BRFVfTAr9w7wbdWyXHGsRLUjpG5AZ3yaHC4NsuTxxPlctiS40k08+eo2Qcdxarrehu5yrXjSi5Ne21TH9TiHy+o1VD5oh+0kXIIeq1N6qkMO5+ClISCTnTDHmrZ0D6qrxN98PQ5hUS/FKptCKjQbd2C5/nrXN/keJWrArzlUyd1KOasMzH4l0i8zniAsNhJTjY99QJgJwCGVmfeyMi5FRmzr5vhpFWzTch7Eiu8PcZMSFeuyqEl86kyeoQyWhiJRC0Ilh0ccMZoo9x16PpRqQhEGjkU30lZ8mynRjcAt4EwT7RnPJ3uYMyVfVqJL7GYsu5gC6H3nfuQ7WX8dtgtOMJ16DrsJibcttzIsO17L6hBJNypXisfYE13UQbSWErVvreQrroiYojPH1Q4WYEAlUEidBvKg9CsquOQEQABtscNHbJaGOalPUk9DHg855yukOWhSoFGfoZkbFVUrgd9xMwSR//11dCpLciVo3rCuBVHGG2VNtNk2sWEqDzYWUTY9eDQTJpUyo7+qP40d0aTKiNCY3wye5GzTXLzfDVC0mpWlLY2YY3BomildeSj+6ajw4BBkIMlqbW6/UMxigx0zG10ukHNYJeUZpQooim5kW4ve2zAv+nADJzMVxv7I+LPgK9wXhfPyNFz1Z8K2hP5t+e2Q5ydfx0WvxzbVPF7798NXoWgUV3izSnIpp1/MIrUnKEnZ6vis7HQ/+zvvw1CJhrgSNVHa4cMc521yUsiduX/7C45e5wqNKJ+SmBbGfobaiFWtNpHLL0sls1G4vOO6aZC4RyhX9l2cAGPm0nZ33lOPBlLWp7NwoWO2tzhDAAisqrkb1MWom2oNneeG+oILFFi5qENaSKH2FcdlMiVYgTHxJ26xlAtdXvVw3Lh13vGq8spSciIkkuPdWsAK/Q3NfDhXvvLOUXFYZT0abXiwUXPNuIwWuMODJWOEud1XTSBVUjjQLo6TPcRGZCBbAlBxJ8cqiI6icKHSR3W0Ymy1SjalisjEZfrYt2Q6bca+Veqx5NlWqKsUZBh607m4MFSWkXnaeiboPh1hsAODL9bjEi4/WPJkf+8Wbx0ho/0cmaMaYoZuTGh7aZ6aA4UMMPJAJzyNAQgd8EcAbSA7Wj36FHZG0Ryhua7SUZgXJy1qyXHRdNQJHGJ1CoC/E8NDEa9Fl/39lXxF3SJv6SKiFSVdsbxSJTSJK43Ne2aDuHFuwZGjgN7rQAPUebvpQt9ml9XfRbmsWVTIPrXdyRlswwOTSegE8YsgOvhy+1yNoVEUSgsHSFxW2hc8sD6rGtWR01cRsnL41osPi4E6xTTwdcU+myZFCHxO4t/NO5q4MEZwqAOmdImLSNUCim9o/Yi0e+vN7HxvP+jG8MA6yP3/pA5EXQzBxpIJtKkHHqDmBdoPffS/0ebhOJz8e9OhO3ws29gVr4/Rrdeu9gWBnmKCX8VMJO0qHpostRCvp2sLp9eLVMXZECca+ITvGUH1AfRMz+M44uzxK4vvZ0JiLu6g225idh/goS85V70ay0Wmx0VHYDASy3pRuiWc6JlmFkwL+yfXA1T0mFwE+n6xPS36svSlu8MHt6d5iqbcFlSS7l1bN+0sDt9OSWwxQQpFoBQkXZCUK4zUKS9atmRt9ymS9Whe+Q2mpNJhS8D2rvptv9S1kvynns7HSZ95PoXiiPPwFwXOfwJufRhPPyt635ZfS+pFJjBQqPUQpTdnPxVufHehjQgX2JkuPYFYr38vVjPahxETLR9jQkBRg+uI+GKPSobxvq00aZMlVQBdWzFNUyc37dFOke3n3hpiTd6uiDZVRMSBHWfFIKL6+KnpNNJY22fG8oLPajs67VjT74rL2lfkCXyqhCgLO8zC3aRbLbU5LyLt2AX4xedQ9zJkuDfzZQAA27IZ1MrTfC84zcHXqqKgz94iHoRWqxLjXYm58hKpj2GlJgEP2Drm4pxLanmQSCq4FXZIIact5ePYRh80G/mtRDSwu2SEV8+i7llPFTc5fJxt753LI5hK0lfn0kcXg2jvAMzEvuBr+Gpdy3V04sDUvCYEo7CQWppmrWi484qD7SJK1k3yLblgOA2ktFmI1V4WUtbRlS6EACIe2NSrAywQ9BOMIENaGJdXryw4PvYeeGdHJm5SbLRyXfKFz+/5lQ7s23KtF0nw41UR/dr6ZFE9ULkuzyjfLD+b0uBISIlFN3Cm6xxtFxnyC6KM0Vo1XYb55Ao6ynqhi1kgYZ3zax1nRxmkliu6wIipdn+wxHgy9OwATEMRkb5eb+Z7QDCYNj1puptJtFwQTY75mr4qKqvebIGrbVQzZ7laZ/LrTG2Uphb1R9gaRLuPh7XTOl623wnAgu27qy3QQY/Dl7+bEmMSDR7lnO1wbdcLZYWvcv3oHdv2MGE+YjMAP+QGeFDeSUq7JVYiOZRNw6MRYMTSsyVHE9L53gCEeQCDacGhjlUAEBC4Vss+g/XpO63qo+cL4xj1rT4ASoA51NsJRAGIR257iAQxmrNhOePfrUDdusoj3d6Z4wx7PvvPb+U/zTZebQsVexlnopl1obS/3ee+XTDBmOOcnJTNyF4c9HHIlGHBvlwAHgKJ90oK3+tNjpt3cw2EIuZwAzd+lehzYhnJOM+oQCPp+QTCnl1XKTufIj5BcQd85RyGecrSRZebijnhN0/enV7b0krMozGbenxLnx/KEwr6lyMAJDs/xPGIlv4kdhpd4/lSRsafZWeQME8DGST+Fr7JkoNkIcAGeW5PTxg8ubKt9OIHPA+AHyJ6FeZoFyJ/A45DyKSTHYBZNhC87IUUW/mblfAIDZJgSAO085hv4uLngApr98BKj86xi5HKAj5KyxCtbFZHFmdVWMePbOLI7wWFfCQRc+tHihABAPsW5ncu288Zaubx37zQ+fc60C4owTc/p/m42zX6a35LPM1qfzBu5iXOaX5i6uU1zuLT50kNDdm//yu85nkAfjz8p4HcOJOAo+qxDHQUJrgp3tovZzBMzV7bWp31vhFp1Wxpd5pn5suZuucwB9gFAKQH6DP1OTH/N6oUdkhmoFNA9zxz7KcTiHuzPKAy42VXbli9vmQZl8bZ+TBSixknJzk/2piUDHQMpXN36TvOU5nMpMy0AxwGkcoYZALt8DjZBcbs+B2g3ku+cIrY0FWMGdQCNtYNg0EP7aGjDQzTkIQCWGQB4rIDFj0D7degQQlzTZudyU49OHJGssMAMQOI+J+FI4WXrIfushFMu7Cw4C2HCHHA5C7RkgBV6xD2N1Dpr8K9QC540LRq6L7AKHscj5zAv42HNPM4ZuPwcnMKX4LWZ33Gchye5Z+ACh2dY5bvmKB7Bk9xYkOc/nLP8BDvOj6HPf8SBW0fHcBI9DueggmfhNTyKf+chBvgEg5CjygN1pAM8xT3ispd+FYBz3ngeAj7nwDqNZ4kdGngOnvRiP8MWeGhaOM+QPZVWvC8o+wwJnGdgCp7Fw/wfKFt8Gp/kBoHuf4ELewFgo/N34j51UjmQUPgfdt180sAzBvVs4AT/0jURckODDkt8c+cnQ9sDC7vu7QLN1377MQ0mbG/Rvhm261p9jmSXJ0fl1/Gh3I9eKkHp+Rl/BgsmDJcl24A/5Vl3Xi4bJdcAD0J+Ynqkb9MKlGaGFDzUqFCZsThBgwt7TArwBJN5l8t2LBVzLVkoBeqCZL4UfjUmwEHQST4SxOeH50t7FGrWKtyeG8/O37Q1t2MtjYA/AvkVHcIw+SIOClek1M7JRHqa2JfJUvyPWsaMARJDMsltzSSUkJMEzFA1+F79E3awoFLQdL69D0tUCQhA3cAZnmoe7pLVZIEJaOalMfFIwx6KNutYSAxpQ8ZAVFkUsha3xxllGZREoPCrglDv5tlOyxZ3dWpYoB8UC9pCb7jItTVn8RjDNFvnac8K0zUuzhEoa49DFbZCG7lQpI62Jd2pY4K444FiUxJUS8B4ncOBQWnZbAuA41QepQiK1E8TVFAQu2Rbag/cjquzBjsk0CCUTrOQE1yianV+pVDrIAYCYq0ofUQ7kRUkgGCRQS45uUOBJMYxiVsVUS1si4THEZFQHD6kJFi+wqnmTywX0CQUEPqFdLN+v8cH4aOxUi1rFWOap5Lk5EEVSLMgRbqhw+ePpzzG1HNPReHJUt1PjwoCV6nYX6EAhX9S6ItXU5q8aTmfEIfpRA1CFMpTCi2utYKiwlgJpM6ngIi3JCcld5n0XCsxdYqWIlmibSkCySgZ3krU2wBInbO0Sua3QL3yPLgV0II86tnhY54Ffs0NdWMr1Kpq9Ap/FoYJ2DcfaRWqJTaYuj1n3aJFCz2FIXp1C2r5XZvg4bCWaxeDVoGPHu5qEPvmCkEav7J/e3Eza9g+D/buLVukAIdJTMs/e7wbXv43IWGKdpENfPiS2xI4lZlqUDl99v0Y3lUOtQHcwPGz/5yBAyLHuRxa+KxzCP97gpgJG6Zl61PskH1AoBpwU/QQYfNM2DrhB3131GnIPjmxPf7H9zDcYxyYIESk/FUdo1i79IqInh9DUpa7YAr6f5j4dw9hwgRgUsfRMTRk3Wve9fUh1KVnbaU7/ab11OvmLxdupoa6P9F5Z+1U0kMPbPvP/DpV/9hvyF6xrzqEqrDGeGMsFCp6wXp7xZDfYz31mrnUYe05WqhyZ5a37pNATGeI3oWvzK9R9dN+O22l+6pVdIVF/Z1ozSoWN2hN1+Suvu+ZqkIp1KI032NhiXeNCkzEEr6JqfaONu1Kmk8cRowO9c6436BZk2/aIXYX0oWFRgOxnfe8M1Qod40o3fdKasEdk3wHvjskQIyKXieGHUv1VmAUiJdX2v298QNaow5my7EQKCMDajHkAIyFFktC2dMfqNQP0+T6IOjJ/b6+SyeewEMzSqtiWFP6psF0HwX6eHG4ND1fz+DKQUoyJIcAG/wTwUKlHrGGtK8Xge5hb0f7djNinQReY4+h03jlceFVQv3/xgWIPjZsibDgu1EBKkYbF1YlLXhYiFTFhi8R6h8VMEGVFyyXczi1a8Fn9kOXlJcgLDveSrcWKirBE1sPMbS8fPpCuparpR8kteJLQdHctclWbLCZ8Wyu4XTfmT7D3GeM/SDgcp3cUxRqFu/myA7nGhlPytD/hHopmnGyConPTscw8zsEXi6LTE+4l9Dhq9f0bKvBZBVYB9h//xW+OJ9hfLfsRU2Ys18QNy5VRKKtvl8+CMpM3FPtFEq71MIF9lSqbRE3K0Vm5wFA+4UY0/uvcx87b/33BDXbXBHlPWfysEnmpGPF0V+a/zebWbzaCcLBi3vWyYmi99dTPPH45MfkhwNqb+Eg01ZTSAzq/lWpGCKliLt1Gw/3Y6B/FD45UVcHxJDpQudt2y7lAA4iP476+RPV4vEDYrSoISF+Q8hffyGIQ54bQiUAUlj8y7gQbbv7tr/HRRlcPThYjWB7qa24JfDuPXAzFG4lt2rX5TssUVKXkpWXypyl2F5KL7ZEEMNLXw4SQXxya6RAE5l+UpNgn90PMkB2wZoUWxFCSMFE5oDAMzgl+L0PeLyYjzZBr7d1h65QVpF/Qw1QT7+sdvoz7GWzUWpii95VyQZAzkZ35ZO6jAHA/DFhfMJaEMsC1Ls6PjP4HzC3NAfEYib6wQKpBrviEwDX/8CWM3lAtzosCaRiuUmxUCoKlQwDWirIwVJWgj8fboHjAeipA8QeMDD497w4sBoHgLUp6JHqS40WTgC0DIBwUH818PPce7RL0D3oEo1H6jvjy/b9viJHpMjzZS+2f+Rg+S/QL4n19LxDoZJvB285YO6q8bRoU9FZB0AEyqrF/t7W/8DxgStFJfXLuuR8KcvvbIviMuX4YNsfvzGya7uvGT1wnjJCGV1Gm6EvqVHql/MDIHxyj7qkGxMZVF9fnhgXiH/A4QAfcoGTl1TlQwnmlHByt5Wahy5E89QWvN3HEQ6sPts+lsNWYE0cm5gYI1qDrQCIp+VlpBmSqRvjZeMfiTgfSTc943/Xxj02h1a1ctI4rUPmj+OEn8Zvygyu9BfyQehbWw3cwOJqP+EH5Bd2Rhf/G/4oLBN+hH8nZM2ALPlV2yNTLoy1tgZb2k41Ot2D9H7Qsq7b2de9QFnNquYZhC2SFsXIZHZKtCAMCskPSRa4ohur4/QSg7SFYWAZJNXuvs7ddRZSIiIpnNt6nH089Ipqtp5nYJuDPm71ZBHOgviQbIwpooXZ/MnVcVXuwDzD8wq9R7hFepLMx81NiOoV2aFhXpiwEPUnpUJ3WQWCri6WewlDzOJdHVnhHLbxpBT9j1eoohInK+d773QKM/+LwChnk+jxF/JX+1RLN22rYWcXWLl4vyH51V6Sh85nv1iqOoujSBM6Zef7SlLt5Aq71AKBPZVqWwhAtH3tsXW182g7F2N6727OY/81l2JHM0W6d9qNLfYlux3LLDIZbtSM+AoE1TEI7rYNxxLx5XZMAav07YdvTCf8tql2W8f7U6Y9PxymDROrvfVz7X50f/12cfa9/rhA76X/xBGZVx3fO1TDmWYNCYDDBw5ban0um/EjwnTjnk6Pjrim70VmXslqbhSnSs+J4saAJCp33uelZGxus+TdD8JPzVU8nY4aul3fz0ZDz1ht11i+eiiN4ZgcE3H6nojkqpNZp4gjSu1H47s4lHB1vWmgarb9EvE15uGM0Gt64W9UgWBZLo5ckywZerEkxZJtmbqERQ7xY/sFk1OsQzghzBA/XbCDrYMlnGCO82xJ9f6F2xz/1UtY1tes8w4tu39l6gPFILRmWnuxvOyYtiMP05wcH7QNeP9ohfa/PpRt4ZecbteaZBS7wWfPs5PhAdms+LsnthKWD8azPPDopA2rkZUPoq9p02sJ2P6waAp+XnvuowwL7nwQpuxEVx/CeztHfZVhz/nXHb+TmpZWeMb79nX2hvepBmLXqj7+vG99BRJEK8I7X3R+Fc8xDZZy/b31zztfvzb03bZWGR0fraAZwka9B8JCwxSN8WGS8PWGzgQfbb7KF1yg4F93f9SoXK/srE6xGDIsOixGkY5OV0aHRytXB6dMpcoZipiEoKmG/V53PV9/d/3zVc89PjQqu5Sf+/IN+93o946OUwgUcTHefWEz/vJ0Sxu/idbO2SuZ6Aos8BKL491AaGZmCFR3zVuUxFiZLQy5fHiRklcXAmVmglC3eGHIyuwkRqr7AHLjBRkwcvxqAp7ksZ0v6QO3urwerl0Lej6kZ06PCa1cKE9OlgMZmGtBcrYc2OeDQBYf9ed+k2att1jNVdEtXfPJQmCohgugvMbWXKxx9OLcBFAELV0GF5KIUfi8EigGiq/IPDP0T80I8IPGmxpZffZ9rMbsrwS7ftDz2ASvzOYET36L5mHuYt0FioT/EiJjoDnWgXj1nKcxLpfmWJUy5cS5AU09eGWgwRKNTHPo2GX1aowMh0UY4aFi/vzURZ/alxBJ8WD/oefDbwiUMaWCi8DB+Ivg8LiSFyJk0ETTODrGL+5/KkR1YjAgepaxJZd/WiLGCFz81zSPuOGvECYm3ZW/Nu+/g+SdkYn395H5RIUk99DqSkczq36PXPyaHS9eCrC5APh/qkMifpy4gruAmzmORKGilsd53DXc/8cvdKVDi+qgrAQcS4cyiuqMmJ0xGkuLwjt5ysJyHcCXDrqP5B7p7jmSc6Sn+3Du4Xx3Md7b21uZY6d+AZ5zdxux0YUKjOjB7Lm6JhO468zpTiSgxPbFi1Jb/y7k9GmkizVhyClT0G9hEN35BdLhhthQV4r+xYusbDtgHZdFUD80+klkXkJRMOhT0Hzd2eygJZLkGgourzi49iFYgr7nzHuKNv4AwXoMZiHEEFXDYvQCBELs+o+jZv5hBxNM5RdqAvW7AJwGJ1Bxv9zd1+Cvc4HsBEHXsgOcYOAqoM6uDuASZprlNmiJAq5PRU48dhv9Iw7i2jJU2GSc2VLICvMF787N+ksVYZ+UNb5zKWYXxoORNQEAzTCGDfG5jePgtv/8pYR6CJRjw5YC5XbwlgIA5TxUbT89Zh8GTjFxneDG73WLISgbAwB92DmMsCb0LljUBB3gh4Dlx8E3FxaZRm5jwzyq9HwdI5/mT8tn6C4GELYTe8f9x3uJmm2BAXDRckMerIWXLYO0Ad87AKnbtr0OXgxvH0OaQNRS1/rm5nrX4Flp6TCkTQn08q+oWr/JLD/VhFqw/kn5M3gDtTLVxS6gPGHvq6uu9V1d9a4hERH9jMpwE2v9+uvlN8dFdG2Ya6jLvKr12JOud9AcDrrFOwfEaFFDXn3nAopMRiFecIhRWkPavWQv8vkzgrjXIUZpDTFXsQ31998oxG0OwdNoA3gV9MquMitthH+Ia5l37Hh2gNY/0co1G1pZycqEGSnNJWnASW1htvagc8xaaau8B0qmWdYnX+zjlqMZDio00mid8toirnwfpxxNucdV3PVd0bJCfdxQ46B/HHNMv2PhXZ9bhuev2BnlIXtihUx4W4SpXpFMiaQy/Sn0+aXfdY13x0NNfe75hpjsvGtfZrshEUTci5Ab2ZbW1jrctZcZcTLUizwiYyNbInMjb/vF+mV+FzFj/Bc0uxkOurUWGvRRB6MKDBH8fJSvRrMP4iCwZWKwsW3pN3r59i0fAjsmfLfn6VMaOO58q/6r/k3Uveg3+oFv7YckovLqEZtDXBO/k6NnPDVMFJg4VEuP85a41aATiXmJVHSVNV/tvcWircXs1P/IXnTX14a10FrwtQnTgdr7K6xmPgXDx1ASVOQsHp+oyqAY8Y0oGQ7ci04xvZaakdLnu6nPfH58QnTYZ6H0XZKRo7mGAWQ8JdUBeMUes+HkkmQmcvNI16tZERpwgZdTLoljM5+w+ufrOZgEDtxloHDtEnxe4sTD+rvN88dQv36hWjzmEKOFyWX0oOXogbg8OqEk9U+r+0nKidEDB3Nu1DLBUvC2Amt21mFXPPGqCfdfXG+PKgAMuMCrvSde4dlfp/Tt1ni6q/GL6SLKTzNtCEaydAvBy5vQ4haHKBC8C7D+3vyiMGHERHolIx3AvNnMbuN2gOwHGzdSf04GdqCAXKsdiGWceofLT8n537+Wm7fFrJpLqTTd2o7RUWA6NdLaPXMM/TvkMnGg1nJzZt1LDnk+NbPvfCg+fO7j0wqHtacGy80+xqxsuCzDyGmqDj9lTcJKu3zb043V1IHa+EOJmxxmJ/euFUiIl5ViZesD+QjVG/hMnqjgkGaTn5ExzayIZu6Ch4k4G9JPPEdIR85Yzj0dI4RQJgXsULtOWihN1VJ/h/yBTPeb9L3IWUA0q0O++Svf+r8NWBQpM+ff4d2WGRfG+/qV0ssCQoOy/EP4tzScWZiyp7Y68gfTj6YzOKvkyixGFD2ajglm8OYtSJl9jAN4Tu4W+NiLFb4VvNbWqc7VI2s7O7dp5Zcuyb7P68865HYoCzvbmHUMuMNRXQPiiyQt456z1bnN742N328+Z+V8j0HSXhQPdJm7E19kEZiH6fRDLELWC6L7z1W/1UzM53xaivE1evz5wWsggi0jWhFTaPlf1Ez17ykjWTjIrhs8H0+/RjnJ4Ay6E15krXtOcB/k2GYB608TWRPxNtu3KxSVXpeRtNMi2bFu0sXqu0Q5Tmncfm2yg3wKC0HYU+SOyWsdxkqcgpSDN4YYYYiKrMIeZ/8mkCfQr9093qAnyITf7OPYY6awk64bvOMkzZJevYpeAsJdg0G9qfqAf2SqsqLR2qBFtJ2bNu+UFs2ZW1Qf3tm6f5BXvSAz/DF79Tef7gVm3N6z7gdGCs+a8wzLox0DbicogjVu8UplqEbssYVZ0+vVwu9fg3c6fRkPDDcK+vEl6vh4EO8ZkrklVC47ExJxWF24G8bccth01rHv24Tr6yJ9oOOvqbxYGn/afS95qKdnSJqycFHy3qxhdyH2px1sbzkwJCxalB7mcTUDbAkxcdXQiENdCUtu3TfIn1+jDoteb/RKoc+8+VjLMM4ydSCm8Rq6NzfzaLKtLoVn3Ll13QFNfJrM6WvwwnuqvTybKYhhy9c96Z6/Ke7YgBLbOnr6vWWEuarK5nmsGSuQvpOQcpgTfcOfXGaZpLcmkxOMZMnipCnHUlR8/rnS6dr9lX2U8Nao+iX1MSyjBI0OG2GwV7N+pVvN69Z2czFOazaK2/elf5NHVbqUlhTBskFbMBgt/CTgwnfjVd73TrUOFqpVs7cVPxSLGu7cez29DzplmWGTYyQwoMLsOflY0+qEazc8CwsLCm9qJ3s2eQGv8gchkccTSsFdFIeDMvHuAcEXPRFm2+zw/fu79yrVyHpQxvnthy6rvwcP44mG9eO7/nOXW+kW7eHHohVvLfYzAxeLAFjfq+mHrX8YHaQ1cRrAjLk5B8QTIhQ9oZM6fQVS6Gj8/oEc774lN8C12Ja9fMYoFFRD1lC1oJBh/5fJR+HH6d9u00DEmU03+aD/pDftMMG6i6Cj4x9Hz73JwbhVfuzwdPRs2K1iXeTfz/fOrOxygzz+MQMSzUwOPH906JbZc2wInp/dFBaOrsCpI8d9x3tjuApYGsqLWTR7wbZpisX96cdvSVaPKqMGYqDYeSXvcWNUlMCxMYBSIRc/TqUmkVVHj65CNLMA6ykz2JIRkxmdRg+vHUD0kxjrAbFu5vxmXZ2xcvwJXn8s9Z15fpCTcq3MLNw7LTRt5dsi14xlVS+zLSMeOKpPNK8wWl1RHt9t62Y0/zwozUUSn1SMwgmmgCQWIrQAX2JZ9sIT8n/QJIFCEknof07IFzxH9WGTipfPCdLeIjx/OakAP8mEQWgd7u+zVmtgMs2cRkGzTFbsudXiliuV33EpEc++lFVhVc6rOUquYlSNdertsqHmWmw2kl21IoucBQ0StFBLC6xNMHGZnXSl/lVY0MKeYeulUhH19Wtq0bcLepJZeNEpHRVQbxcWjd6e2784JuIHow/AS3P3g9e34upzN9pwhMX9G4bv8H4a5XfxIjFBD8y2MPwC14sQ81fJeiHL++w+2gKuDjw2/U6LanfP307eHhxcWFgO7x0Pwkfa7AoLecq9eIHDdeHXeEing+K/AvYbxEOlakt5c/OkJy9ynpPndv1t+7sw9xbwmbZkfVh38SOrm/WvTc1T5k9MYlafWotZ+i4r14GA9nXjvTRcuZhm3qkRj5ObV89+qn4BH7tv8/YIm3EskY3n3J8CkYVMl96ndk/7XO2t+kZUr+UxiBnQ90Q4GGjX00/6LI8HW/y+jfOJnLqz2NKMnIYRObICx01Zu5yHXd1+MwpMaqOo0adDCexDWQXs5dcdpMZWAYndqXUQ/4ARABGdvfuD9vcuIvAGnRWVXLynUgolopsXe9sbFhO7FPJU4rnNCtc2sfmB+21IQaqHz2xBca6213eWpwCq2z0nVwB/D0rC8wZNu/w7LesETUwJ7AlAAkBoWpe/xf4w1Jl57Qe8SwYSDLiK56LYpesyWLfdj8ziN06DBVYt+CGThoSglqL6iBQHM6cxykpvtZRlcLzm+kYakTi9ZtrXov1RDyzMgSnpo/FHkgkqk9eMnIE6LnIW2KBsaAjeeEBggds0C6DTwEaBUwLHjfg0aUCodkffiYXjIpeDupNggpVEaiGDAcoHMv8iTpbNgiFCsRSJCJgrBbWeWMTJiVS5sa8aDgGNQv8iIIPzWwza9ZGQNh9qMXJBFKD8Aqyoku7DCIAhTxhOGKFxXMnADJBfeXO1BlPDmDsEQygEBeWXQ9GYhWBgIxsAFLlSDtykzYlXXtyCFpOeLTwIeH2qi6gs83nmP6uh8WBjQ3rA06/qiEpZ/tnqN4pAICBMtQWmpATip5hTeKdLTvgHG/fQ24LL37Zi3i4NLmvn/XBlBA3Im1nedu3maF/99t0Uf2rJ0g+8S7tYWHjh/Gud523ARVeHwRn7E9GB9Bj/hLTfgThtRs8kPCYde5r59CD9ZDiZT+Fb8S1ZiXuKT56ZeVY87lU+JUNJWx7Peo0/Gr0y+aXuyfpg/Ar9cbPfqkerGjxJVHKJ15jOkOZQpmvIa6qEOPPlTJxDpgFnBX8w3yMoaAUdLIZX/AHPAwqX3K7Yyukbfm95b50+3biru5xzIQU874//jQG4JxclYrvkcr+4CPPoQ+P5zfauOFMLEpCPW8PsjJIDMamx4mKb08MK+NTXYKM1jTsVgHpaah6G5yrAbIds6Kjpny2vVkum3NtTVjoFO8kl2kZ5HUMXK7MTat5trMog4LHM12v+e9F3duzmmq97GbYdK9P8zh43q2892fXudkpSfG2M79mMh9WqlZdPpF/PXgPt3w8xGAnu/8NsmT/cpqlXsZL/tAIJiZ7lIT5pnnnJXjl1/2/cyCxxl0vtFKwIDyhNYiMQQCtpdBwCpXNovHS/c3eglfl5bwT/IE80HNl/yYBzggfXc2nnwKECOEdEMkXUuJ1bGz5DppZiZ5qxn0RHg88hNtw5ybSzi5igDt8EKRPN1tGkLCuaF1BUC6E67zjd0OdSO+Y12ND3F3OW0XiWDpz7cscUdt/m5QX6/YBPeMcoJAr1Oly/yvFGSg0051kZ2NEOvRLuo63cvw+2c5AVbqHiY/eGOmsEFTnwDXhxJAuTsOR0uaZveTu4G+byGtg6KpVnr2XZnJeDjXfrzuyVQRVHtkC0CS68cuW9UARNwKJp8+wOCwSvPkthkFxh9eWy7yx8uM95ZFvnP7Y3CC0ez2YrpThIptPZB6Vvf4wG/gGtIp8NrHqJ8woWkHBuviHBke6rSBMGUkzQQXEOWYH/iWHRQ//ulGJz5OX/VjjlDZd7z5pH76Gy8CZv+1Yt9xCu+/oMs9d8MKtucJwpNzqhcrGPTD2IxKbuX6dY1ii773wWxlhspIl2CgDr0u6YXFGsdd6lQ3zatTmL0SV1Xw/1OARZg9AJub7e16zK/U4k6h771tHyo2W3lpFeC2PTOqJaHyE1OaBpQGUh3T5dgMvMjluSvGABldhcbSOR1jZE4soyW1ObZDKRrOGpOhsXVb8qyNNOv4RIiXaqCTmfvcp/r/7XIZQ52XdW/5TAc+tWO0ydoF0cUvokORj3B3X53/4W8rDC0twYtWfiPK1njDo3vyI/VxNT6FRR6KSOqcivyP+zRmvUm6eTz2us9MnjdJeXbqBGtSiXryKAhcsY1QK9oEVgoJfFd30IiA/40BFnGxW7Z84xjbAuqG7OHmcDo0XQIjAIDMx7jPC3t0zk1UwDOsgmPW+KFrprvGbJQor4oDi4iXlQtYkd2JQoQJoYicXju+ghF9Kz0m15xm2JxsrRcFgyT86aJ7d0IOZKaOjdMsOcf76gmhgvDmj20bLztx4go4xWZZx96xgxX/48e5ekWt4d8vZGktGqYExRfuHHc89eyJsYMsvAgPrV34D3xHBCRgdQuMyPTy/aA1PeP3kyZQWvnx+f7jJf2ZGYcUTzcRfjYrcmpK1NE9J9kT75SNpTylid0ShuzBiBmHiAXrRnEbp+UX7pKFy5Ym0RUoSsXANVjeaXTr692J13M6QbfF7viM21Iz0+AY//JuAabDQzR0SAExcZCmWlI6EPaAYbA030EQqNzhxfMR6TCUI/ujAMtgbGFSQ0K2N4A986wppvM6B2xXyEptGu6hXAr5gaBqPhMOswJpoZ1kULY6KZYdZhMBoOW0MNg3ccaYCD+LnEcH5z1Cka/B3DTc194D4A5w9qjpOyBh4ZgRfANYNrxpBCAKLnK35RJJRsQRI/vqEhgZ9kkxWk52Tg7Ri41/nmnrEd/uUV/h2xZL4nbeoQRWwpocwjK7EUU2j96UVLzWOH+mYVFfDL8fiyCmtR8eOxWUX94/704sSABNDuvSdGOhuoZetpVe8+IIs2baxFEji4WvhQ9W7I79rx/s1Lr5LsPsB5zc0vtoDVIZz3IWVnO8irZ/5qeWRzreWX7fuWazaPWt4PQwxLvTCktxSQ9T2tJ+/imE/txdrtdqzZHrt3rvl/5ITnrnYsM/N/mW3m61wTzqioLic9Ccxeo2xm8Ql7qZGlvwL4ltvx1NU1MVyN2CoEysiEQsks4+sgzq9d1X8R0QsOP2Tq7ZqlMKYOr93OR/pUvh0gFrXz1bsdSDq+ftfXvxQ5eAheAS8fcNUsQw4cQpYjK6i2rtjKqGa8KtGG4pF6mv7oNPsxxsMKCsvKVkFWcWoNf8FCXizA11Ho5Hoyz5KHqMRkwomENQH3NnPCBYnY/c6xbkka730j33z2K900XYmhHrUFuY3u7doNtDmei0MTNV3BbhvD54OakY2x3m5JzrHY/YJETnhVWaS12hpIdTYM3s9mHXmCrHCLzaqrg7evEsfFJ914eoeHV6lKz9UmhBLnii037liBjWeiNkSF3gkJzegu+LiuFSMPlUuDQ42wyhCpWhFc9pv5OCmmhGVLPjFBtjC3gBJpeJARS2YTIBbEBJ3TRUIOie87foKbrJhRGlGoroIIQ/xOJRRC++7jk2VFlbHKgDm3Ueo0IJnm4hpCTQHGpLM4lhTwQ2r8wXg5CxH639Js/CB2kMC1El7jgjGAjby41yk8Cx4lJ4ShUHCWc1phhOYIi7nbUyk8SqYcpnXL596BzJBLdxjYtJ63cCFvGfH9YDxcpoPiCY8iI8/mpRuiZj0aXI3WAJVVf6BaWjIXjSa0NKobQTykK4PjgSo8fCYrUZJddGl1BxwNFGbt0fTntbXRwLQaiDUNSllVG/pr3cTMbIZ8wSl+tijhAvkLjowP/qv0kaLcfovyH/zEZ8KpVSM9k4ZBKkhPWhspGm8t/h9lumfeMTAHKig4KA3FN9trDWdOx0hdF3D721vw6/Cqa7s4Aav8ZqRL6khN18gvwMOS0UF3s/5E++y5CpHQb+5uPgZmRPNbxDVuqyBo9GC+rzWgYz1Orf3mEvNRuSJkyzGjdCtYg5yzh3ecFziOidvvKMVt7PEE0phFQpSblqMVPmDducD66wIbzCw+e3re01rcCzrx26XEHYY3gjcNzra+EelIqf+t8uNr1mR5gWen9i6/kQwgzJ9XsveUZtXlbOyfEPgV3d7l4JqiqurbN5lMudtPGRbGw4t//SogmY3rw8IO1/53OOH1a4MRzdjwvx09mLzBFpAcruIe6NifjZ+96+npMgrWxmo2rKtIIyLL5hJIX7KXXdOcNX5r/urxX0vZoUAeAjRZcEKIZykExDrPaKFSBppA54RFecLjLlITqetxND+aI8xRtEgb8euhnD1L6SFeZl3uJF0hTLGmCFfm4LtSAH3sB6lL7Pq1Uk+w56FDKpMkGPQZdLfca+E+4TeZzxLBTZvHQ9ZVTmBtcORKsomNcWlqIu1WLgAtkeS7x3i3X359PrRkCZQH5YPzx4BBOB/O2yL01sx1K2iEeRlB/wuorxXOUQ0DAmvg+2QLn3/IHOPMbpoy/4i/gv/Q9tAMhSbkFXzWAZ2YH7+sLq4m4A9+Am8eP56/PsuTDEzqdtCRqcgMK6BUwKqsHBXM45fQZdZEEgrnPh0HvIez10NJMdw4EznKLNluPfsC25x9XkqVHkSZow7psMXEw+zDRMzex82izO2hmL/Uj4f6h3oz1loyKpEupfzlIVW8Olcb7kg8wjpCdCT4bveA/T7qIIf4VEKFYbQsnBKHliea5ESgrKM8JtnyQ8XSt46XnB+gWBdBuC6Ktyg3syDT2v1E18FUsyTu/0ZeRvj4C684KDn99T0aAvHecbjH3/MSuL930ulamCfkwWYSmgxN+6RiQTRjvhQrzA/joKBMNCagmJfAM2id4CxnGgwt613CUfCreuYLlF5CLOrGKaGt+KYJDYlRTDgUnIVG4VGQkQeSww213wUxYCPLd3heMMfxPYxKDsRd4HK3X9b0kDo8AeIn4g3vZHq8E+sBcrj/8VNIIIXPPcC0furObcAzy7T0wJvRgcIivD14VgIs/uIwYw5UCAPDNAwPDQGQ7g3y7pUtN1IgqOX9APz5aliNWXraF/6Yhdm9mFpwKCWD0u9UrVkn8Vg8vVCjhylMufvsYrLT/X/G+KlhFEvJGj1oCqHIHkVcxBtFQSSIGk3JUmh1K6jcXBSFoiapvdoyKbACwWAo0c0Ws9Genug5G9mpBBS+bYen4RPQBI0rdYfAwj84p2SMhkvW979II4aLo2ZnzrSd3lwgLWMo2ourDad9hZYq9vAQux2QYAVIiu/oSRrrQXUybNi71wAnGN8baRwK15xOhj49Ga5nEh3fTUo70vPI6AJiAYF1UC5zJ59dYb7oL4u/FpmvOFuQsuLIzPa5h+Z1W3zVgo/L/Xibq05yNS30X69tFu9/7o4hyV+2+/07DseJ2dhoPk93da/V2bIF2d2F7a6S1SORu+su7CSt1hSY47FUGpXNoGCqydUkQji4Hs9TPtPj6doKRL7ccw1fSxxMGSQS79XV3TOF/1W9hBFLuWWL0oy6doXlyoFmshnxA/uD0Xv2ezmWgQ82AddLNWRhGZhWah91diqbzqoqUPChEhR4T7+2JCwbkkkhIJMBmlRGo0ulosfOxhnmxEF5O4ztxQYwCsYasAGYVnvOYbKGso+HEoqZtoD8ARX8DMN7b8LiCTqqLudoHP7IQaMQ/OZnsgmHGReZFxmH0wxG+AwmDheBah3xbmXlXaKBAV1bdw1F6GAbdeBXzsiIyxSrATZo82ZpBNjNm7DSvKHXl9wreVOCfN5lSRX/gSDOZUqslTyQ5LtDZPfQSi7L893h9HKuXqCXV7Faoaw6RQUbL1A6FCgM7gXyFoVcq2hx14ubPaH/xgsYSq6WyRAWaFHNcNfncxVMprjMSvqUDG+JCIK8bjCctu4vmvXUsLD7zNF/tmjOtpmz8UyN3/ZhtN2PfWfDvrszI7vNXtJ7wxbLmiSxYbWyxnFab7FdwdWXuBXUv1bWvSq48gq3knp78eJXEmm+8VgZjOgOYUVc7KGoWd0YVsjxlB3LfxNO3k4OT5vkBQxiU1S75gV2NTl530K0Ud3zzJOe7bu3YO312jcWC072VvfvDuoTd/AXiG4rHW+qFwgcRCtSwAsRy/dIerbjwLZQR1uG2pxbvRS6XAAZAhuvCNIO72sV93ft2iv8xqCP2+mdy/7aNt4WgRqw9VxuE46YDywFdncGuj7GQ/YP2h7Y5p6zJ7C/h+WcfWAnr3SI0w50OtzBl5OI+FzgOXldj99CH8PrTXimkaZ004sMfLx4Jnr8GH0LXs8KPPKMFWlB2y626fGRrGdHAp/nY7fQt+AgaUKCFEowBSA95UkISE90MI021ciFSTKhmebesENIYHreQ+JFj7CC9bFHLWyU9e64MRxCGhkeR3Rj7MNTln5weIQ4R4Mfw12fdyJdx409S5bgDuGTyknnXR4eFl7urTuE+4lvzDzREz+GtyW7kW1xh3GebkQwdyH9XcJD3sOE9/yp/Cu8K/kPDBD9XW6+rH3He6e9LOzkd5t+mx7ZjbFTTO52MrtLUp9xsmHgTf9irPp/wEU9qqBYDivxjBZWGiP1uH0MxsJXxrcIq6pyFyuAl3iDOvIqWhMaF3IViY6IigE3IzRe7r3yXg9RjAa+MVCNwd8z6TK7NWTmPjTkEy+9bzYEhO869A6LLVJSLBY7nL/K5obSz/OVNVKcTW52dq4NTlqjnP+5JC+1hHwsR5IrzOPejFKro25y84S5kpxj5JJnNRazZlnU8OV7neFtK/77UmO5kBrHi6NOej0Opv1B9bD2oP4B3KnIY4l14gACF4GaeZdvLvggsKsWoI7+/Hm04bvuesKvKO5J99fUbjbCw4KpbQl/DN4+Iuvf8gfXjqt4uSHia+cmofHG2+0Wbry4o/UdaZCGd1kQRzHfXebQPUamkyeJDHMwuwkZAEs+6dHQsbmLCnlWhOT38Cy7mHBbGVRFFEGP9yd7BXcGtKg8y8cadkSaRPNx483WVfWJZVxBlmGvvBfOzl+X5PxvsGsiCHb7N9kpfxDO6TngHDGn3Nq2I29DdkANnBu4KafDllo2yynigFzwZKHX/bA/vtQ4qizjtHsOwEk5LbEWJINvL0ljeX8O4cQDe2K1z725lp+2khWlB7NVjlGU5w3FiEbf2RUo0s0pShXMLs6wlD6XLIlCtjx/vgUROQDeUe7NTQP3ck9PGMAoGgwBKAow7USHaDCvjPVbxtgEoHlKM0yj9yEQbVrhoWm4wxiAYF6GdwxHBOFpcQ8z3RkTHYjXoACcADrNt/QQlgpSVE/a3R5DE6CIEB7ChT+MAA1ue2L+oUZMUnTBctNPX4OXFvTKDoQuTXj+yRRSpM1SsARKTF1nzEjgJ4do+YM8j+6IzU0ZlNb61Weyh1lsR/Hp/eS2DUUsbNdns/GKm8WTT4bPDIWbx44sSUORydvI1GGUAqaJe0fchXaJAliP7jkM6I06T4ZQ0qPpjEcALVZ+IApAUDrv7EkYYpxcQpTAMMR7AYdE7wNTTINbjGC60wSd7LN5TNlPmFccZjDWH8/ROUUuU4DMFQTfDKB0Eufe6F8mp2aZxtljPRjzzpPwDTADRhlhdLtQ4rqmci+Yfj3SpwbFdpQ7r8arKh9JPX+o3eMJ3gQ0kuPogaqJ9BlvxsI5MFoqhjFtsgoaHe5g+zfTPWGUKsuUKlse4j7U4ugOZeSWZnAAbatzHR03lhhifXH8yTjlKoUMSNeuXiMBlOFadNZ8DAUMr6PZK4YNZpLTy6yGKqQXLSb8SaeM65ZbnlY6LZlkhgxRgW/73/lxLK0KnqLXzq7A676LalZwJvWRJj5e84iaGTxL5XLfqyA8PD+/t/pTvY9Qav21fex7lQ8kwx9alIQsReZO/s5MZRZB2TLINNtqzjerNJcQtppJ4izZl5wS020S4TIhAQU2nj8Zf2KfkR+IE/ueD7h1b1bgjUVR207vJu5yC3FKuiz3qee5AE+XPDxIzwd4BHoJ3/gG60Yf7VZie5E52JCRR605weE/P7U1DnYcXOHlZLp8y8PwkLL+q7vi/+1FFRt7rn/YmpOQ+utdV8N4+4EVXkSz5XcW/q6NNsYtCihU2cfS55qU0isYZ2rlmdJZJiX0WFRsNbys7j+nL9LaKGP8wsDqGi/PKDEpYTxdg4oLuVBz/maIUxRy+3alWaE8PMPnT4Gy56Xw1wvq9JlK0yJ5WKbPGRvlSdx3eCeZrf7kFjRsNZzNUVspHeX7dW5KZFb3g5Dymi3mgu0PABv8Y1nParshfPI1wVZv+f/f24/m+gflBqwjJa2yGbt6Vjv51XLX2szdVl9y/AdGBvAuqZ1JHqfdziR7BGq3bLmQ55ZXlvzq0Ct83P+HXvvoel/1seT/bU/t+9/ntmxl7H25n8hpmcex+rDqC/45xuwjA5U/OB2nsvc0COPEsz+/Iib85NakFsouxreNB+Um/Ku1PFqw46ZlRDaj8N3U8DY1kNe9RLrPnu1uETkgRoounWPm83V81AmToQhTO4pXkxevlDqL6ufIz+c7l3jN9+LlUtVUs+Jgr2BPbYhXCKeT3kCvE+JgvWvKjbFGQ1AhfZJut8mL6uVN86ZOpaO2Zra2prZ2Znb2vWuNpCPdHAHjK53xJ8Od08phoLgymIBwDVyMcAkHIcAynvFawpRRYvKXLsAdpt+4m+mH4lrwY4wb9BJjSyb2BRJE/S9n6cnVlGqyPpF2iDRjPGPyAhBz/7ixiXHQoA2rz64Xeh8jYqIRy5RmRrtlStfytTx2fpqM+JD90EiBeEBAdIYmJVo8rr/FpXJPao4TcVS8GdV0HHFmNCDZ9frIK6VrIi6vjqh5aD2ap67iFEqSCTi9tn1JiN7oYecJnC2e7EzG2+J6dk1yfFCYk8w0AqDIcQEAxUh+tGuTQ7n9kqHMZ+x1PIJPjl+3N+Qaa3vzZp2uZgGN7eSzWFu3uo1yWw/DF0H2dAIngZZNS+DGGyRAOY2Rj3/aqTL6YRFjmQw0Jj/M1eYuwHz+/GwdPZh2BVdQd7leiwd9G/DBJqGoclR+GwVT9TftaWDo+ZL8yNiYpE1prCpNPFrFVjHLjarNQocsebPpaZQEb9Z5S9OJz27HzKbW2LD2CNYrjT3XvuiS+rw3kiG0zyFvCwd0gsJ6kcAYVdBBwXb5BWXEOgdFXY91o/TOorX+3EKzSDThpzPyb25sCk0uKylJS1mcAea/wkESuoQmAaHxppAEJDXQPbOjqB8/UD1/5MfPowhgPFFHAOrojx9HUZox1NMnyBj606djqIJ7qgJkdNyBajwjsMpFEWLX3h5iq3TWZgYOgh8BR5GfP7Xw3YKWgom8oLQUiYUiOXuJxHtZ6pIcb3HaMk+Id1xheNzf3AVm7Ql4H9cD2z33eB8PcL5FrN5zrJD9W6of2XJuaIn0I0r/YHdlGwiws4/ZQ/90YkWpdFvCy6ez2s4uWoX6KCc3GrhfEKOj661Z7hnC9NT2jRpRpJAuo9Ms1ilzbZQwF2YfEcIC2EjtOlBOZhuJ1sSNZnSpbYP1hGxEJrSCjVgnTv2k5cY4fIYopcuq68nPFkHAi16H3epCk2JdVUQDUfW0bvrGBfWFSSmt7ilRZVARXbE0qctW9VbnncVVK1La5Ji7sU/H4Wqdt5bFCoODEcQzQv5fV+B1XXjTKHxuYRgrkt5h03hzrNQ1sBgM1RBc6sCNCkVuV6ju2YJGcBNlzSBf20CZpAIjCaeeqyqeqqoHV1EWRMYlDTvGOfS6pOZWLbisk2UcFzcVO47nQ2vLOdnHxIxjlP8bkduLjJVF2atsllmfJwof3wKyP310OisVM4TrUlydqiY+tu56+9DyVp3L8VcbaJNHdIUs2m/KN73648esFou6G1bcVB1pktHZcHoD4wRRF85znvBrHEez540cgehtaHRl1MXupe5b6pPqMbla9qb3trXdCeff2622hTtRaERiPtvFJH1+q7Q3jEO+9JbTIZ9z3CzK6C+GyunZPnVuEwnB/tawg+PZqUvKjKoc1TrbJ44iXb1w37azNyY3BQd6Af+yErlD/ZdBTbKBb4t2wpT9tbhAx86TvzzxvwbVZJQQI/33RvqLM86u5oX09tsYv1aGUGX7SOyrb0BV/7XqNivybNNffXX/1hHj/+38d9PyrosQiPPrG0H+LXAw9mLkH6bapZuYoNCxHkHsIFqxEN1g+tnOiLfgoLfDHXQWkw9DIbLsRlvLUktW1J6lkqigBI+Nf4fUGzVvFp7qVJAEFXb/BsGVWnyADCWU/bXDuGmvj/Eq2WT9ov2F+b8rGN9lp4Hk+pueWnexGNxzbdS1j6ikYu0R8kT/BPmI8Y6wU2W7toURZygcpRLWsyXGq+0aBjo6age8Go0l7EpEHuzx5HEheYZMwdYUxkQtTRGmNA2IBo0l436sUTbL+s9B9sD6nBZ/vBbv35yzvjS9frKxLiXG8OfflGUMuVIoz1iUjGXkf/ZGLU1OmBLXdnQIa+eQZ0hS0gx541KtL60sqnR9TnPXFCYozPCxb20nuSz2qNTV+WM4q9+hj+WSxRqzH2OFs8fmhLP4JGtUQrEYmxmrzf4gvyIsk1NN2fB2DmJnmMyArGHibC9ZY0361P5h8gD56YH01nahaasg+FZsXCu+N9m0NyXlucp2JVcXcPokgfjTkafTxmp5pY4kAoZ+c68Lr3SFyvZbYlKfqcRkfmwcKgmAokVQU9u5SqdqKpSZV9wjsNsiO5UmgO1MKW6R2dpSls0WJwP8NVVXCC9fBhclcFxI5GUFWGFJ+Xp2lToiLExvNMPWq1Qx4Xr2Y2mL0B9exeYKuOg4UUCilhfLgkNQvoErzHltswd55isCfVHBIUiconjFwdr/ag9dORRkzhv8VzoXdOgHQR39QW4Fw82VUcG0sn7T8ccE3YxO/oPh6gZIMiMxSQ5jYrE6Ql15mzoHlTUi1GTHltXu8K/QgXu6n1zB9pASDgIo3RaR8legxIgIC3OMeATcMtW6K5bBIcdKrv/nNa9xgqRWmJefGFSLOET1uarC91efv/SzCLPzDIKjUEHePJhpz4mwqxAnqa4n/TgjZXJPn9ososPoMi6eEyvE7eRi8YM3jsO7P/x7GL0X+foecxDe8/G/Q8/pCP427TnxnQ6R04TRQxN0bnISz64iAkGlybhMuH6ISZxAAFLOQIwVGFBRJyeJ9z7hMew5NG+pMcLxprkhBKT/LSMWg725AI3GE0OcPu4mPExcSb2OQnl6mYVFvHx+9X1h1ZHXLdWo5wyEsIi68p9bz+EaL1PP8ZvuhsANJ95O2KJEunxmm/C7d5THTiobfrHAJyUSwSFusEI1Yu/vlLMm/c1GOFleTwtld94Jytu/3XYeW2cw4AGvUGMb66n5CWdXB0u0Ie684K+9MJvz96iEtAAF8xcgHOjUDuaF81JE+NqWg3yNhERCJA+BvswX7kIhZ2m0pzRXgqgvhrtoPWMWDAEEYe6nD9JP7+TEcnO5p2likYgr5vyHFqIyRRche7yNqSBeIHmsQSny6cbbRTASwlJOFXppV9DHUYfPWilc1ZRlVfjKjVhFsKR4gEa/SD8VgmGLcdZV0Wy1ycXJtV89hS9sypNvCYcFFafsrz1b/QW1OVYtxpzZFJg/VSi8A/UvQxsHB+NYKKVEV8HGhJzqflqhCbhwTDylyDYnpTQKivJMJyeTEkzaqM+Uir+9XqKEF6Uo7Ve/p2XlMG1EV7bQwz7YKqTQtBNXEV+cxoUtkk1ZaBYqMurpF4UyiMvswVUDMV+xG2sEx/lBp/4rKQxRWnl7LCzTYep45SI0I1bE0XOammTS8jQv7abNhuL0yxYwN604vgLX5NCuC5GWi7OrEXst7FS8xi98ctoqkicuNmzexJd8f7v6XTBlC//TZy1KSoDKJ+eB7Kwyacldku3IR1A0WxQvW4DisItE2aWiawdiUSxTpn/MScwIDS4ve4pGSXXCiaGbaF90GZZGuOGS07UUxX95cEUNh0+wRWj8c718gBLRacJThIuiG0O2q+q/fMmIEBbW/fS36a56e0Qqc3jYIUASBGj6swPFTpdMHNIWockoyXiE1qHHhwPt5HDSNgh4GIe1kFTURJLl8DgNOIU3pQET6Pbmy56n4JmtKJaHjvMkccZLRjAqOO2QE0e5mtDo1mbWXlgQTBDnjthtJRxuNcoq8xRxhCMH11MU1kOv4xww8mHiF9d20k2nETLY88/jiIe+7bUEuH7pzVCv8NWVBAUm66yVXdW2hGVEzJU/s+CM1mBkcqQcKOzLUj3zDkNx2/4yRj7bhvBsMul2sIvtjB3ul8BO1I6zF00b24mkWG+xjmf8kFlxxkMgmMY4LvYILszKquPGRu5Hi9UX0bBQ4+cpVNNsHt7MwR1F5z1BeLSeX54vymQQDS1xUP/5VPHULtbGVQoh7sL4R6jke1LM6kBYGgFgIVbiK93ajNCBqkT8v7U4oRhiwYNXOJ841NU87ErkyGOu/xNOzlfEo4H/dyTynPmLDmM1jH2W4p3nxIHTHM4sPgIQmkgsworaRTShHedoI8KZni8K5x4ooDGhA+OcBs6SL2IbbvAPmENDEOjXdxpHBqNCISQ75ey9gECGt/+/bp0ameCY9+acKtkUHPfvpnlVhGVqquKFvd1GpzuKlWGkD0nKNBttaPJ7lgIVCnOPXSmvmBnTpiT5NIapUNVib9mOpagVo8TlZt++oJJ+kCXv6f2LomA8GebeHuI82Js0kEXaV90SccpBadPlAc0u2yiza0xasMi++dB5mprGjMv1z7W9xuRz48UVIevaQttzQx3xTXwCF8jBMW8JI3heUkWJPFbJPP/mcu/kucddPJ9jjAhykmHIMxUWi97erwj1SLHNneXJQ6RIcYJM5ZFK2ZfMZamlPnYZ9RFwfcXzEheKM8pDjcoeVWZxf6ilssuiWV6IgMuDrVfQQ9bGBRUYvzwunvtDzpC6rNy92yP2JE0KXffIedtZsGCWZ8hNGi9e6Q/N9wyGODKkCZ1ok1vARSO0Q3SElc+JiKSxgC2k7e5SYESrd9PMK/JRE7SuhQwlF84e5ckT40yVaAwj6s4+kfTUbppZRQGcjRoZZYg8o+3rdo7wGze0+6OhfUR12EkB025uzsgNd/HyGgThcJqvAx7aHas5EtikNOFL/o4uiwoMB4XADg4oQfIVxqBGkqSic+gMk0WxHfz/9e4YEmkVeh+pKZRmaj+rN2EBVojzKiqCvUyCgFpW/ybfA036U4W1qX8fbJODE2XbJM3Ka0Nool5zHkVDq3iLy+bqrnuZuH7CZHNQXGVely1J0/9LdNOK6oQ1EGeVp6flckyZAovHnLBgB5mu9MoT56SIcuXcWKmN/uw/cxyduDKmbc7xHdtGhiziJzPsk/gNNvWhdWxEhMJmPRPy+DklVn+fBmiIJ9y7V8w6zYz0tdOxyuJ+xGMJlH3Ncgx3Xj0Khk2ilagsVGMPLHCg0/ttY9/l2PR5xJGIov9e01Bg7nIbxfVY9+/AOyc7dzh11qbU4dxZqambij8B9N5KGUKboymKi/uH28BvOLWlmbGE+rpCOc8xwmiLy2ihIdJZL01c4aJuj1mRqHaJaY9+W9sYBb7PyZkh6arwuxbl1hVbeqpoleQref5aGzmr264zrXo8TMT/3jFPKEQQTVI+D8UVsoYYQh5Kk0Bn0+KUCEwwgYtnifj/tzdxhAgcm6jlITz104I5RikEn/raadY2d1SIRLAWuF/FRTOH6MK5jiYeghD4cDF6IVvEI9TrgXtEzARJVo0ZaI2SBjM5ce5CotP++Fvm0fkqRFwGU5ZgsYfpHB4iS4ARBjc2mMZuTHuTx0OY9zlGCo6NiQrmCxnwIJvGhRB+SFUCHMtgvZE3O4mZzHc8LCJk5XocigftMIK5MIqXpFWiNFzWPcV/SyvNb8X2Ura9d2fAMwaNaAeDEUXuUm2+/4EQQ7E0sBjFhNeRFIS45CcgGjr7jbj7fZSSe/PuAdls/QJOT5A02mO5emGtalzr9/2sd87piAK/rgTm05nLsVmekl1s7DxFXDxNwZTdocUv3vUr5eWCT1mJwFhwtDQt0tk0KM19TpK42vB373x47PnPFo7j5hO12KIRQ6Bh+ALroJdpltecVImly4tAWt1CC+D/ojnRPvSMXfASUeIZUVLVDr6dCDdGaBCGRkefOQNsUyl0CpHMM0+dKPQdAzIyfZBHyTJ6ImuCa86gmCGLMhbV8+SqPyiMnb/2x+I4Y9+rMYX2ccEx6lFpTHBcXQIu277afjjRrCfKMjGGv+D4ixwyg1JO5pGNDOmj1+gUbiJXTNBJTp/+CRLKSfBi6tLlE1wK4vQkPh6SWvd5n3yKi7fuDiCp4zTwH4LucDaFRj20HHivbwGFergPvwOx+pEFZ84sEI6xAGtUOM9cZ/ZF9DzS3y2emfl8B8wgGIcOqGebqHd8qNKMeUOTGmsm3AQtIgWA6CIzAOpjtpBHlTMO8ZU9vb4muUkyU9tFOyawrAyREe2owsWaGscSgygwdNMerk8/aevh7b7LDuzkOfTZe7iVy5YSmh6YrHPGsIdycHinIkQ5cLV6hramCqmrDIaEZLmUm01qR/RDm1AVAh/aEgD+rC+OO1wPnBFQ2a2Opkmyjl033kQ787vVhoqsjF7V56qMvll/tc7AyBzA0OU6mbyUlq9oI8Zs6MhqU2+3R5hLyBttopj5v416T0mUw1yAb6lk5yGSG4ZGrZtiTBJWRf1gV8BAnRjjsQn80MoNWWUxzsgKY3HQSD2tnHecn+uBAUGVXbaJDFV+oNJOGOkzvlJOuFXOucjXRXK3djhYzj7nJC8AiE7XHeCXLmUzol1gaio5MbQ/G4VrFwyvusopuzh2GThZX8t/OwK/hhX8HKrDB60Vop0hcpm8NnTLUQLxKX31H94RUjJCPj4kM0ctH0JhKMp/+GHS9XBZO6mGD7lxKXK10jTeoLZpsksbTNSmoZ31YsjxCZOylCfvVmachhkykIp0ZmYo5cuhztQFWRXaiZK5kI8NHT7ax1uEog14umnObNcjS5xUIQCYa7VuFTqT6v9NYRSIxe2TXcQnZ2o3x7IcwIBOBwD8I5KbEAyt9v+X/nh7hOD50crY3RHEZ4OZ2rutU90eJFbvc1sBQV9pOBkyr/0Yb/O7++365F9kJSqugpr5elMZOgy8ymTik9eUH/KrER3u68dvyBhE5Bl3eM4GjPBaoAwLSRJYZj1W0qpGXH4cl9oDm+BX6OE5Zs8IbYSHQ7BMriH8j485+rDaMy6NUYpVSdg625C0ONuIMiaM9x0824R18mxTypWzLR1Qdt9WskViEFtAiLQVnQ2C67Mb3i9MZfueMcO+92dznX+i4MmBs43XATOgtTt4PrPSgHrCJq+3nIyw1eSUTa//DV0MeiAjo3v6hcNIwjmUz8fHX5FxMOEzzk5Nk83tIG1+jTwwBMm7QW5optLzyu7lfLY7HZRG2oesNKCesMnrLb0yGWH7zqdM+P1/QxeDHhS3enDlXziM9JnnUD43SLzK3OhWQ6HH2amJKDZnxiBtnrlSBUNSkbyTN7qhmUrfwehezmQl21Qu3Wfaqx2Zte824+YLNoqAAgMOAiQo0L9NHQ4QHHhoIcSUS/22xPJk+BLQX8r5Yrlab3a2467de/bu23/g4KHDR44eO37i5KnTZ86eO3/h4qXLV64WiqVy5XukLPVG8+X/DXe6vf5gOBpPprP5Yrni7G++iwH/G3VRU2NoQCwOD3HjTqCFETp6hifGw91T6qp59/GwGp2m7D60rPTWp8U3s92xSgfvu3iCXdmc3LTIb5WhAMPa6V+th38Sp7etrU5G0xum2k2AvrR1cC1+pNsOy4SAk2WRRdJJ43nZgeIRlrD7MCU6Lf0CUNlo2aRw90Y5PDb5mG7DpaxTFCoRRh643QXQzZBmOWmhHIetUUF26Rqni4aqMqMhyUjVQ60xYU+tlPFitd3TYdPqOqaKAigDRh/x1Jy61q4ZjolA10xMZYmn8SQazU55kVFnQyn+ivP0qvmNXNoBnABpJp0OfAFEuGZAl7hEz+7pLuySYEd81P0ZJfSFCy0TSp0jk6B9vCHwwd2TT3ZQm1MkH09DQjbq1/ByWZ7uBtICcsVjWG4fSbPx0cF8xVdZ2VNgk6BXGTwfSKn2sJYJFVvzq5ufZN57JxVmhl1kFJerwRqvZHc7+EZ2jeZG1kCF2Vw0odUnKDPKhm+llzLSIOxOy1KDYyFmOROkSQhopve15TS1yL4L/L5bzYldHik1p2X0ZHihavYeOrO//jFk9e5x9NhXaMKFnxMX6d9YtqEdUSaMDPj2ehe7eRVA2BkH3CDg8Vyt6dMcX3ncCbvjpWT4YlOndHMwnQabjqzmq5XbHOLKHX38uNKhSmiQPS3rcZBrMYFsSK01n61Rk8MbtqoIAAAA') format('woff2'), url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.woff?t=1575558014483') format('woff'), url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.ttf?t=1575558014483') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url('//at.alicdn.com/t/font_1546140_sw4m5ivcrg9.svg?t=1575558014483#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { font-family: "iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .iconshezhi:before { content: "\e690"; } .iconguanzhu:before { content: "\e608"; } .iconxiugai:before { content: "\e675"; } .iconxiaoxi:before { content: "\e669"; } .iconhome:before { content: "\e60f"; } .iconvip:before { content: "\e620"; } .iconguanzhu1:before { content: "\e60c"; } .iconhuxiangguanzhu:before { content: "\e665"; } .iconjifen:before { content: "\e626"; } .iconvip1:before { content: "\e611"; } .iconleft_bar_out:before { content: "\e602"; } .iconmima:before { content: "\e61b"; } .iconzhuye:before { content: "\e6ce"; } .iconshezhi1:before { content: "\e60b"; } .iconhuiyuan-copy:before { content: "\e607"; } .iconwallet:before { content: "\e674"; } .iconshenhe:before { content: "\e612"; } .icontuxing1:before { content: "\e601"; } .iconnaozhong:before { content: "\e616"; } .icontougaoqingqiu:before { content: "\e63b"; } .iconguanzhu2:before { content: "\e64b"; } .iconzijinzhanghu:before { content: "\e613"; } .iconyanjing:before { content: "\e62e"; } .iconguanzhu3:before { content: "\e64c"; } .iconjifen1:before { content: "\e61a"; } .iconmima1:before { content: "\e642"; } .icondaishenhe:before { content: "\e625"; } .iconzijin:before { content: "\e676"; } .iconrenzheng:before { content: "\e623"; } .iconxxxxxx-:before { content: "\e609"; } .iconjifen2:before { content: "\e795"; } .iconshangcheng:before { content: "\e90b"; } .iconbianji:before { content: "\e6b6"; } .iconjifen3:before { content: "\e661"; } .iconchongzhi:before { content: "\e82d"; } .iconyifabu:before { content: "\e603"; } .iconbianji1:before { content: "\e604"; } .iconzhengque:before { content: "\e655"; } .icondianzan11:before { content: "\e600"; } .icontougao:before { content: "\e629"; } .iconcuowu:before { content: "\e637"; } .iconshoucang2:before { content: "\e605"; } .iconmima2:before { content: "\e610"; } .icontougao-morenx:before { content: "\e63a"; } .iconjifen4:before { content: "\e606"; } .iconhuxiangguanzhu1:before { content: "\e686"; } .icondianzan:before { content: "\e60a"; } .iconxiugai1:before { content: "\e62a"; } .iconzijin1:before { content: "\e650"; } .icongouwuchekong:before { content: "\e60d"; } .iconlipin:before { content: "\e60e"; } .iconshoucang:before { content: "\e614"; } .iconicon-:before { content: "\e615"; } .iconhuxiangguanzhu2:before { content: "\e68a"; } .iconyanjing1:before { content: "\e7e2"; } .iconzhengque1:before { content: "\e6b3"; } .iconrizhi:before { content: "\e627"; } .iconshoucang1:before { content: "\e617"; } .iconyituihui:before { content: "\e624"; } .iconshangyibu:before { content: "\e786"; } .iconhuiyuan:before { content: "\e618"; } .iconziliao1:before { content: "\e736"; } .iconxiaoxi1:before { content: "\e62b"; } .iconshanchu:before { content: "\e619"; } .iconhuxiangguanzhu3:before { content: "\e64d"; } .iconxinxi:before { content: "\e628"; } .icongouwuche1:before { content: "\e61c"; } .iconnaozhong1:before { content: "\e68e"; } .icontuichu:before { content: "\e74d"; } .iconziliao2:before { content: "\e664"; } .iconshanchu-copy-copy:before { content: "\e61d"; } .iconyanjing-guan:before { content: "\e6d7"; } .iconxiaoxi2:before { content: "\e670"; } .iconxiaoxi3:before { content: "\e67a"; } .iconmima3:before { content: "\e62c"; } .icontuichu1:before { content: "\e636"; } .icondingdanguanli-:before { content: "\e61e"; } .iconyiwancheng:before { content: "\e61f"; } .icontuichu2:before { content: "\e621"; } .iconziliao3:before { content: "\e622"; } .iconwuneirong:before { content: "\e62d"; } .iconweidenglu:before { content: "\e648"; } .iconweidenglu1:before { content: "\e62f"; } .iconcollect:before { content: "\e630"; } .iconbingliziliao:before { content: "\e631"; } .icongouwucheman:before { content: "\e632"; } .iconfensi:before { content: "\e633"; } .iconchaoshi:before { content: "\e634"; } .icontuichu3:before { content: "\e635"; } .iconzu:before { content: "\e638"; } .icondenglu:before { content: "\e639"; } .iconkaifazheshequicon-:before { content: "\e673"; } .iconmima4:before { content: "\e63c"; } .icondingdan:before { content: "\e63e"; } .icondaishenhe2:before { content: "\e63d"; } .iconwuneirong1:before { content: "\e667"; } .iconziliao4:before { content: "\e657"; } .iconshangcheng1:before { content: "\e63f"; } .iconfensi1:before { content: "\e640"; } .icontougaoshibai:before { content: "\e653"; } .icontougaochenggong:before { content: "\e65c"; } .iconhuiyuan-:before { content: "\e65d"; } .iconshezhi2:before { content: "\e641"; } .icondaishenhe1:before { content: "\e643"; } .iconwodetougao:before { content: "\e644"; } .iconyanjing2:before { content: "\eb76"; } .iconyishanchukehu:before { content: "\e649"; } .iconzhenggaotougao:before { content: "\e645"; } .iconyituihui1:before { content: "\e78a"; } .iconyifabu1:before { content: "\e646"; } .icondaibandengdaishenhe:before { content: "\e647"; } .iconbianji2:before { content: "\e64a"; } ================================================ FILE: static/common/user/css/reset.css ================================================ /* reset.css */ html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul,li{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0} a{text-decoration: none;} /* reset.css */ ================================================ FILE: static/common/user/css/user.css ================================================ /* * @Author: shu binqi * @Date: 2019-12-04 22:22:03 * @Last Modified by: shu binqi * @Last Modified time: 2019-12-07 18:30:09 */ /* 主题色 #007bff */ /* ---------- 会员公用样式 ---------- */ body { background: #f1f1f1; } * { box-sizing: border-box; font-family: "\5FAE\8F6F\96C5\9ED1", Arial, Helvetica, sans-serif !important; } .container { max-width: 1200px; margin: 0 auto; } .hidden-md { display: none; } .hidden-sm { display: block; } img { display: block; max-width: 100%; } .fl { float: left; } .fr { float: right; } h4.head-title { color: #242424; font-size: 16px; font-weight: 700; text-align: center; margin-bottom: 15px; padding-bottom: 15px; border-bottom: 1px solid #f1f1f1; } .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .clearfix { zoom: 1; } /* ---------- 会员公用样式 ---------- */ /* ---------- 会员公共头部 ---------- */ header { height: 55px; background: #fff; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); margin-bottom: 20px; } header .brand { height: 55px; float: left; } header .brand a.logo { line-height: 55px; display: block; color: #242424; font-size: 14px; } header .brand a.logo:hover { color: #007bff; } header .user-center { float: right; } /* ----- 未登录状态导航 ----- */ header .unlogin li { float: left; height: 55px; position: relative; } header .unlogin li:first-child:after { content: ""; width: 1px; height: 15px; position: absolute; top: 20px; right: -1px; background: #ccc; } header .unlogin li a { color: #242424; font-size: 14px; display: block; line-height: 55px; padding: 0 15px; margin-left: 5px; } header .unlogin li a:hover { color: #007bff; } /* ----- 未登录状态导航 ----- */ /* ----- 登录状态导航 ----- */ header .user-login > li { float: left; height: 55px; position: relative; margin-left: 10px; } header .user-login > li > a { color: #242424; display: block; width: 55px; line-height: 35px; height: 55px; padding: 10px 0; position: relative; text-align: center; } header .user-login li i { font-size: 28px; } header .user-login li span { font-size: 12px; color: #fff; height: 20px; line-height: 20px; border-radius: 10px; padding: 0 6px; background: #f4523b; position: absolute; right: 8px; top: 10px; } header .user-login > li:hover > a { background: #242424; color: #007bff; } header .user-login li img { height: 100%; margin: 0 auto; } header .user-login .user-icon:hover .user-menu { display: block; } header .user-login li .user-menu { display: none; position: absolute; top: 55px; right: 0; background: #fff; width: 160px; border-radius: 0 0 5px 5px; overflow: hidden; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.15); z-index: 99; } .user-menu li a { color: #242424; display: block; width: 100%; line-height: 35px; padding: 5px 0; position: relative; text-align: center; } .user-menu li.bt1 { border-top: 1px solid #e1e1e1; } .user-menu li:hover a { background: #007bff; color: #fff; } /* ----- 登录状态导航 ----- */ /* ---------- 会员公共头部 ----------*/ /* ---------- 会员公共内容 ----------*/ .page { min-height: 660px; } /* ---------- 会员左侧内容 ---------- */ .user-left { width: 220px; margin-bottom: 20px; float: left; } .user-left .user-card { background: #fff; border-radius: 5px; overflow: hidden; margin-bottom: 10px; padding: 30px 0; } .user-left .user-card .img-box { width: 100%; margin-bottom: 15px; } .user-left .user-card .img-box img { width: 80px; margin: 0 auto; } .user-left .user-card .username-info { text-align: center; margin-bottom: 5px; } .user-left .user-card .username-info a { color: #242424; font-size: 18px; line-height: 24px; font-weight: 700; } .user-left .user-card .username-info a:hover { color: #007bff; } .user-left .user-card .autograph-info { text-align: center; color: #808080; font-size: 12px; line-height: 18px; margin-bottom: 20px; } .user-left .user-card .btn-area { padding: 0 20px; } .user-left .user-card .btn-area .btn-default { display: block; height: 40px; line-height: 38px; text-align: center; width: 100%; font-size: 14px; border-radius: 5px; } .user-left .user-card .btn-area .btn-release { color: #fff; background: #007bff; border: 1px solid #007bff; } .user-left .user-card .btn-area .btn-sign-out { color: #666; border: 1px solid #ccc; } .user-left .user-card .btn-area .btn-release:hover { background: #005bbd; border: 1px solid #005bbd; } .user-left .user-card .btn-area .btn-sign-out:hover { color: #333; border: 1px solid #333; } .user-left .user-list { background: #fff; border-radius: 5px; overflow: hidden; padding: 10px 0; } .user-left .user-list li { text-align: center; margin-bottom: 1px; } .user-left .user-list li:hover a, .user-left .user-list li.active a { color: #fff; background: #007bff; } .user-left .user-list li a { display: block; color: #242424; font-size: 14px; height: 45px; line-height: 45px; } .user-list a.bt1 { border-top: 1px solid #e1e1e1; } /* ---------- 会员左侧内容 ---------- */ /* ---------- 会员右侧内容 ---------- */ .user-right { padding-left: 240px; } .user-right .user-tips { height: auto; background: #fff; border-radius: 5px; padding: 8px 15px; margin-bottom: 10px; } .user-right .user-tips p { line-height: 24px; color: #808080; font-size: 14px; } .user-content { background: #fff; border-radius: 5px; padding: 15px; margin-bottom: 10px; } .user-data h2, .user-content h2 { color: #242424; font-size: 20px; line-height: 30px; font-weight: 700; padding: 0 10px 5px 15px; border-bottom: 1px solid #e1e1e1; margin-bottom: 20px; position: relative; } .user-data h2:after, .user-content h2:after { content: ""; width: 2px; height: 26px; background: #007bff; position: absolute; left: 0; top: 3px; } .user-content .login-tips p { text-align: center; } .user-content .login-tips i { color: #999; font-size: 200px; display: block; line-height: 300px; text-align: center; } .user-content .user-tab { display: flex; flex-wrap: wrap; } .user-content .user-tab .num { width: 25%; padding: 20px 0; } .user-tab .num a { color: #242424; } .user-tab .num a:hover { color: #007bff; } .user-tab .num h4 { font-size: 20px; line-height: 30px; font-weight: 700; text-align: center; } .user-tab .num p { font-size: 14px; line-height: 20px; text-align: center; } /* ---------- 会员右侧内容 ---------- */ .user-data { background: #fff; border-radius: 5px; padding: 20px 15px; margin-bottom: 10px; } .user-data p { border-bottom: 1px solid #f1f1f1; margin-bottom: 10px; padding-bottom: 10px; display: flex; } .user-data p span { line-height: 30px; font-size: 14px; } .user-data p span:first-child { min-width: 86px; text-align: right; } /* ---------- 会员右侧内容 ---------- */ /* ---------- 会员公共底部 ---------- */ footer { padding: 30px 0; background: #fff; } .copyright { line-height: 30px; } .copyright p { font-size: 12px; line-height: 30px; text-align: center; color: #2c2c2c; } .copyright p span { margin: 0 5px; } .copyright p a { color: #2c2c2c; } .copyright p a:hover { color: #007bff; } /* ---------- 会员公共底部 ---------- */ /* ---------- 会员修改信息 ---------- */ .user-form .form-control { min-height: 36px; margin-bottom: 10px; display: flex; } .user-form .form-control > span { display: inline-block; color: #242424; font-size: 14px; text-align: right; line-height: 36px; min-width: 100px; } .user-form .form-control label { color: #242424; font-size: 14px; text-align: right; line-height: 36px; min-width: 100px; padding-right: 10px; } .user-form .form-control > input,.user-form .form-control > select { width: 300px; color: #666; font-size: 14px; line-height: 36px; padding: 0 10px; border: 1px solid #e1e1e1; border-radius: 2px; } .user-form .form-control > input[type='submit'] { color: #666; font-size: 14px; line-height: 36px; padding: 0 26px; background: #e1e1e1; border: 1px solid #e1e1e1; border-radius: 2px; cursor: pointer; } .user-form .form-control > input[type='submit']:hover { color: #fff; background: #007bff; border: 1px solid #007bff; } .user-form .form-control > textarea { width: 100%; height: 120px; line-height: 24px; padding: 5px 10px; border: 1px solid #e1e1e1; border-radius: 2px; resize: none; } .user-form .check-box { line-height: 36px; } .user-form .check-box input[type='checkbox'], .user-form .check-box input[type='radio'] { transform: translateY(5px); margin-right: 10px; } /* ----- 密码查看 ----- */ .form-password { width: 300px; position: relative; } .form-password input { width: 300px; color: #666; font-size: 14px; line-height: 36px; padding: 0 10px; border: 1px solid #e1e1e1; } .form-password i { position: absolute; color: #333; width: 30px; height: 36px; line-height: 36px; text-align: center; right: 0; top: 0; cursor: pointer; } .form-password i.iconyanjing-guan { display: none; } .form-password i.iconyanjing { display: block; } /* ---------- 会员修改信息 表单 ---------- */ /* ----- input单选,多选,开关 ----- */ @supports (-webkit-appearance: none) or (-moz-appearance: none) { input[type='checkbox'], input[type='radio'] { --active: #007bff; --active-inner: #fff; --input-border: #CDD9ED; --input-border-hover: #23C4F8; --background: #fff; --disabled: #F5F9FF; --disabled-inner: #E4ECFA; --shadow-inner: rgba(18, 22, 33, .1); height: 21px; outline: none; position: relative; -webkit-appearance: none; -moz-appearance: none; margin: 0; padding: 0; box-shadow: none; cursor: pointer; height: 21px; border: 1px solid var(--input-border); background: var(--background); transition: background .3s ease, border-color .3s ease; } input[type='checkbox']:after, input[type='radio']:after { content: ''; display: block; left: 0; top: 0; position: absolute; transition: opacity .2s ease, -webkit-transform .3s ease, -webkit-filter .3s ease; transition: transform .3s ease, opacity .2s ease, filter .3s ease; transition: transform .3s ease, opacity .2s ease, filter .3s ease, -webkit-transform .3s ease, -webkit-filter .3s ease; } input[type='checkbox']:checked, input[type='radio']:checked { background: var(--active); border-color: var(--active); } input[type='checkbox']:checked:after, input[type='radio']:checked:after { -webkit-filter: drop-shadow(0 1px 2px var(--shadow-inner)); filter: drop-shadow(0 1px 2px var(--shadow-inner)); transition: opacity 0.3s ease, -webkit-filter 0.3s ease, -webkit-transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2); transition: opacity 0.3s ease, filter 0.3s ease, transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2); transition: opacity 0.3s ease, filter 0.3s ease, transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2), -webkit-filter 0.3s ease, -webkit-transform 0.6s cubic-bezier(0.175, 0.88, 0.32, 1.2); } input[type='checkbox']:disabled, input[type='radio']:disabled { cursor: not-allowed; opacity: .9; background: var(--disabled); } input[type='checkbox']:disabled:checked, input[type='radio']:disabled:checked { background: var(--disabled-inner); border-color: var(--input-border); } input[type='checkbox']:hover:not(:checked):not(:disabled), input[type='radio']:hover:not(:checked):not(:disabled) { border-color: var(--input-border-hover); } input[type='checkbox']:not(.switch), input[type='radio']:not(.switch) { width: 21px; } input[type='checkbox']:not(.switch):after, input[type='radio']:not(.switch):after { opacity: 0; } input[type='checkbox']:not(.switch):checked:after, input[type='radio']:not(.switch):checked:after { opacity: 1; } input[type='checkbox']:not(.switch) { border-radius: 6px; } input[type='checkbox']:not(.switch):after { width: 5px; height: 9px; border: 2px solid var(--active-inner); border-top: 0; border-left: 0; left: 6px; top: 2px; -webkit-transform: rotate(20deg); transform: rotate(20deg); } input[type='checkbox']:not(.switch):checked:after { -webkit-transform: rotate(43deg); transform: rotate(43deg); } input[type='checkbox'].switch { width: 38px; border-radius: 11px; } input[type='checkbox'].switch:after { left: 2px; top: 2px; border-radius: 50%; width: 15px; height: 15px; background: var(--input-border); } input[type='checkbox'].switch:checked:after { background: var(--active-inner); -webkit-transform: translateX(17px); transform: translateX(17px); } input[type='checkbox'].switch:disabled:not(:checked):after { opacity: .6; } input[type='radio'] { border-radius: 50%; } input[type='radio']:after { width: 19px; height: 19px; border-radius: 50%; background: var(--active-inner); opacity: 0; -webkit-transform: scale(0.7); transform: scale(0.7); } input[type='radio']:checked:after { background: var(--active-inner); -webkit-transform: scale(0.5); transform: scale(0.5); } } /* ----- input单选,多选,开关 ----- */ /* ----- 列表页通用tab ----- */ .common-tab { display: flex; flex-wrap: wrap; margin-bottom: 10px; background: #fff; border-radius: 5px; padding: 0 15px; } .common-tab h2 { width: 100%; } .common-tab h2 a { display: inline-block; color: #242424; font-size: 16px; font-weight: 700; line-height: 46px; height: 46px; margin-right: 15px; padding: 0 10px; } .common-tab h2 a.active { color: #007bff; border-bottom: 3px solid #007bff; } .common-tab h2 a.btn-info { height: 36px; line-height: 36px; font-size: 14px; color: #fff; text-align: center; background: #007bff; font-weight: 400; margin-right: 0; padding: 0 20px; border-radius: 3px; } .common-tab h2 a.btn-info:hover { background: #005bbd; } .common-tab h2 .btn-release { float: right; margin-top: 5px; } /* ----- 列表页通用tab ----- */ /* ---------- 关注列表 ---------- */ .follow-list1 { display: flex; flex-wrap: wrap; margin-bottom: 10px; margin: 0 -5px; } .follow-list1 li { width: 25%; padding: 0 5px; margin-bottom: 10px; } .follow-list1 li .follow-list-item { background: #fff; border-radius: 5px; padding: 20px; position: relative; } .follow-list-item .img-box { margin-bottom: 15px; } /* ----- 互相关注 ----- */ .each-other { color: #007bff; font-size: 12px; height: 24px; line-height: 22px; position: absolute; right: 10px; top: 10px; padding: 0 8px; border-radius: 20px; border: 1px solid #007bff; } /* ----- 互相关注 ----- */ .follow-list-item img { width: 80px; margin: 0 auto; border-radius: 50%; overflow: hidden; } .follow-list-item h4 { color: #242424; font-size: 18px; font-weight: 700; line-height: 30px; text-align: center; } .follow-list-item p { color: #808080; font-size: 12px; line-height: 30px; text-align: center; margin-bottom: 10px; } .follow-list-item a { display: block; width: 100%; height: 40px; line-height: 38px; text-align: center; border: 1px solid #e1e1e1; color: #666; font-size: 14px; border-radius: 5px; } .follow-list-item a:hover { color: #fff; background: #007bff; border: 1px solid #007bff; } /* ---------- 关注列表 ---------- */ /* ---------- table表格列表 ---------- */ .release-table { background: #fff; border-radius: 5px; padding: 15px; } table { width: 100%; margin-bottom: 10px; white-space: nowrap; } /* ----- 表格滚动条 ----- */ .table-scroll { width:100%; overflow-x:auto; overflow-y: hidden; } .table-scroll::-webkit-scrollbar { width: 10px; height: 6px; } .table-scroll::-webkit-scrollbar-thumb { -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); background: #535353; } .table-scroll::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2); background: #e1e1e1; } /* ----- 表格滚动条 ----- */ tr { border: 1px solid #f1f1f1; } tr td, tr th { padding: 12px 15px; font-size: 14px; text-align: center; } tr th { font-weight: 700; } table span.btn-table { display: inline-block; font-size: 12px; line-height: 22px; height: 24px; text-align: center; padding: 0 6px; border-radius: 2px; } table a.title { color: #242424; font-size: 14px; font-weight: 700; } table a.title:hover { color: #0069d9; } /* ----------- table表格列表 ---------- */ /* ----- 按钮集合 ----- */ a.btn-check { display: inline-block; font-size: 12px; text-align: center; padding: 6px 8px; border-radius: 2px; color: #fff; background: #138496; border: 1px solid #138496; margin-right: 5px; } a.btn-add { display: inline-block; font-size: 12px; text-align: center; padding: 6px 8px; border-radius: 2px; color: #fff; background: #0069d9; border: 1px solid #0069d9; margin-right: 5px; } a.btn-edit { display: inline-block; font-size: 12px; text-align: center; padding: 6px 8px; border-radius: 2px; color: #fff; background: #218838; border: 1px solid #218838; margin-right: 5px; } a.btn-delete { display: inline-block; font-size: 12px; text-align: center; padding: 6px 8px; border-radius: 2px; color: #fff; background: #c82333; border: 1px solid #c82333; } .btn-light { color: #212529; background-color: #f8f9fa; border: 1px solid #f8f9fa; } .btn-light:hover { color: #212529; background-color: #e2e6ea; border: 1px solid #e2e6ea; } .btn-lg { display: inline-block; font-size: 12px; line-height: 28px; height: 30px; text-align: center; padding: 0 10px; border-radius: 3px; } .btn-sm, .btn-table { display: inline-block; font-size: 12px; line-height: 22px; height: 24px; text-align: center; padding: 0 6px; border-radius: 2px; } .btn-success { color: #218838; border: 1px solid #218838; transition: all .5s; } .btn-danger { color: #c82333; border: 1px solid #c82333; transition: all .5s; } .btn-info { color: #0069d9; border: 1px solid #0069d9; transition: all .5s; } .btn-warning { color: #ffc107; border: 1px solid #ffc107; transition: all .5s; } .btn-primary { color: #138496; border: 1px solid #138496; transition: all .5s; } /* ----- 按钮集合 ----- */ /* ----- 分页通用 ----- */ .pagebar-common { background: #fff; border-radius: 5px; padding: 5px 10px; margin-top: 10px; } .pagebar-common .pagination { display: flex; flex-wrap: wrap; justify-content: center; } .pagebar-common .pagination li { margin: 0 4px; } .pagebar-common .pagination li a { display: block; font-size: 12px; line-height: 30px; padding: 0 8px; color: #808080; background: #f1f1f1; border-radius: 3px; } .pagebar-common .pagination li:hover a, .pagebar-common .pagination li.active a { color: #fff; background: #0069d9; } /* ----- 分页通用 ----- */ /* ----------- 交易记录 ---------- */ .shop-record-list { background: #fff; border-radius: 5px; } .release-table { margin-bottom: 10px; } .shop-record-list li { margin-bottom: 0; } .shop-record-list .record-item { padding: 15px; background: #fff; border-radius: 5px; transition: all .5s; border-bottom: 1px solid #f1f1f1; } .shop-record-list .record-item:hover { background: #f1f1f1; } .record-item p { color: #242424; font-size: 14px; line-height: 30px; margin-bottom: 5px; } .record-item p a { color: #242424; font-size: 14px; line-height: 30px; margin-bottom: 5px; } .record-item p a:hover { color: #007bff; } .record-item p span { margin-top: 3px; } .record-item h4 { font-size: 18px; font-weight: 700; line-height: 30px; } .record-item h4 a.change, .record-item h4 a.btn-more { display: inline-block; height: 30px; line-height: 28px; color: #fff; font-size: 14px; font-weight: 400; border-radius: 3px; padding: 0 12px; transition: all .5s; } .record-item h4 a.change { background: #c82333; border: 1px solid #c82333; margin-right: 5px; } .record-item h4 a.btn-more { background: #007bff; border: 1px solid #007bff; } .record-item h4 a.btn-more:hover { background: #005bbd; border: 1px solid #005bbd; } .record-item h4 a.change:hover { background: #6d040f; border: 1px solid #6d040f; } .text-info { color: #007bff; } /* ----------- 交易记录 ---------- */ /* ----------- 订单详情 ---------- */ .order-details { background: #fff; border-radius: 5px; padding: 15px; margin-bottom: 10px; } .display-flex-order { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-end; } .order-left { flex: 1; margin-right: 15px; } .order-list { width: 100%; } .order-list li { margin-bottom: 15px; border-bottom: 1px solid #e1e1e1; padding-bottom: 15px; display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; } .order-list li:last-child { margin-bottom: 0; border-bottom: 0; padding-bottom: 0; } .order-item { display: flex; flex-wrap: wrap; } .order-item .img-box { height: 120px; max-width: 160px; margin-right: 15px; overflow: hidden; } .order-item .img-box img { min-width: 100%; height: 100%; } .order-item h4 { font-size: 14px; font-weight: 700; line-height: 30px; } .order-item h4 a { color: #242424; } .order-item h4 a:hover { color: #007bff; } .order-item p { color: #808080; font-size: 12px; line-height: 30px; } .order-item-right { display: flex; } .order-number, .order-money { width: 150px; } .order-number p { color: #666; font-size: 12px; line-height: 20px; text-align: center; } .order-money p { color: #666; font-size: 12px; line-height: 20px; text-align: center; } .price { color: #007bff; font-weight: 700; } .order-right { margin-top: 15px; } .order-right button { display: block; height: 36px; line-height: 34px; color: #fff; font-size: 14px; font-weight: 400; background: #007bff; border: 1px solid #007bff; border-radius: 3px; padding: 0 36px; transition: all .5s; margin-top: 10px; margin: 10px auto 0 auto; cursor: pointer; } .order-right .summary { width: 250px; background: #f7fbff; padding: 15px; } .summary h3 { color: #242424; font-size: 14px; font-weight: 700; line-height: 30px; text-align: center; } .summary h4 { color: #808080; font-size: 14px; line-height: 28px; } .summary h4 span:last-child { font-weight: 700; } /* ---------- 订单详情 ---------- */ .order-left .information { width: 100%; background: #f7fbff; padding: 15px; } .information label{ display: block; } .information input { width: 240px; height: 40px; line-height: 40px; } .information h3 { color: #242424; font-size: 14px; font-weight: 700; line-height: 30px; text-align: center; } .information h4 { color: #808080; font-size: 14px; line-height: 28px; } .information h4 span:last-child { font-weight: 700; } .payment a{ display: inline-block; width: 45%; } /* ---------- 我的钱包主页 ---------- */ .wallet { display: flex; flex-wrap: wrap; justify-content: space-between; background: #fff; border-radius: 5px; padding: 15px; margin-bottom: 10px; } .wallet-right { padding-left: 15px; border-left: 1px solid #f1f1f1; } .wallet-right h4 { color: #242424; font-size: 14px; font-weight: 700; line-height: 30px; } .wallet-right p { color: #808080; font-size: 12px; line-height: 20px; } .wallet-right p span { color: #242424; display: inline-block; font-weight: 700; min-width: 20px; } .wallet-left { flex: 1; padding-right: 15px; } .wallet-rmb { width: 100%; padding: 18px 15px 15px; color: #fff; background-image: linear-gradient(to right,#4b85f0, #4650ef); border-radius: 5px; margin-bottom: 10px; } .wallet-rmb p, .wallet-jifen p { font-size: 12px; } .mb10 { margin-bottom: 10px; } .wallet-rmb h4, .wallet-jifen h4 { font-size: 24px; line-height: 36px; margin-bottom: 10px; } .wallet-rmb h4 a, .wallet-jifen h4 a { color: #fff; float: right; font-size: 14px; line-height: 36px; } .wallet-rmb h4 i, .wallet-jifen h4 i { font-size: 14px; } .wallet-jifen { width: 100%; padding: 18px 15px 15px; color: #fff; background-image: linear-gradient(to right,#fb7205, #eb3f33); border-radius: 5px; } /* ---------- 我的钱包主页 ---------- */ /* ---------- 响应式调节 ---------- */ @media screen and (max-width:768px) { .container { width: 100%; padding: 0 10px; } .hidden-sm { display: none; } .hidden-md { display: block; } .user-right { padding-left: 0; } .user-form .form-control > span, .user-form .form-control > label { min-width: 80px; } .form-password input { width: 100%; } .follow-list1 { margin: 0 -5px; } .follow-list1 li { width: 50%; padding: 0 5px; } .order-right { width: 100%; } .order-right .summary { width: 100% !important; } .order-list .order-item .img-box { height: 60px; } .order-item-right { margin-top: 10px; } .wallet .wallet-left { padding-right: 0; } .wallet .wallet-right { width: 100%; margin-top: 10px; padding-left: 0; border-left: 0; } } .order-title { width: 190px; } ================================================ FILE: static/common/user/js/jquery.min-1.10.2.js ================================================ /*! * jQuery JavaScript Library v3.5.0 * https://jquery.com/ * * Includes Sizzle.js * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2020-04-10T15:07Z */ ( function( global, factory ) { "use strict"; if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper `window` // is present, execute the factory and get jQuery. // For environments that do not have a `window` with a `document` // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common // enough that all such attempts are guarded in a try block. "use strict"; var arr = []; var getProto = Object.getPrototypeOf; var slice = arr.slice; var flat = arr.flat ? function( array ) { return arr.flat.call( array ); } : function( array ) { return arr.concat.apply( [], array ); }; var push = arr.push; var indexOf = arr.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call( Object ); var support = {}; var isFunction = function isFunction( obj ) { // Support: Chrome <=57, Firefox <=52 // In some browsers, typeof returns "function" for HTML elements // (i.e., `typeof document.createElement( "object" ) === "function"`). // We don't want to classify *any* DOM node as a function. return typeof obj === "function" && typeof obj.nodeType !== "number"; }; var isWindow = function isWindow( obj ) { return obj != null && obj === obj.window; }; var document = window.document; var preservedScriptAttributes = { type: true, src: true, nonce: true, noModule: true }; function DOMEval( code, node, doc ) { doc = doc || document; var i, val, script = doc.createElement( "script" ); script.text = code; if ( node ) { for ( i in preservedScriptAttributes ) { // Support: Firefox 64+, Edge 18+ // Some browsers don't support the "nonce" property on scripts. // On the other hand, just using `getAttribute` is not enough as // the `nonce` attribute is reset to an empty string whenever it // becomes browsing-context connected. // See https://github.com/whatwg/html/issues/2369 // See https://html.spec.whatwg.org/#nonce-attributes // The `node.getAttribute` check was added for the sake of // `jQuery.globalEval` so that it can fake a nonce-containing node // via an object. val = node[ i ] || node.getAttribute && node.getAttribute( i ); if ( val ) { script.setAttribute( i, val ); } } } doc.head.appendChild( script ).parentNode.removeChild( script ); } function toType( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call( obj ) ] || "object" : typeof obj; } /* global Symbol */ // Defining this global in .eslintrc.json would create a danger of using the global // unguarded in another place, it seems safer to define global only for this module var version = "3.5.0", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { // Return all the elements in a clean array if ( num == null ) { return slice.call( this ); } // Return just the one element from the set return num < 0 ? this[ num + this.length ] : this[ num ]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. each: function( callback ) { return jQuery.each( this, callback ); }, map: function( callback ) { return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); } ) ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, even: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return ( i + 1 ) % 2; } ) ); }, odd: function() { return this.pushStack( jQuery.grep( this, function( _elem, i ) { return i % 2; } ) ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { return this.prevObject || this.constructor(); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: arr.sort, splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( ( options = arguments[ i ] ) != null ) { // Extend the base object for ( name in options ) { copy = options[ name ]; // Prevent Object.prototype pollution // Prevent never-ending loop if ( name === "__proto__" || target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = Array.isArray( copy ) ) ) ) { src = target[ name ]; // Ensure proper type for the source value if ( copyIsArray && !Array.isArray( src ) ) { clone = []; } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { clone = {}; } else { clone = src; } copyIsArray = false; // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend( { // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, isPlainObject: function( obj ) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if ( !obj || toString.call( obj ) !== "[object Object]" ) { return false; } proto = getProto( obj ); // Objects with no prototype (e.g., `Object.create( null )`) are plain if ( !proto ) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, // Evaluates a script in a provided context; falls back to the global one // if not specified. globalEval: function( code, options, doc ) { DOMEval( code, { nonce: options && options.nonce }, doc ); }, each: function( obj, callback ) { var length, i = 0; if ( isArrayLike( obj ) ) { length = obj.length; for ( ; i < length; i++ ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } else { for ( i in obj ) { if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { break; } } } return obj; }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; for ( ; j < len; j++ ) { first[ i++ ] = second[ j ]; } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var length, value, i = 0, ret = []; // Go through the array, translating each of the items to their new values if ( isArrayLike( elems ) ) { length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return flat( ret ); }, // A global GUID counter for objects guid: 1, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support } ); if ( typeof Symbol === "function" ) { jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; } // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), function( _i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); function isArrayLike( obj ) { // Support: real iOS 8.2 only (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = !!obj && "length" in obj && obj.length, type = toType( obj ); if ( isFunction( obj ) || isWindow( obj ) ) { return false; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.3.5 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * * Date: 2020-03-14 */ ( function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // Instance methods hasOwn = ( {} ).hasOwnProperty, arr = [], pop = arr.pop, pushNative = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[ i ] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + "ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] // or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + identifier + ")" ), "CLASS": new RegExp( "^\\.(" + identifier + ")" ), "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; return nonHex ? // Strip the backslash prefix from a non-hex escape sequence nonHex : // Replace a hexadecimal escape sequence with the encoded Unicode code point // Support: IE <=11+ // For values outside the Basic Multilingual Plane (BMP), manually construct a // surrogate pair high < 0 ? String.fromCharCode( high + 0x10000 ) : String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function( ch, asCodePoint ) { if ( asCodePoint ) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER if ( ch === "\0" ) { return "\uFFFD"; } // Control characters and (dependent upon position) numbers get escaped as code points return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped return "\\" + ch; }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; }, { dir: "parentNode", next: "legend" } ); // Optimize for push.apply( _, NodeList ) try { push.apply( ( arr = slice.call( preferredDoc.childNodes ) ), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { pushNative.apply( target, slice.call( els ) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( ( target[ j++ ] = els[ i++ ] ) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { setDocument( context ); context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { // ID selector if ( ( m = match[ 1 ] ) ) { // Document context if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } // Element context } else { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Type selector } else if ( match[ 2 ] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll if ( support.qsa && !nonnativeSelectorCache[ selector + " " ] && ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && // Support: IE 8 only // Exclude object elements ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { newSelector = selector; newContext = context; // qSA considers elements outside a scoping root when evaluating child or // descendant combinators, which is not what we want. // In such cases, we work around the behavior by prefixing every selector in the // list with an ID selector referencing the scope context. // The technique has to be used as well when a leading combinator is used // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. if ( newContext !== context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { nid = nid.replace( rcssescape, fcssescape ); } else { context.setAttribute( "id", ( nid = expando ) ); } } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + toSelector( groups[ i ] ); } newSelector = groups.join( "," ); } try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch ( qsaError ) { nonnativeSelectorCache( selector, true ); } finally { if ( nid === expando ) { context.removeAttribute( "id" ); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return ( cache[ key + " " ] = value ); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { var el = document.createElement( "fieldset" ); try { return !!fn( el ); } catch ( e ) { return false; } finally { // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } // release memory in IE el = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split( "|" ), i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[ i ] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex; // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( ( cur = cur.nextSibling ) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return ( name === "input" || name === "button" ) && elem.type === type; }; } /** * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ function createDisabledPseudo( disabled ) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable return function( elem ) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled if ( "form" in elem ) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. if ( elem.parentNode && elem.disabled === false ) { // Option elements defer to a parent optgroup if present if ( "label" in elem ) { if ( "label" in elem.parentNode ) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; } } // Support: IE 6 - 11 // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. } else if ( "label" in elem ) { return elem.disabled === disabled; } // Remaining elements are neither :enabled nor :disabled return false; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction( function( argument ) { argument = +argument; return markFunction( function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ ( j = matchIndexes[ i ] ) ] ) { seed[ j ] = !( matches[ j ] = seed[ j ] ); } } } ); } ); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { var namespace = elem.namespaceURI, docElem = ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes // https://bugs.jquery.com/ticket/4833 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Update global variables document = doc; docElem = document.documentElement; documentIsHTML = !isXML( document ); // Support: IE 9 - 11+, Edge 12 - 18+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( preferredDoc != document && ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { subWindow.addEventListener( "unload", unloadHandler, false ); // Support: IE 9 - 10 only } else if ( subWindow.attachEvent ) { subWindow.attachEvent( "onunload", unloadHandler ); } } // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, // Safari 4 - 5 only, Opera <=11.6 - 12.x only // IE/Edge & older browsers don't support the :scope pseudo-class. // Support: Safari 6.0 only // Safari 6.0 supports :scope but it's an alias of :root there. support.scope = assert( function( el ) { docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll( ":scope fieldset div" ).length; } ); /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert( function( el ) { el.className = "i"; return !el.getAttribute( "className" ); } ); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert( function( el ) { el.appendChild( document.createComment( "" ) ); return !el.getElementsByTagName( "*" ).length; } ); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test support.getById = assert( function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; } ); // ID filter and find if ( support.getById ) { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode( "id" ); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); if ( elem ) { // Verify the id attribute node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; while ( ( elem = elems[ i++ ] ) ) { node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } } } return []; } }; } // Tag Expr.find[ "TAG" ] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( ( elem = results[ i++ ] ) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert( function( el ) { var input; // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // https://bugs.jquery.com/ticket/12359 docElem.appendChild( el ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !el.querySelectorAll( "[selected]" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push( "~=" ); } // Support: IE 11+, Edge 15 - 18+ // IE 11/Edge don't find elements on a `[name='']` query in some cases. // Adding a temporary attribute to the document before the selection works // around the issue. // Interestingly, IE 10 & older don't seem to have the issue. input = document.createElement( "input" ); input.setAttribute( "name", "" ); el.appendChild( input ); if ( !el.querySelectorAll( "[name='']" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + "*(?:''|\"\")" ); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !el.querySelectorAll( ":checked" ).length ) { rbuggyQSA.push( ":checked" ); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push( ".#.+[+~]" ); } // Support: Firefox <=3.6 - 5 only // Old Firefox doesn't throw on a badly-escaped identifier. el.querySelectorAll( "\\\f" ); rbuggyQSA.push( "[\\r\\n\\f]" ); } ); assert( function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = document.createElement( "input" ); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( el.querySelectorAll( "[name=d]" ).length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: Opera 10 - 11 only // Opera 10-11 does not throw on post-comma invalid pseudos el.querySelectorAll( "*,:x" ); rbuggyQSA.push( ",.*:" ); } ); } if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector ) ) ) ) { assert( function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); } ); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 ) ); } : function( a, b ) { if ( b ) { while ( ( b = b.parentNode ) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { // Choose the first element that is related to our preferred document // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( a == document || a.ownerDocument == preferredDoc && contains( preferredDoc, a ) ) { return -1; } // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( b == document || b.ownerDocument == preferredDoc && contains( preferredDoc, b ) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ return a == document ? -1 : b == document ? 1 : /* eslint-enable eqeqeq */ aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( ( cur = cur.parentNode ) ) { ap.unshift( cur ); } cur = b; while ( ( cur = cur.parentNode ) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[ i ] === bp[ i ] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[ i ], bp[ i ] ) : // Otherwise nodes in our document sort first // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. /* eslint-disable eqeqeq */ ap[ i ] == preferredDoc ? -1 : bp[ i ] == preferredDoc ? 1 : /* eslint-enable eqeqeq */ 0; }; return document; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { setDocument( elem ); if ( support.matchesSelector && documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch ( e ) { nonnativeSelectorCache( expr, true ); } } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( ( elem.ownerDocument || elem ) != document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { return ( sel + "" ).replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( ( elem = results[ i++ ] ) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( ( node = elem[ i++ ] ) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ).replace( runescape, funescape ); if ( match[ 2 ] === "~=" ) { match[ 3 ] = " " + match[ 3 ] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[ 1 ] = match[ 1 ].toLowerCase(); if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[ 4 ] = +( match[ 4 ] ? match[ 5 ] + ( match[ 6 ] || 1 ) : 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); // other types prohibit arguments } else if ( match[ 3 ] ) { Sizzle.error( match[ 0 ] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[ 6 ] && match[ 2 ]; if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { return null; } // Accept quoted arguments as-is if ( match[ 3 ] ) { match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) ( excess = tokenize( unquoted, true ) ) && // advance to the next closing parenthesis ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { // excess is a negative index match[ 0 ] = match[ 0 ].slice( 0, excess ); match[ 2 ] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || ( pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute( "class" ) || "" ); } ); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; /* eslint-disable max-len */ return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; /* eslint-enable max-len */ }; }, "CHILD": function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, _context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( ( node = node[ dir ] ) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index // ...in a gzip-friendly way node = parent; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( ( node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start ( diff = nodeIndex = 0 ) || start.pop() ) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } } else { // Use previously-cached element index if available if ( useCache ) { // ...in a gzip-friendly way node = elem; outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { // Use the same loop as above to seek `elem` from the start while ( ( node = ++nodeIndex && node && node[ dir ] || ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || ( outerCache[ node.uniqueID ] = {} ); uniqueCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction( function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[ i ] ); seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } } ) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction( function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction( function( seed, matches, _context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( ( elem = unmatched[ i ] ) ) { seed[ i ] = !( matches[ i ] = elem ); } } } ) : function( elem, _context, xml ) { input[ 0 ] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[ 0 ] = null; return !results.pop(); }; } ), "has": markFunction( function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; } ), "contains": markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; } ), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test( lang || "" ) ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( ( elemLang = documentIsHTML ? elem.lang : elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); return false; }; } ), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && ( !document.hasFocus || document.hasFocus() ) && !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties "enabled": createDisabledPseudo( false ), "disabled": createDisabledPseudo( true ), "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return ( nodeName === "input" && !!elem.checked ) || ( nodeName === "option" && !!elem.selected ); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos[ "empty" ]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( ( attr = elem.getAttribute( "type" ) ) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo( function() { return [ 0 ]; } ), "last": createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; } ), "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; } ), "even": createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "odd": createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; } ), "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument > length ? length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; } ), "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; } ) } }; Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || ( match = rcomma.exec( soFar ) ) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[ 0 ].length ) || soFar; } groups.push( ( tokens = [] ) ); } matched = false; // Combinators if ( ( match = rcombinators.exec( soFar ) ) ) { matched = match.shift(); tokens.push( { value: matched, // Cast descendant combinators to space type: match[ 0 ].replace( rtrim, " " ) } ); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || ( match = preFilters[ type ]( match ) ) ) ) { matched = match.shift(); tokens.push( { value: matched, type: type, matches: match } ); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[ i ].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } return false; } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || ( elem[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ elem.uniqueID ] || ( outerCache[ elem.uniqueID ] = {} ); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; } else if ( ( oldCache = uniqueCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return ( newCache[ 2 ] = oldCache[ 2 ] ); } else { // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { return true; } } } } } return false; }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[ i ]( elem, context, xml ) ) { return false; } } return true; } : matchers[ 0 ]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[ i ], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( ( elem = unmatched[ i ] ) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction( function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( ( elem = temp[ i ] ) ) { matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) ) { // Restore matcherIn since elem is not yet a final match temp.push( ( matcherIn[ i ] = elem ) ); } } postFinder( null, ( matcherOut = [] ), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) && ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { seed[ temp ] = !( results[ temp ] = elem ); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } } ); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[ 0 ].type ], implicitRelative = leadingRelative || Expr.relative[ " " ], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; } else { matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[ j ].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens .slice( 0, i - 1 ) .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), len = elems.length; if ( outermost ) { // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq outermostContext = context == document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; // Support: IE 11+, Edge 17 - 18+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq if ( !context && elem.ownerDocument != document ) { setDocument( elem ); xml = !documentIsHTML; } while ( ( matcher = elementMatchers[ j++ ] ) ) { if ( matcher( elem, context || document, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( ( elem = !matcher && elem ) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // `i` is now the count of elements visited above, and adding it to `matchedCount` // makes the latter nonnegative. matchedCount += i; // Apply set filters to unmatched elements // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` // equals `i`), unless we didn't visit _any_ elements in the above loop because we have // no element matchers and no seed. // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( ( matcher = setMatchers[ j++ ] ) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !( unmatched[ i ] || setMatched[ i ] ) ) { setMatched[ i ] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[ i ] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( ( selector = compiled.selector || selector ) ); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID tokens = match[ 0 ] = match[ 0 ].slice( 0 ); if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { context = ( Expr.find[ "ID" ]( token.matches[ 0 ] .replace( runescape, funescape ), context ) || [] )[ 0 ]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[ i ]; // Abort if we hit a combinator if ( Expr.relative[ ( type = token.type ) ] ) { break; } if ( ( find = Expr.find[ type ] ) ) { // Search, expanding context for leading sibling combinators if ( ( seed = find( token.matches[ 0 ].replace( runescape, funescape ), rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || context ) ) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert( function( el ) { // Should return 1, but returns 4 (following) return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; } ); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert( function( el ) { el.innerHTML = ""; return el.firstChild.getAttribute( "href" ) === "#"; } ) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } } ); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert( function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; } ) ) { addHandle( "value", function( elem, _name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } } ); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert( function( el ) { return el.getAttribute( "disabled" ) == null; } ) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; } } ); } return Sizzle; } )( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; jQuery.escapeSelector = Sizzle.escape; var dir = function( elem, dir, until ) { var matched = [], truncate = until !== undefined; while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { if ( elem.nodeType === 1 ) { if ( truncate && jQuery( elem ).is( until ) ) { break; } matched.push( elem ); } } return matched; }; var siblings = function( n, elem ) { var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { matched.push( n ); } } return matched; }; var rneedsContext = jQuery.expr.match.needsContext; function nodeName( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }; var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { return !!qualifier.call( elem, i, elem ) !== not; } ); } // Single element if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; } ); } // Arraylike of elements (jQuery, arguments, Array) if ( typeof qualifier !== "string" ) { return jQuery.grep( elements, function( elem ) { return ( indexOf.call( qualifier, elem ) > -1 ) !== not; } ); } // Filtered directly for both simple and complex selectors return jQuery.filter( qualifier, elements, not ); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } if ( elems.length === 1 && elem.nodeType === 1 ) { return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; } return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; } ) ); }; jQuery.fn.extend( { find: function( selector ) { var i, ret, len = this.length, self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } } ) ); } ret = this.pushStack( [] ); for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } return len > 1 ? jQuery.uniqueSort( ret ) : ret; }, filter: function( selector ) { return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } } ); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Method init() accepts an alternate rootjQuery // so migrate can support jQuery.sub (gh-2101) root = root || rootjQuery; // Handle HTML strings if ( typeof selector === "string" ) { if ( selector[ 0 ] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) if ( match[ 1 ] ) { context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[ 2 ] ); if ( elem ) { // Inject the element directly into the jQuery object this[ 0 ] = elem; this.length = 1; } return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( isFunction( selector ) ) { return root.ready !== undefined ? root.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } } ); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery( selectors ); // Positional selectors never match, since there's no _selection_ context if ( !rneedsContext.test( selectors ) ) { for ( ; i < l; i++ ) { for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; } } } } return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } // Index in selector if ( typeof elem === "string" ) { return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element return indexOf.call( this, // If it receives a jQuery object, the first element is used elem.jquery ? elem[ 0 ] : elem ); }, add: function( selector, context ) { return this.pushStack( jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter( selector ) ); } } ); function sibling( cur, dir ) { while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return dir( elem, "parentNode" ); }, parentsUntil: function( elem, _i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, nextUntil: function( elem, _i, until ) { return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, _i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return siblings( elem.firstChild ); }, contents: function( elem ) { if ( elem.contentDocument != null && // Support: IE 11+ // elements with no `data` attribute has an object // `contentDocument` with a `null` prototype. getProto( elem.contentDocument ) ) { return elem.contentDocument; } // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only // Treat the template element as a regular one in browsers that // don't support it. if ( nodeName( elem, "template" ) ) { elem = elem.content || elem; } return jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { matched.reverse(); } } return this.pushStack( matched ); }; } ); var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); // Convert String-formatted options into Object-formatted ones function createOptions( options ) { var object = {}; jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { object[ flag ] = true; } ); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? createOptions( options ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value for non-forgettable lists memory, // Flag to know if list was already fired fired, // Flag to prevent firing locked, // Actual callback list list = [], // Queue of execution data for repeatable lists queue = [], // Index of currently firing callback (modified by add/remove as needed) firingIndex = -1, // Fire callbacks fire = function() { // Enforce single-firing locked = locked || options.once; // Execute callbacks for all pending executions, // respecting firingIndex overrides and runtime changes fired = firing = true; for ( ; queue.length; firingIndex = -1 ) { memory = queue.shift(); while ( ++firingIndex < list.length ) { // Run callback and check for early termination if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && options.stopOnFalse ) { // Jump to end and forget the data so .add doesn't re-fire firingIndex = list.length; memory = false; } } } // Forget the data if we're done with it if ( !options.memory ) { memory = false; } firing = false; // Clean up if we're done firing for good if ( locked ) { // Keep an empty list if we have data for future add calls if ( memory ) { list = []; // Otherwise, this object is spent } else { list = ""; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // If we have memory from a past run, we should fire after adding if ( memory && !firing ) { firingIndex = list.length - 1; queue.push( memory ); } ( function add( args ) { jQuery.each( args, function( _, arg ) { if ( isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && toType( arg ) !== "string" ) { // Inspect recursively add( arg ); } } ); } )( arguments ); if ( memory && !firing ) { fire(); } } return this; }, // Remove a callback from the list remove: function() { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( index <= firingIndex ) { firingIndex--; } } } ); return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : list.length > 0; }, // Remove all callbacks from the list empty: function() { if ( list ) { list = []; } return this; }, // Disable .fire and .add // Abort any current/pending executions // Clear all callbacks and values disable: function() { locked = queue = []; list = memory = ""; return this; }, disabled: function() { return !list; }, // Disable .fire // Also disable .add unless we have memory (since it would have no effect) // Abort any pending executions lock: function() { locked = queue = []; if ( !memory && !firing ) { list = memory = ""; } return this; }, locked: function() { return !!locked; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; queue.push( args ); if ( !firing ) { fire(); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; function Identity( v ) { return v; } function Thrower( ex ) { throw ex; } function adoptValue( value, resolve, reject, noValue ) { var method; try { // Check for promise aspect first to privilege synchronous behavior if ( value && isFunction( ( method = value.promise ) ) ) { method.call( value ).done( resolve ).fail( reject ); // Other thenables } else if ( value && isFunction( ( method = value.then ) ) ) { method.call( value, resolve, reject ); // Other non-thenables } else { // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: // * false: [ value ].slice( 0 ) => resolve( value ) // * true: [ value ].slice( 1 ) => resolve() resolve.apply( undefined, [ value ].slice( noValue ) ); } // For Promises/A+, convert exceptions into rejections // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in // Deferred#then to conditionally suppress rejection. } catch ( value ) { // Support: Android 4.0 only // Strict mode functions invoked without .call/.apply get global-object context reject.apply( undefined, [ value ] ); } } jQuery.extend( { Deferred: function( func ) { var tuples = [ // action, add listener, callbacks, // ... .then handlers, argument index, [final state] [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ), 2 ], [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 0, "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), 1, "rejected" ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, "catch": function( fn ) { return promise.then( null, fn ); }, // Keep pipe for back-compat pipe: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( _i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; // deferred.progress(function() { bind to newDefer or newDefer.notify }) // deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && isFunction( returned.promise ) ) { returned.promise() .progress( newDefer.notify ) .done( newDefer.resolve ) .fail( newDefer.reject ); } else { newDefer[ tuple[ 0 ] + "With" ]( this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); }, then: function( onFulfilled, onRejected, onProgress ) { var maxDepth = 0; function resolve( depth, deferred, handler, special ) { return function() { var that = this, args = arguments, mightThrow = function() { var returned, then; // Support: Promises/A+ section 2.3.3.3.3 // https://promisesaplus.com/#point-59 // Ignore double-resolution attempts if ( depth < maxDepth ) { return; } returned = handler.apply( that, args ); // Support: Promises/A+ section 2.3.1 // https://promisesaplus.com/#point-48 if ( returned === deferred.promise() ) { throw new TypeError( "Thenable self-resolution" ); } // Support: Promises/A+ sections 2.3.3.1, 3.5 // https://promisesaplus.com/#point-54 // https://promisesaplus.com/#point-75 // Retrieve `then` only once then = returned && // Support: Promises/A+ section 2.3.4 // https://promisesaplus.com/#point-64 // Only check objects and functions for thenability ( typeof returned === "object" || typeof returned === "function" ) && returned.then; // Handle a returned thenable if ( isFunction( then ) ) { // Special processors (notify) just wait for resolution if ( special ) { then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ) ); // Normal processors (resolve) also hook into progress } else { // ...and disregard older resolution values maxDepth++; then.call( returned, resolve( maxDepth, deferred, Identity, special ), resolve( maxDepth, deferred, Thrower, special ), resolve( maxDepth, deferred, Identity, deferred.notifyWith ) ); } // Handle all other returned values } else { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Identity ) { that = undefined; args = [ returned ]; } // Process the value(s) // Default process is resolve ( special || deferred.resolveWith )( that, args ); } }, // Only normal processors (resolve) catch and reject exceptions process = special ? mightThrow : function() { try { mightThrow(); } catch ( e ) { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, process.stackTrace ); } // Support: Promises/A+ section 2.3.3.3.4.1 // https://promisesaplus.com/#point-61 // Ignore post-resolution exceptions if ( depth + 1 >= maxDepth ) { // Only substitute handlers pass on context // and multiple values (non-spec behavior) if ( handler !== Thrower ) { that = undefined; args = [ e ]; } deferred.rejectWith( that, args ); } } }; // Support: Promises/A+ section 2.3.3.3.1 // https://promisesaplus.com/#point-57 // Re-resolve promises immediately to dodge false rejection from // subsequent errors if ( depth ) { process(); } else { // Call an optional hook to record the stack, in case of exception // since it's otherwise lost when execution goes async if ( jQuery.Deferred.getStackHook ) { process.stackTrace = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } }; } return jQuery.Deferred( function( newDefer ) { // progress_handlers.add( ... ) tuples[ 0 ][ 3 ].add( resolve( 0, newDefer, isFunction( onProgress ) ? onProgress : Identity, newDefer.notifyWith ) ); // fulfilled_handlers.add( ... ) tuples[ 1 ][ 3 ].add( resolve( 0, newDefer, isFunction( onFulfilled ) ? onFulfilled : Identity ) ); // rejected_handlers.add( ... ) tuples[ 2 ][ 3 ].add( resolve( 0, newDefer, isFunction( onRejected ) ? onRejected : Thrower ) ); } ).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 5 ]; // promise.progress = list.add // promise.done = list.add // promise.fail = list.add promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { list.add( function() { // state = "resolved" (i.e., fulfilled) // state = "rejected" state = stateString; }, // rejected_callbacks.disable // fulfilled_callbacks.disable tuples[ 3 - i ][ 2 ].disable, // rejected_handlers.disable // fulfilled_handlers.disable tuples[ 3 - i ][ 3 ].disable, // progress_callbacks.lock tuples[ 0 ][ 2 ].lock, // progress_handlers.lock tuples[ 0 ][ 3 ].lock ); } // progress_handlers.fire // fulfilled_handlers.fire // rejected_handlers.fire list.add( tuple[ 3 ].fire ); // deferred.notify = function() { deferred.notifyWith(...) } // deferred.resolve = function() { deferred.resolveWith(...) } // deferred.reject = function() { deferred.rejectWith(...) } deferred[ tuple[ 0 ] ] = function() { deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); return this; }; // deferred.notifyWith = list.fireWith // deferred.resolveWith = list.fireWith // deferred.rejectWith = list.fireWith deferred[ tuple[ 0 ] + "With" ] = list.fireWith; } ); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( singleValue ) { var // count of uncompleted subordinates remaining = arguments.length, // count of unprocessed arguments i = remaining, // subordinate fulfillment data resolveContexts = Array( i ), resolveValues = slice.call( arguments ), // the master Deferred master = jQuery.Deferred(), // subordinate callback factory updateFunc = function( i ) { return function( value ) { resolveContexts[ i ] = this; resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( !( --remaining ) ) { master.resolveWith( resolveContexts, resolveValues ); } }; }; // Single- and empty arguments are adopted like Promise.resolve if ( remaining <= 1 ) { adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, !remaining ); // Use .then() to unwrap secondary thenables (cf. gh-3000) if ( master.state() === "pending" || isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { return master.then(); } } // Multiple arguments are aggregated like Promise.all array elements while ( i-- ) { adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); } return master.promise(); } } ); // These usually indicate a programmer mistake during development, // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; jQuery.Deferred.exceptionHook = function( error, stack ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); } }; jQuery.readyException = function( error ) { window.setTimeout( function() { throw error; } ); }; // The deferred used on DOM ready var readyList = jQuery.Deferred(); jQuery.fn.ready = function( fn ) { readyList .then( fn ) // Wrap jQuery.readyException in a function so that the lookup // happens at the time of error handling instead of callback // registration. .catch( function( error ) { jQuery.readyException( error ); } ); return this; }; jQuery.extend( { // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); } } ); jQuery.ready.then = readyList.then; // The ready event handler and self cleanup method function completed() { document.removeEventListener( "DOMContentLoaded", completed ); window.removeEventListener( "load", completed ); jQuery.ready(); } // Catch cases where $(document).ready() is called // after the browser event has already occurred. // Support: IE <=9 - 10 only // Older IE sometimes signals "interactive" too soon if ( document.readyState === "complete" || ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { // Handle it asynchronously to allow scripts the opportunity to delay ready window.setTimeout( jQuery.ready ); } else { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed ); } // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; // Sets many values if ( toType( key ) === "object" ) { chainable = true; for ( i in key ) { access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, _key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < len; i++ ) { fn( elems[ i ], key, raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) ); } } } if ( chainable ) { return elems; } // Gets if ( bulk ) { return fn.call( elems ); } return len ? fn( elems[ 0 ], key ) : emptyGet; }; // Matches dashed string for camelizing var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() function fcamelCase( _all, letter ) { return letter.toUpperCase(); } // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 // Microsoft forgot to hump their vendor prefix (#9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } var acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); }; function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; Data.prototype = { cache: function( owner ) { // Check if the owner object already has a cache var value = owner[ this.expando ]; // If not, create one if ( !value ) { value = Object.create( null ); // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. // Always return an empty object. if ( acceptData( owner ) ) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment if ( owner.nodeType ) { owner[ this.expando ] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { Object.defineProperty( owner, this.expando, { value: value, configurable: true } ); } } } return value; }, set: function( owner, data, value ) { var prop, cache = this.cache( owner ); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) if ( typeof data === "string" ) { cache[ camelCase( data ) ] = value; // Handle: [ owner, { properties } ] args } else { // Copy the properties one-by-one to the cache object for ( prop in data ) { cache[ camelCase( prop ) ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { return key === undefined ? this.cache( owner ) : // Always use camelCase key (gh-2257) owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; }, access: function( owner, key, value ) { // In cases where either: // // 1. No key was specified // 2. A string key was specified, but no value provided // // Take the "read" path and allow the get method to determine // which value to return, respectively either: // // 1. The entire cache object // 2. The data stored at the key // if ( key === undefined || ( ( key && typeof key === "string" ) && value === undefined ) ) { return this.get( owner, key ); } // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties // 2. A key and value // this.set( owner, key, value ); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, remove: function( owner, key ) { var i, cache = owner[ this.expando ]; if ( cache === undefined ) { return; } if ( key !== undefined ) { // Support array or space separated string of keys if ( Array.isArray( key ) ) { // If key is an array of keys... // We always set camelCase keys, so remove that. key = key.map( camelCase ); } else { key = camelCase( key ); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace key = key in cache ? [ key ] : ( key.match( rnothtmlwhite ) || [] ); } i = key.length; while ( i-- ) { delete cache[ key[ i ] ]; } } // Remove the expando if there's no more data if ( key === undefined || jQuery.isEmptyObject( cache ) ) { // Support: Chrome <=35 - 45 // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) if ( owner.nodeType ) { owner[ this.expando ] = undefined; } else { delete owner[ this.expando ]; } } }, hasData: function( owner ) { var cache = owner[ this.expando ]; return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; var dataPriv = new Data(); var dataUser = new Data(); // Implementation Summary // // 1. Enforce API surface and semantic compatibility with 1.9.x branch // 2. Improve the module's maintainability by reducing the storage // paths to a single mechanism. // 3. Use the same single mechanism to support "private" and "user" data. // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) // 5. Avoid exposing implementation details on user objects (eg. expando properties) // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g; function getData( data ) { if ( data === "true" ) { return true; } if ( data === "false" ) { return false; } if ( data === "null" ) { return null; } // Only convert to a number if it doesn't change the string if ( data === +data + "" ) { return +data; } if ( rbrace.test( data ) ) { return JSON.parse( data ); } return data; } function dataAttr( elem, key, data ) { var name; // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = getData( data ); } catch ( e ) {} // Make sure we set the data so it isn't changed later dataUser.set( elem, key, data ); } else { data = undefined; } } return data; } jQuery.extend( { hasData: function( elem ) { return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { dataPriv.remove( elem, name ); } } ); jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], attrs = elem && elem.attributes; // Gets all values if ( key === undefined ) { if ( this.length ) { data = dataUser.get( elem ); if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE 11 only // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } dataPriv.set( elem, "hasDataAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each( function() { dataUser.set( this, key ); } ); } return access( this, function( value ) { var data; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the // `value` parameter was not undefined. An empty jQuery object // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { // Attempt to get data from the cache // The key will always be camelCased in Data data = dataUser.get( elem, key ); if ( data !== undefined ) { return data; } // Attempt to "discover" the data in // HTML5 custom data-* attrs data = dataAttr( elem, key ); if ( data !== undefined ) { return data; } // We tried really hard, but the data doesn't exist. return; } // Set the data... this.each( function() { // We always store the camelCased key dataUser.set( this, key, value ); } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each( function() { dataUser.remove( this, key ); } ); } } ); jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || Array.isArray( data ) ) { queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { empty: jQuery.Callbacks( "once memory" ).add( function() { dataPriv.remove( elem, [ type + "queue", key ] ); } ) } ); } } ); jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } } ); }, dequeue: function( type ) { return this.each( function() { jQuery.dequeue( this, type ); } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } } ); var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var documentElement = document.documentElement; var isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ); }, composed = { composed: true }; // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only // Check attachment across shadow DOM boundaries when possible (gh-3504) // Support: iOS 10.0-10.2 only // Early iOS 10 versions support `attachShadow` but not `getRootNode`, // leading to errors. We need to check for `getRootNode`. if ( documentElement.getRootNode ) { isAttached = function( elem ) { return jQuery.contains( elem.ownerDocument, elem ) || elem.getRootNode( composed ) === elem.ownerDocument; }; } var isHiddenWithinTree = function( elem, el ) { // isHiddenWithinTree might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; // Inline style trumps all return elem.style.display === "none" || elem.style.display === "" && // Otherwise, check computed style // Support: Firefox <=43 - 45 // Disconnected elements can have computed display: none, so first confirm that elem is // in the document. isAttached( elem ) && jQuery.css( elem, "display" ) === "none"; }; function adjustCSS( elem, prop, valueParts, tween ) { var adjusted, scale, maxIterations = 20, currentValue = tween ? function() { return tween.cur(); } : function() { return jQuery.css( elem, prop, "" ); }, initial = currentValue(), unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), // Starting value computation is required for potential unit mismatches initialInUnit = elem.nodeType && ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && rcssNum.exec( jQuery.css( elem, prop ) ); if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { // Support: Firefox <=54 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) initial = initial / 2; // Trust units reported by jQuery.css unit = unit || initialInUnit[ 3 ]; // Iteratively approximate from a nonzero starting point initialInUnit = +initial || 1; while ( maxIterations-- ) { // Evaluate and update our best guess (doubling guesses that zero out). // Finish if the scale equals or crosses 1 (making the old*new product non-positive). jQuery.style( elem, prop, initialInUnit + unit ); if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { maxIterations = 0; } initialInUnit = initialInUnit / scale; } initialInUnit = initialInUnit * 2; jQuery.style( elem, prop, initialInUnit + unit ); // Make sure we update the tween properties later on valueParts = valueParts || []; } if ( valueParts ) { initialInUnit = +initialInUnit || +initial || 0; // Apply relative offset (+=/-=) if specified adjusted = valueParts[ 1 ] ? initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : +valueParts[ 2 ]; if ( tween ) { tween.unit = unit; tween.start = initialInUnit; tween.end = adjusted; } } return adjusted; } var defaultDisplayMap = {}; function getDefaultDisplay( elem ) { var temp, doc = elem.ownerDocument, nodeName = elem.nodeName, display = defaultDisplayMap[ nodeName ]; if ( display ) { return display; } temp = doc.body.appendChild( doc.createElement( nodeName ) ); display = jQuery.css( temp, "display" ); temp.parentNode.removeChild( temp ); if ( display === "none" ) { display = "block"; } defaultDisplayMap[ nodeName ] = display; return display; } function showHide( elements, show ) { var display, elem, values = [], index = 0, length = elements.length; // Determine new display value for elements that need to change for ( ; index < length; index++ ) { elem = elements[ index ]; if ( !elem.style ) { continue; } display = elem.style.display; if ( show ) { // Since we force visibility upon cascade-hidden elements, an immediate (and slow) // check is required in this first loop unless we have a nonempty display value (either // inline or about-to-be-restored) if ( display === "none" ) { values[ index ] = dataPriv.get( elem, "display" ) || null; if ( !values[ index ] ) { elem.style.display = ""; } } if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { values[ index ] = getDefaultDisplay( elem ); } } else { if ( display !== "none" ) { values[ index ] = "none"; // Remember what we're overwriting dataPriv.set( elem, "display", display ); } } } // Set the display of the elements in a second loop to avoid constant reflow for ( index = 0; index < length; index++ ) { if ( values[ index ] != null ) { elements[ index ].style.display = values[ index ]; } } return elements; } jQuery.fn.extend( { show: function() { return showHide( this, true ); }, hide: function() { return showHide( this ); }, toggle: function( state ) { if ( typeof state === "boolean" ) { return state ? this.show() : this.hide(); } return this.each( function() { if ( isHiddenWithinTree( this ) ) { jQuery( this ).show(); } else { jQuery( this ).hide(); } } ); } } ); var rcheckableType = ( /^(?:checkbox|radio)$/i ); var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); ( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); div.appendChild( input ); // Support: Android <=4.1 only // Older WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE <=11 only // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // Support: IE <=9 only // IE <=9 replaces "; support.option = !!div.lastChild; } )(); // We have to close these tags to support XHTML (#13200) var wrapMap = { // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten // this by omitting or other required elements. thead: [ 1, "", "
            " ], col: [ 2, "", "
            " ], tr: [ 2, "", "
            " ], td: [ 3, "", "
            " ], _default: [ 0, "", "" ] }; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // Support: IE <=9 only if ( !support.option ) { wrapMap.optgroup = wrapMap.option = [ 1, "" ]; } function getAll( context, tag ) { // Support: IE <=9 - 11 only // Use typeof to avoid zero-argument method invocation on host objects (#15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { ret = context.getElementsByTagName( tag || "*" ); } else if ( typeof context.querySelectorAll !== "undefined" ) { ret = context.querySelectorAll( tag || "*" ); } else { ret = []; } if ( tag === undefined || tag && nodeName( context, tag ) ) { return jQuery.merge( [ context ], ret ); } return ret; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var i = 0, l = elems.length; for ( ; i < l; i++ ) { dataPriv.set( elems[ i ], "globalEval", !refElements || dataPriv.get( refElements[ i ], "globalEval" ) ); } } var rhtml = /<|&#?\w+;/; function buildFragment( elems, context, scripts, selection, ignored ) { var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( toType( elem ) === "object" ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); // Deserialize a standard representation tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; // Descend through wrappers to the right content j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); // Remember the top-level container tmp = fragment.firstChild; // Ensure the created nodes are orphaned (#12392) tmp.textContent = ""; } } } // Remove wrapper from fragment fragment.textContent = ""; i = 0; while ( ( elem = nodes[ i++ ] ) ) { // Skip elements already in the context collection (trac-4087) if ( selection && jQuery.inArray( elem, selection ) > -1 ) { if ( ignored ) { ignored.push( elem ); } continue; } attached = isAttached( elem ); // Append to fragment tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( attached ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( ( elem = tmp[ j++ ] ) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } return fragment; } var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; } function returnFalse() { return false; } // Support: IE <=9 - 11+ // focus() and blur() are asynchronous, except when they are no-op. // So expect focus to be synchronous when the element is already active, // and blur to be synchronous when the element is not already active. // (focus and blur are always synchronous in other supported browsers, // this just defines when we can count on it). function expectSync( elem, type ) { return ( elem === safeActiveElement() ) === ( type === "focus" ); } // Support: IE <=9 only // Accessing document.activeElement can throw unexpectedly // https://bugs.jquery.com/ticket/13393 function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } function on( elem, types, selector, data, fn, one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { on( elem, type, selector, data, types[ type ], one ); } return elem; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return elem; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return elem.each( function() { jQuery.event.add( this, types, fn, data, selector ); } ); } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); // Only attach events to objects that accept data if ( !acceptData( elem ) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if ( selector ) { jQuery.find.matchesSelector( documentElement, selector ); } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { events = elemData.events = Object.create( null ); } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } // Handle multiple events separated by a space types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend( { type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); if ( !elemData || !( events = elemData.events ) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[ t ] ) || []; type = origType = tmp[ 1 ]; namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[ 2 ] && new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { dataPriv.remove( elem, "handle events" ); } }, dispatch: function( nativeEvent ) { var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( nativeEvent ), handlers = ( dataPriv.get( this, "events" ) || Object.create( null ) )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[ 0 ] = event; for ( i = 1; i < arguments.length; i++ ) { args[ i ] = arguments[ i ]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( ( handleObj = matched.handlers[ j++ ] ) && !event.isImmediatePropagationStopped() ) { // If the event is namespaced, then each handler is only invoked if it is // specially universal or its namespaces are a superset of the event's. if ( !event.rnamespace || handleObj.namespace === false || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers if ( delegateCount && // Support: IE <=9 // Black-hole SVG instance trees (trac-13180) cur.nodeType && // Support: Firefox <=42 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click // Support: IE 11 only // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !( event.type === "click" && event.button >= 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { matchedSelectors[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matchedSelectors[ sel ] ) { matchedHandlers.push( handleObj ); } } if ( matchedHandlers.length ) { handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); } } } } // Add the remaining (directly-bound) handlers cur = this; if ( delegateCount < handlers.length ) { handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, addProp: function( name, hook ) { Object.defineProperty( jQuery.Event.prototype, name, { enumerable: true, configurable: true, get: isFunction( hook ) ? function() { if ( this.originalEvent ) { return hook( this.originalEvent ); } } : function() { if ( this.originalEvent ) { return this.originalEvent[ name ]; } }, set: function( value ) { Object.defineProperty( this, name, { enumerable: true, configurable: true, writable: true, value: value } ); } } ); }, fix: function( originalEvent ) { return originalEvent[ jQuery.expando ] ? originalEvent : new jQuery.Event( originalEvent ); }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, click: { // Utilize native event to ensure correct state for checkable inputs setup: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Claim the first handler if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) leverageNative( el, "click", returnTrue ); } // Return false to allow normal processing in the caller return false; }, trigger: function( data ) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Force setup before triggering a click if ( rcheckableType.test( el.type ) && el.click && nodeName( el, "input" ) ) { leverageNative( el, "click" ); } // Return non-false to allow normal event-path propagation return true; }, // For cross-browser consistency, suppress native .click() on links // Also prevent it if we're currently inside a leveraged native-event stack _default: function( event ) { var target = event.target; return rcheckableType.test( target.type ) && target.click && nodeName( target, "input" ) && dataPriv.get( target, "click" ) || nodeName( target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } } }; // Ensure the presence of an event listener that handles manually-triggered // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. function leverageNative( el, type, expectSync ) { // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add if ( !expectSync ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } return; } // Register the controller as a special universal handler for all event namespaces dataPriv.set( el, type, false ); jQuery.event.add( el, type, { namespace: false, handler: function( event ) { var notAsync, result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event // Saved data should be false in such cases, but might be a leftover capture object // from an async native handler (gh-4350) if ( !saved.length ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array // will not be confused with a leftover capture object. saved = slice.call( arguments ); dataPriv.set( this, type, saved ); // Trigger the native event and capture its result // Support: IE <=9 - 11+ // focus() and blur() are asynchronous notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); if ( saved !== result || notAsync ) { dataPriv.set( this, type, false ); } else { result = {}; } if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); return result.value; } // If this is an inner synthetic event for an event with a bubbling surrogate // (focus or blur), assume that the surrogate already propagated from triggering the // native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { event.stopPropagation(); } // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments } else if ( saved.length ) { // ...and capture the result dataPriv.set( this, type, { value: jQuery.event.trigger( // Support: IE <=9 - 11+ // Extend with the prototype to reset the above stopImmediatePropagation() jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), saved.slice( 1 ), this ) } ); // Abort handling of the native event event.stopImmediatePropagation(); } } } ); } jQuery.removeEvent = function( elem, type, handle ) { // This "if" is needed for plain objects if ( elem.removeEventListener ) { elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: Android <=2.3 only src.returnValue === false ? returnTrue : returnFalse; // Create target properties // Support: Safari <=6 - 7 only // Target should not be a text node (#504, #13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; this.currentTarget = src.currentTarget; this.relatedTarget = src.relatedTarget; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || Date.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, isSimulated: false, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( e && !this.isSimulated ) { e.preventDefault(); } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopPropagation(); } }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && !this.isSimulated ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Includes all common event props including KeyEvent and MouseEvent specific props jQuery.each( { altKey: true, bubbles: true, cancelable: true, changedTouches: true, ctrlKey: true, detail: true, eventPhase: true, metaKey: true, pageX: true, pageY: true, shiftKey: true, view: true, "char": true, code: true, charCode: true, key: true, keyCode: true, button: true, buttons: true, clientX: true, clientY: true, offsetX: true, offsetY: true, pointerId: true, pointerType: true, screenX: true, screenY: true, targetTouches: true, toElement: true, touches: true, which: function( event ) { var button = event.button; // Add which for key events if ( event.which == null && rkeyEvent.test( event.type ) ) { return event.charCode != null ? event.charCode : event.keyCode; } // Add which for click: 1 === left; 2 === middle; 3 === right if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { if ( button & 1 ) { return 1; } if ( button & 2 ) { return 3; } if ( button & 4 ) { return 2; } return 0; } return event.which; } }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) leverageNative( this, type, expectSync ); // Return false to allow normal processing in the caller return false; }, trigger: function() { // Force setup before trigger leverageNative( this, type ); // Return non-false to allow normal event-path propagation return true; }, delegateType: delegateType }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout // // Support: Safari 7 only // Safari sends mouseenter too often; see: // https://bugs.chromium.org/p/chromium/issues/detail?id=470258 // for the description of the bug (it existed in older Chrome versions as well). jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; } ); jQuery.fn.extend( { on: function( types, selector, data, fn ) { return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each( function() { jQuery.event.remove( this, types, fn, selector ); } ); } } ); var // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ rnoInnerhtml = /\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { if ( nodeName( elem, "table" ) && nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { return jQuery( elem ).children( "tbody" )[ 0 ] || elem; } return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { elem.type = elem.type.slice( 5 ); } else { elem.removeAttribute( "type" ); } return elem; } function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; } // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { pdataOld = dataPriv.get( src ); events = pdataOld.events; if ( events ) { dataPriv.remove( dest, "handle events" ); for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } } // 2. Copy user data if ( dataUser.hasData( src ) ) { udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); dataUser.set( dest, udataCur ); } } // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); // Fails to persist the checked state of a cloned checkbox or radio button. if ( nodeName === "input" && rcheckableType.test( src.type ) ) { dest.checked = src.checked; // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays args = flat( args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, l = collection.length, iNoClone = l - 1, value = args[ 0 ], valueIsFunction = isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( valueIsFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return collection.each( function( index ) { var self = collection.eq( index ); if ( valueIsFunction ) { args[ 0 ] = value.call( this, index, self.html() ); } domManip( self, args, callback, ignored ); } ); } if ( l ) { fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } // Require either new content or an interest in ignored elements to invoke the callback if ( first || ignored ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item // instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( collection[ i ], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !dataPriv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl && !node.noModule ) { jQuery._evalUrl( node.src, { nonce: node.nonce || node.getAttribute( "nonce" ) }, doc ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } } } } } return collection; } function remove( elem, selector, keepData ) { var node, nodes = selector ? jQuery.filter( selector, elem ) : elem, i = 0; for ( ; ( node = nodes[ i ] ) != null; i++ ) { if ( !keepData && node.nodeType === 1 ) { jQuery.cleanData( getAll( node ) ); } if ( node.parentNode ) { if ( keepData && isAttached( node ) ) { setGlobalEval( getAll( node, "script" ) ); } node.parentNode.removeChild( node ); } } return elem; } jQuery.extend( { htmlPrefilter: function( html ) { return html; }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), inPage = isAttached( elem ); // Fix IE cloning issues if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); for ( i = 0, l = srcElements.length; i < l; i++ ) { fixInput( srcElements[ i ], destElements[ i ] ); } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0, l = srcElements.length; i < l; i++ ) { cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } // Return the cloned set return clone; }, cleanData: function( elems ) { var data, elem, type, special = jQuery.event.special, i = 0; for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { if ( acceptData( elem ) ) { if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataPriv.expando ] = undefined; } if ( elem[ dataUser.expando ] ) { // Support: Chrome <=35 - 45+ // Assign undefined instead of using delete, see Data#remove elem[ dataUser.expando ] = undefined; } } } } } ); jQuery.fn.extend( { detach: function( selector ) { return remove( this, selector, true ); }, remove: function( selector ) { return remove( this, selector ); }, text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } } ); }, null, value, arguments.length ); }, append: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } } ); }, prepend: function() { return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } } ); }, before: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } } ); }, after: function() { return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } } ); }, empty: function() { var elem, i = 0; for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks jQuery.cleanData( getAll( elem, false ) ); // Remove any remaining nodes elem.textContent = ""; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); } ); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined && elem.nodeType === 1 ) { return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { elem = this[ i ] || {}; // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch ( e ) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var ignored = []; // Make the changes, replacing each non-ignored context element with the new content return domManip( this, arguments, function( elem ) { var parent = this.parentNode; if ( jQuery.inArray( this, ignored ) < 0 ) { jQuery.cleanData( getAll( this ) ); if ( parent ) { parent.replaceChild( elem, this ); } } // Force callback invocation }, ignored ); } } ); jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, ret = [], insert = jQuery( selector ), last = insert.length - 1, i = 0; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone( true ); jQuery( insert[ i ] )[ original ]( elems ); // Support: Android <=4.0 only, PhantomJS 1 only // .get() because push.apply(_, arraylike) throws on ancient WebKit push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); var getStyles = function( elem ) { // Support: IE <=11 only, Firefox <=30 (#15098, #14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) { view = window; } return view.getComputedStyle( elem ); }; var swap = function( elem, options, callback ) { var ret, name, old = {}; // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.call( elem ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }; var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); ( function() { // Executing both pixelPosition & boxSizingReliable tests require only one layout // so they're executed at the same time to save the second computation. function computeStyleTests() { // This is a singleton, we need to execute it only once if ( !div ) { return; } container.style.cssText = "position:absolute;left:-11111px;width:60px;" + "margin-top:1px;padding:0;border:0"; div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + "margin:auto;border:1px;padding:1px;" + "width:60%;top:1%"; documentElement.appendChild( container ).appendChild( div ); var divStyle = window.getComputedStyle( div ); pixelPositionVal = divStyle.top !== "1%"; // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 // Some styles come back with percentage values, even though they shouldn't div.style.right = "60%"; pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; // Support: IE 9 - 11 only // Detect misreporting of content dimensions for box-sizing:border-box elements boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; // Support: IE 9 only // Detect overflow:scroll screwiness (gh-3699) // Support: Chrome <=64 // Don't get tricked when zoom affects offsetWidth (gh-4029) div.style.position = "absolute"; scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; documentElement.removeChild( container ); // Nullify the div so it wouldn't be stored in the memory and // it will also be a sign that checks already performed div = null; } function roundPixelMeasures( measure ) { return Math.round( parseFloat( measure ) ); } var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); // Finish early in limited (non-browser) environments if ( !div.style ) { return; } // Support: IE <=9 - 11 only // Style of cloned element affects source element cloned (#8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; jQuery.extend( support, { boxSizingReliable: function() { computeStyleTests(); return boxSizingReliableVal; }, pixelBoxStyles: function() { computeStyleTests(); return pixelBoxStylesVal; }, pixelPosition: function() { computeStyleTests(); return pixelPositionVal; }, reliableMarginLeft: function() { computeStyleTests(); return reliableMarginLeftVal; }, scrollboxSize: function() { computeStyleTests(); return scrollboxSizeVal; }, // Support: IE 9 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Behavior in IE 9 is more subtle than in newer versions & it passes // some versions of this test; make sure not to make it pass there! reliableTrDimensions: function() { var table, tr, trChild, trStyle; if ( reliableTrDimensionsVal == null ) { table = document.createElement( "table" ); tr = document.createElement( "tr" ); trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px"; tr.style.height = "1px"; trChild.style.height = "9px"; documentElement .appendChild( table ) .appendChild( tr ) .appendChild( trChild ); trStyle = window.getComputedStyle( tr ); reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; documentElement.removeChild( table ); } return reliableTrDimensionsVal; } } ); } )(); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, // Support: Firefox 51+ // Retrieving style before computed somehow // fixes an issue with getting wrong values // on detached elements style = elem.style; computed = computed || getStyles( elem ); // getPropertyValue is needed for: // .css('filter') (IE 9 only, #12537) // .css('--customProperty) (#3144) if ( computed ) { ret = computed.getPropertyValue( name ) || computed[ name ]; if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } // A tribute to the "awesome hack by Dean Edwards" // Android Browser returns percentage for some values, // but width seems to be reliably pixels. // This is against the CSSOM draft spec: // https://drafts.csswg.org/cssom/#resolved-values if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { // Remember the original values width = style.width; minWidth = style.minWidth; maxWidth = style.maxWidth; // Put in the new values to get a computed value out style.minWidth = style.maxWidth = style.width = ret; ret = computed.width; // Revert the changed values style.width = width; style.minWidth = minWidth; style.maxWidth = maxWidth; } } return ret !== undefined ? // Support: IE <=9 - 11 only // IE returns zIndex value as an integer. ret + "" : ret; } function addGetHookIf( conditionFn, hookFn ) { // Define the hook, we'll check on the first run if it's really needed. return { get: function() { if ( conditionFn() ) { // Hook not needed (or it's not possible to use it due // to missing dependency), remove it. delete this.get; return; } // Hook needed; redefine it so that the support test is not executed again. return ( this.get = hookFn ).apply( this, arguments ); } }; } var cssPrefixes = [ "Webkit", "Moz", "ms" ], emptyStyle = document.createElement( "div" ).style, vendorProps = {}; // Return a vendor-prefixed property or undefined function vendorPropName( name ) { // Check for vendor prefixed names var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), i = cssPrefixes.length; while ( i-- ) { name = cssPrefixes[ i ] + capName; if ( name in emptyStyle ) { return name; } } } // Return a potentially-mapped jQuery.cssProps or vendor prefixed property function finalPropName( name ) { var final = jQuery.cssProps[ name ] || vendorProps[ name ]; if ( final ) { return final; } if ( name in emptyStyle ) { return name; } return vendorProps[ name ] = vendorPropName( name ) || name; } var // Swappable if display is none or starts with table // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", fontWeight: "400" }; function setPositiveNumber( _elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point var matches = rcssNum.exec( value ); return matches ? // Guard against undefined "subtract", e.g., when used as in cssHooks Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : value; } function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { return 0; } for ( ; i < 4; i += 2 ) { // Both box models exclude margin if ( box === "margin" ) { delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" if ( !isBorderBox ) { // Add padding delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); // For "border" or "margin", add border if ( box !== "padding" ) { delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); // But still keep track of it otherwise } else { extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } // If we get here with a border-box (content + padding + border), we're seeking "content" or // "padding" or "margin" } else { // For "content", subtract padding if ( box === "content" ) { delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); } // For "content" or "padding", subtract border if ( box !== "margin" ) { delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); } } } // Account for positive content-box scroll gutter when requested by providing computedVal if ( !isBorderBox && computedVal >= 0 ) { // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border // Assuming integer scroll gutter, subtract the rest and round down delta += Math.max( 0, Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - computedVal - delta - extra - 0.5 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter // Use an explicit zero to avoid NaN (gh-3964) ) ) || 0; } return delta; } function getWidthOrHeight( elem, dimension, extra ) { // Start with computed style var styles = getStyles( elem ), // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). // Fake content-box until we know it's needed to know the true value. boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS( elem, dimension, styles ), offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); // Support: Firefox <=54 // Return a confounding non-pixel value or feign ignorance, as appropriate. if ( rnumnonpx.test( val ) ) { if ( !extra ) { return val; } val = "auto"; } // Support: IE 9 - 11 only // Use offsetWidth/offsetHeight for when box sizing is unreliable. // In those cases, the computed value can be trusted to be border-box. if ( ( !support.boxSizingReliable() && isBorderBox || // Support: IE 10 - 11+, Edge 15 - 18+ // IE/Edge misreport `getComputedStyle` of table rows with width/height // set in CSS while `offset*` properties report correct values. // Interestingly, in some cases IE 9 doesn't suffer from this issue. !support.reliableTrDimensions() && nodeName( elem, "tr" ) || // Fall back to offsetWidth/offsetHeight when value is "auto" // This happens for inline elements with no explicit setting (gh-3571) val === "auto" || // Support: Android <=4.1 - 4.3 only // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && // Make sure the element is visible & connected elem.getClientRects().length ) { isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; // Where available, offsetWidth/offsetHeight approximate border box dimensions. // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the // retrieved value as a content box dimension. valueIsBorderBox = offsetProp in elem; if ( valueIsBorderBox ) { val = elem[ offsetProp ]; } } // Normalize "" and auto val = parseFloat( val ) || 0; // Adjust for the element's box model return ( val + boxModelAdjustment( elem, dimension, extra || ( isBorderBox ? "border" : "content" ), valueIsBorderBox, styles, // Provide the current computed size to request scroll gutter calculation (gh-3589) val ) ) + "px"; } jQuery.extend( { // Add in style property hooks for overriding the default // behavior of getting and setting a style property cssHooks: { opacity: { get: function( elem, computed ) { if ( computed ) { // We should always get a number back from opacity var ret = curCSS( elem, "opacity" ); return ret === "" ? "1" : ret; } } } }, // Don't automatically add "px" to these possibly-unitless properties cssNumber: { "animationIterationCount": true, "columnCount": true, "fillOpacity": true, "flexGrow": true, "flexShrink": true, "fontWeight": true, "gridArea": true, "gridColumn": true, "gridColumnEnd": true, "gridColumnStart": true, "gridRow": true, "gridRowEnd": true, "gridRowStart": true, "lineHeight": true, "opacity": true, "order": true, "orphans": true, "widows": true, "zIndex": true, "zoom": true }, // Add in properties whose names you wish to fix before // setting or getting the value cssProps: {}, // Get and set the style property on a DOM Node style: function( elem, name, value, extra ) { // Don't set styles on text and comment nodes if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { return; } // Make sure that we're working with the right name var ret, type, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ), style = elem.style; // Make sure that we're working with the right name. We don't // want to query the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Gets hook for the prefixed version, then unprefixed version hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // Check if we're setting a value if ( value !== undefined ) { type = typeof value; // Convert "+=" or "-=" to relative numbers (#7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); // Fixes bug #9237 type = "number"; } // Make sure that null and NaN values aren't set (#7116) if ( value == null || value !== value ) { return; } // If a number was passed in, add the unit (except for certain CSS properties) // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append // "px" to a few hardcoded values. if ( type === "number" && !isCustomProp ) { value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); } // background-* props affect original clone's values if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { style[ name ] = "inherit"; } // If a hook was provided, use that value, otherwise just set the specified value if ( !hooks || !( "set" in hooks ) || ( value = hooks.set( elem, value, extra ) ) !== undefined ) { if ( isCustomProp ) { style.setProperty( name, value ); } else { style[ name ] = value; } } } else { // If a hook was provided get the non-computed value from there if ( hooks && "get" in hooks && ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { return ret; } // Otherwise just get the value from the style object return style[ name ]; } }, css: function( elem, name, extra, styles ) { var val, num, hooks, origName = camelCase( name ), isCustomProp = rcustomProp.test( name ); // Make sure that we're working with the right name. We don't // want to modify the value if it is a CSS custom property // since they are user-defined. if ( !isCustomProp ) { name = finalPropName( origName ); } // Try prefixed name followed by the unprefixed name hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; // If a hook was provided get the computed value from there if ( hooks && "get" in hooks ) { val = hooks.get( elem, true, extra ); } // Otherwise, if a way to get the computed value exists, use that if ( val === undefined ) { val = curCSS( elem, name, styles ); } // Convert "normal" to computed value if ( val === "normal" && name in cssNormalTransform ) { val = cssNormalTransform[ name ]; } // Make numeric if forced or a qualifier was provided and val looks numeric if ( extra === "" || extra ) { num = parseFloat( val ); return extra === true || isFinite( num ) ? num || 0 : val; } return val; } } ); jQuery.each( [ "height", "width" ], function( _i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { // Certain elements can have dimension info if we invisibly show them // but it must have a current display style that would benefit return rdisplayswap.test( jQuery.css( elem, "display" ) ) && // Support: Safari 8+ // Table columns in Safari have non-zero offsetWidth & zero // getBoundingClientRect().width unless display is changed. // Support: IE <=11 only // Running getBoundingClientRect on a disconnected node // in IE throws an error. ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? swap( elem, cssShow, function() { return getWidthOrHeight( elem, dimension, extra ); } ) : getWidthOrHeight( elem, dimension, extra ); } }, set: function( elem, value, extra ) { var matches, styles = getStyles( elem ), // Only read styles.position if the test has a chance to fail // to avoid forcing a reflow. scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css( elem, "boxSizing", false, styles ) === "border-box", subtract = extra ? boxModelAdjustment( elem, dimension, extra, isBorderBox, styles ) : 0; // Account for unreliable border-box dimensions by comparing offset* to computed and // faking a content-box to get border and padding (gh-3699) if ( isBorderBox && scrollboxSizeBuggy ) { subtract -= Math.ceil( elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - parseFloat( styles[ dimension ] ) - boxModelAdjustment( elem, dimension, "border", false, styles ) - 0.5 ); } // Convert to pixels if value adjustment is needed if ( subtract && ( matches = rcssNum.exec( value ) ) && ( matches[ 3 ] || "px" ) !== "px" ) { elem.style[ dimension ] = value; value = jQuery.css( elem, dimension ); } return setPositiveNumber( elem, value, subtract ); } }; } ); jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, function( elem, computed ) { if ( computed ) { return ( parseFloat( curCSS( elem, "marginLeft" ) ) || elem.getBoundingClientRect().left - swap( elem, { marginLeft: 0 }, function() { return elem.getBoundingClientRect().left; } ) ) + "px"; } } ); // These hooks are used by animate to expand properties jQuery.each( { margin: "", padding: "", border: "Width" }, function( prefix, suffix ) { jQuery.cssHooks[ prefix + suffix ] = { expand: function( value ) { var i = 0, expanded = {}, // Assumes a single number if not a string parts = typeof value === "string" ? value.split( " " ) : [ value ]; for ( ; i < 4; i++ ) { expanded[ prefix + cssExpand[ i ] + suffix ] = parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; } return expanded; } }; if ( prefix !== "margin" ) { jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; } } ); jQuery.fn.extend( { css: function( name, value ) { return access( this, function( elem, name, value ) { var styles, len, map = {}, i = 0; if ( Array.isArray( name ) ) { styles = getStyles( elem ); len = name.length; for ( ; i < len; i++ ) { map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); } return map; } return value !== undefined ? jQuery.style( elem, name, value ) : jQuery.css( elem, name ); }, name, value, arguments.length > 1 ); } } ); function Tween( elem, options, prop, end, easing ) { return new Tween.prototype.init( elem, options, prop, end, easing ); } jQuery.Tween = Tween; Tween.prototype = { constructor: Tween, init: function( elem, options, prop, end, easing, unit ) { this.elem = elem; this.prop = prop; this.easing = easing || jQuery.easing._default; this.options = options; this.start = this.now = this.cur(); this.end = end; this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); }, cur: function() { var hooks = Tween.propHooks[ this.prop ]; return hooks && hooks.get ? hooks.get( this ) : Tween.propHooks._default.get( this ); }, run: function( percent ) { var eased, hooks = Tween.propHooks[ this.prop ]; if ( this.options.duration ) { this.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration ); } else { this.pos = eased = percent; } this.now = ( this.end - this.start ) * eased + this.start; if ( this.options.step ) { this.options.step.call( this.elem, this.now, this ); } if ( hooks && hooks.set ) { hooks.set( this ); } else { Tween.propHooks._default.set( this ); } return this; } }; Tween.prototype.init.prototype = Tween.prototype; Tween.propHooks = { _default: { get: function( tween ) { var result; // Use a property on the element directly when it is not a DOM element, // or when there is no matching style property that exists. if ( tween.elem.nodeType !== 1 || tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { return tween.elem[ tween.prop ]; } // Passing an empty string as a 3rd parameter to .css will automatically // attempt a parseFloat and fallback to a string if the parse fails. // Simple values such as "10px" are parsed to Float; // complex values such as "rotate(1rad)" are returned as-is. result = jQuery.css( tween.elem, tween.prop, "" ); // Empty strings, null, undefined and "auto" are converted to 0. return !result || result === "auto" ? 0 : result; }, set: function( tween ) { // Use step hook for back compat. // Use cssHook if its there. // Use .style if available and use plain properties where available. if ( jQuery.fx.step[ tween.prop ] ) { jQuery.fx.step[ tween.prop ]( tween ); } else if ( tween.elem.nodeType === 1 && ( jQuery.cssHooks[ tween.prop ] || tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); } else { tween.elem[ tween.prop ] = tween.now; } } } }; // Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { set: function( tween ) { if ( tween.elem.nodeType && tween.elem.parentNode ) { tween.elem[ tween.prop ] = tween.now; } } }; jQuery.easing = { linear: function( p ) { return p; }, swing: function( p ) { return 0.5 - Math.cos( p * Math.PI ) / 2; }, _default: "swing" }; jQuery.fx = Tween.prototype.init; // Back compat <1.8 extension point jQuery.fx.step = {}; var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/; function schedule() { if ( inProgress ) { if ( document.hidden === false && window.requestAnimationFrame ) { window.requestAnimationFrame( schedule ); } else { window.setTimeout( schedule, jQuery.fx.interval ); } jQuery.fx.tick(); } } // Animations created synchronously will run synchronously function createFxNow() { window.setTimeout( function() { fxNow = undefined; } ); return ( fxNow = Date.now() ); } // Generate parameters to create a standard animation function genFx( type, includeWidth ) { var which, i = 0, attrs = { height: type }; // If we include width, step value is 1 to do all cssExpand values, // otherwise step value is 2 to skip over Left and Right includeWidth = includeWidth ? 1 : 0; for ( ; i < 4; i += 2 - includeWidth ) { which = cssExpand[ i ]; attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; } if ( includeWidth ) { attrs.opacity = attrs.width = type; } return attrs; } function createTween( value, prop, animation ) { var tween, collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), index = 0, length = collection.length; for ( ; index < length; index++ ) { if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { // We're done with this property return tween; } } } function defaultPrefilter( elem, props, opts ) { var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree( elem ), dataShow = dataPriv.get( elem, "fxshow" ); // Queue-skipping animations hijack the fx hooks if ( !opts.queue ) { hooks = jQuery._queueHooks( elem, "fx" ); if ( hooks.unqueued == null ) { hooks.unqueued = 0; oldfire = hooks.empty.fire; hooks.empty.fire = function() { if ( !hooks.unqueued ) { oldfire(); } }; } hooks.unqueued++; anim.always( function() { // Ensure the complete handler is called before this completes anim.always( function() { hooks.unqueued--; if ( !jQuery.queue( elem, "fx" ).length ) { hooks.empty.fire(); } } ); } ); } // Detect show/hide animations for ( prop in props ) { value = props[ prop ]; if ( rfxtypes.test( value ) ) { delete props[ prop ]; toggle = toggle || value === "toggle"; if ( value === ( hidden ? "hide" : "show" ) ) { // Pretend to be hidden if this is a "show" and // there is still data from a stopped show/hide if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { hidden = true; // Ignore all other no-op show/hide data } else { continue; } } orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); } } // Bail out if this is a no-op like .hide().hide() propTween = !jQuery.isEmptyObject( props ); if ( !propTween && jQuery.isEmptyObject( orig ) ) { return; } // Restrict "overflow" and "display" styles during box animations if ( isBox && elem.nodeType === 1 ) { // Support: IE <=9 - 11, Edge 12 - 15 // Record all 3 overflow attributes because IE does not infer the shorthand // from identically-valued overflowX and overflowY and Edge just mirrors // the overflowX value there. opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; // Identify a display type, preferring old show/hide data over the CSS cascade restoreDisplay = dataShow && dataShow.display; if ( restoreDisplay == null ) { restoreDisplay = dataPriv.get( elem, "display" ); } display = jQuery.css( elem, "display" ); if ( display === "none" ) { if ( restoreDisplay ) { display = restoreDisplay; } else { // Get nonempty value(s) by temporarily forcing visibility showHide( [ elem ], true ); restoreDisplay = elem.style.display || restoreDisplay; display = jQuery.css( elem, "display" ); showHide( [ elem ] ); } } // Animate inline elements as inline-block if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { if ( jQuery.css( elem, "float" ) === "none" ) { // Restore the original display value at the end of pure show/hide animations if ( !propTween ) { anim.done( function() { style.display = restoreDisplay; } ); if ( restoreDisplay == null ) { display = style.display; restoreDisplay = display === "none" ? "" : display; } } style.display = "inline-block"; } } } if ( opts.overflow ) { style.overflow = "hidden"; anim.always( function() { style.overflow = opts.overflow[ 0 ]; style.overflowX = opts.overflow[ 1 ]; style.overflowY = opts.overflow[ 2 ]; } ); } // Implement show/hide animations propTween = false; for ( prop in orig ) { // General show/hide setup for this element animation if ( !propTween ) { if ( dataShow ) { if ( "hidden" in dataShow ) { hidden = dataShow.hidden; } } else { dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); } // Store hidden/visible for toggle so `.stop().toggle()` "reverses" if ( toggle ) { dataShow.hidden = !hidden; } // Show elements before animating them if ( hidden ) { showHide( [ elem ], true ); } /* eslint-disable no-loop-func */ anim.done( function() { /* eslint-enable no-loop-func */ // The final step of a "hide" animation is actually hiding the element if ( !hidden ) { showHide( [ elem ] ); } dataPriv.remove( elem, "fxshow" ); for ( prop in orig ) { jQuery.style( elem, prop, orig[ prop ] ); } } ); } // Per-property setup propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); if ( !( prop in dataShow ) ) { dataShow[ prop ] = propTween.start; if ( hidden ) { propTween.end = propTween.start; propTween.start = 0; } } } } function propFilter( props, specialEasing ) { var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass for ( index in props ) { name = camelCase( index ); easing = specialEasing[ name ]; value = props[ index ]; if ( Array.isArray( value ) ) { easing = value[ 1 ]; value = props[ index ] = value[ 0 ]; } if ( index !== name ) { props[ name ] = value; delete props[ index ]; } hooks = jQuery.cssHooks[ name ]; if ( hooks && "expand" in hooks ) { value = hooks.expand( value ); delete props[ name ]; // Not quite $.extend, this won't overwrite existing keys. // Reusing 'index' because we have the correct "name" for ( index in value ) { if ( !( index in props ) ) { props[ index ] = value[ index ]; specialEasing[ index ] = easing; } } } else { specialEasing[ name ] = easing; } } } function Animation( elem, properties, options ) { var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always( function() { // Don't match elem in the :animated selector delete tick.elem; } ), tick = function() { if ( stopped ) { return false; } var currentTime = fxNow || createFxNow(), remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, length = animation.tweens.length; for ( ; index < length; index++ ) { animation.tweens[ index ].run( percent ); } deferred.notifyWith( elem, [ animation, percent, remaining ] ); // If there's more to do, yield if ( percent < 1 && length ) { return remaining; } // If this was an empty animation, synthesize a final progress notification if ( !length ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); } // Resolve the animation and report its conclusion deferred.resolveWith( elem, [ animation ] ); return false; }, animation = deferred.promise( { elem: elem, props: jQuery.extend( {}, properties ), opts: jQuery.extend( true, { specialEasing: {}, easing: jQuery.easing._default }, options ), originalProperties: properties, originalOptions: options, startTime: fxNow || createFxNow(), duration: options.duration, tweens: [], createTween: function( prop, end ) { var tween = jQuery.Tween( elem, animation.opts, prop, end, animation.opts.specialEasing[ prop ] || animation.opts.easing ); animation.tweens.push( tween ); return tween; }, stop: function( gotoEnd ) { var index = 0, // If we are going to the end, we want to run all the tweens // otherwise we skip this part length = gotoEnd ? animation.tweens.length : 0; if ( stopped ) { return this; } stopped = true; for ( ; index < length; index++ ) { animation.tweens[ index ].run( 1 ); } // Resolve when we played the last frame; otherwise, reject if ( gotoEnd ) { deferred.notifyWith( elem, [ animation, 1, 0 ] ); deferred.resolveWith( elem, [ animation, gotoEnd ] ); } else { deferred.rejectWith( elem, [ animation, gotoEnd ] ); } return this; } } ), props = animation.props; propFilter( props, animation.opts.specialEasing ); for ( ; index < length; index++ ) { result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); if ( result ) { if ( isFunction( result.stop ) ) { jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = result.stop.bind( result ); } return result; } } jQuery.map( props, createTween, animation ); if ( isFunction( animation.opts.start ) ) { animation.opts.start.call( elem, animation ); } // Attach callbacks from options animation .progress( animation.opts.progress ) .done( animation.opts.done, animation.opts.complete ) .fail( animation.opts.fail ) .always( animation.opts.always ); jQuery.fx.timer( jQuery.extend( tick, { elem: elem, anim: animation, queue: animation.opts.queue } ) ); return animation; } jQuery.Animation = jQuery.extend( Animation, { tweeners: { "*": [ function( prop, value ) { var tween = this.createTween( prop, value ); adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); return tween; } ] }, tweener: function( props, callback ) { if ( isFunction( props ) ) { callback = props; props = [ "*" ]; } else { props = props.match( rnothtmlwhite ); } var prop, index = 0, length = props.length; for ( ; index < length; index++ ) { prop = props[ index ]; Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; Animation.tweeners[ prop ].unshift( callback ); } }, prefilters: [ defaultPrefilter ], prefilter: function( callback, prepend ) { if ( prepend ) { Animation.prefilters.unshift( callback ); } else { Animation.prefilters.push( callback ); } } } ); jQuery.speed = function( speed, easing, fn ) { var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { complete: fn || !fn && easing || isFunction( speed ) && speed, duration: speed, easing: fn && easing || easing && !isFunction( easing ) && easing }; // Go to the end state if fx are off if ( jQuery.fx.off ) { opt.duration = 0; } else { if ( typeof opt.duration !== "number" ) { if ( opt.duration in jQuery.fx.speeds ) { opt.duration = jQuery.fx.speeds[ opt.duration ]; } else { opt.duration = jQuery.fx.speeds._default; } } } // Normalize opt.queue - true/undefined/null -> "fx" if ( opt.queue == null || opt.queue === true ) { opt.queue = "fx"; } // Queueing opt.old = opt.complete; opt.complete = function() { if ( isFunction( opt.old ) ) { opt.old.call( this ); } if ( opt.queue ) { jQuery.dequeue( this, opt.queue ); } }; return opt; }; jQuery.fn.extend( { fadeTo: function( speed, to, easing, callback ) { // Show any hidden elements after setting opacity to 0 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() // Animate to the value specified .end().animate( { opacity: to }, speed, easing, callback ); }, animate: function( prop, speed, easing, callback ) { var empty = jQuery.isEmptyObject( prop ), optall = jQuery.speed( speed, easing, callback ), doAnimation = function() { // Operate on a copy of prop so per-property easing won't be lost var anim = Animation( this, jQuery.extend( {}, prop ), optall ); // Empty animations, or finishing resolves immediately if ( empty || dataPriv.get( this, "finish" ) ) { anim.stop( true ); } }; doAnimation.finish = doAnimation; return empty || optall.queue === false ? this.each( doAnimation ) : this.queue( optall.queue, doAnimation ); }, stop: function( type, clearQueue, gotoEnd ) { var stopQueue = function( hooks ) { var stop = hooks.stop; delete hooks.stop; stop( gotoEnd ); }; if ( typeof type !== "string" ) { gotoEnd = clearQueue; clearQueue = type; type = undefined; } if ( clearQueue ) { this.queue( type || "fx", [] ); } return this.each( function() { var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get( this ); if ( index ) { if ( data[ index ] && data[ index ].stop ) { stopQueue( data[ index ] ); } } else { for ( index in data ) { if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { stopQueue( data[ index ] ); } } } for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && ( type == null || timers[ index ].queue === type ) ) { timers[ index ].anim.stop( gotoEnd ); dequeue = false; timers.splice( index, 1 ); } } // Start the next in the queue if the last step wasn't forced. // Timers currently will call their complete callbacks, which // will dequeue but only if they were gotoEnd. if ( dequeue || !gotoEnd ) { jQuery.dequeue( this, type ); } } ); }, finish: function( type ) { if ( type !== false ) { type = type || "fx"; } return this.each( function() { var index, data = dataPriv.get( this ), queue = data[ type + "queue" ], hooks = data[ type + "queueHooks" ], timers = jQuery.timers, length = queue ? queue.length : 0; // Enable finishing flag on private data data.finish = true; // Empty the queue first jQuery.queue( this, type, [] ); if ( hooks && hooks.stop ) { hooks.stop.call( this, true ); } // Look for any active animations, and finish them for ( index = timers.length; index--; ) { if ( timers[ index ].elem === this && timers[ index ].queue === type ) { timers[ index ].anim.stop( true ); timers.splice( index, 1 ); } } // Look for any animations in the old queue and finish them for ( index = 0; index < length; index++ ) { if ( queue[ index ] && queue[ index ].finish ) { queue[ index ].finish.call( this ); } } // Turn off finishing flag delete data.finish; } ); } } ); jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? cssFn.apply( this, arguments ) : this.animate( genFx( name, true ), speed, easing, callback ); }; } ); // Generate shortcuts for custom animations jQuery.each( { slideDown: genFx( "show" ), slideUp: genFx( "hide" ), slideToggle: genFx( "toggle" ), fadeIn: { opacity: "show" }, fadeOut: { opacity: "hide" }, fadeToggle: { opacity: "toggle" } }, function( name, props ) { jQuery.fn[ name ] = function( speed, easing, callback ) { return this.animate( props, speed, easing, callback ); }; } ); jQuery.timers = []; jQuery.fx.tick = function() { var timer, i = 0, timers = jQuery.timers; fxNow = Date.now(); for ( ; i < timers.length; i++ ) { timer = timers[ i ]; // Run the timer and safely remove it when done (allowing for external removal) if ( !timer() && timers[ i ] === timer ) { timers.splice( i--, 1 ); } } if ( !timers.length ) { jQuery.fx.stop(); } fxNow = undefined; }; jQuery.fx.timer = function( timer ) { jQuery.timers.push( timer ); jQuery.fx.start(); }; jQuery.fx.interval = 13; jQuery.fx.start = function() { if ( inProgress ) { return; } inProgress = true; schedule(); }; jQuery.fx.stop = function() { inProgress = null; }; jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; // Based off of the plugin by Clint Helfers, with permission. // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = window.setTimeout( next, time ); hooks.stop = function() { window.clearTimeout( timeout ); }; } ); }; ( function() { var input = document.createElement( "input" ), select = document.createElement( "select" ), opt = select.appendChild( document.createElement( "option" ) ); input.type = "checkbox"; // Support: Android <=4.3 only // Default value for a checkbox should be "on" support.checkOn = input.value !== ""; // Support: IE <=11 only // Must access selectedIndex to make default options select support.optSelected = opt.selected; // Support: IE <=11 only // An input loses its value after becoming a radio input = document.createElement( "input" ); input.value = "t"; input.type = "radio"; support.radioValue = input.value === "t"; } )(); var boolHook, attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend( { attr: function( name, value ) { return access( this, jQuery.attr, name, value, arguments.length > 1 ); }, removeAttr: function( name ) { return this.each( function() { jQuery.removeAttr( this, name ); } ); } } ); jQuery.extend( { attr: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set attributes on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } // Attribute hooks are determined by the lowercase version // Grab necessary hook if one is defined if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { hooks = jQuery.attrHooks[ name.toLowerCase() ] || ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } elem.setAttribute( name, value + "" ); return value; } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } ret = jQuery.find.attr( elem, name ); // Non-existent attributes return null, we normalize to undefined return ret == null ? undefined : ret; }, attrHooks: { type: { set: function( elem, value ) { if ( !support.radioValue && value === "radio" && nodeName( elem, "input" ) ) { var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } } }, removeAttr: function( elem, value ) { var name, i = 0, // Attribute names can contain non-HTML whitespace characters // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 attrNames = value && value.match( rnothtmlwhite ); if ( attrNames && elem.nodeType === 1 ) { while ( ( name = attrNames[ i++ ] ) ) { elem.removeAttribute( name ); } } } } ); // Hooks for boolean attributes boolHook = { set: function( elem, value, name ) { if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { elem.setAttribute( name, name ); } return name; } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { var ret, handle, lowercaseName = name.toLowerCase(); if ( !isXML ) { // Avoid an infinite loop by temporarily removing this function from the getter handle = attrHandle[ lowercaseName ]; attrHandle[ lowercaseName ] = ret; ret = getter( elem, name, isXML ) != null ? lowercaseName : null; attrHandle[ lowercaseName ] = handle; } return ret; }; } ); var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i; jQuery.fn.extend( { prop: function( name, value ) { return access( this, jQuery.prop, name, value, arguments.length > 1 ); }, removeProp: function( name ) { return this.each( function() { delete this[ jQuery.propFix[ name ] || name ]; } ); } } ); jQuery.extend( { prop: function( elem, name, value ) { var ret, hooks, nType = elem.nodeType; // Don't get/set properties on text, comment and attribute nodes if ( nType === 3 || nType === 8 || nType === 2 ) { return; } if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && ( ret = hooks.set( elem, value, name ) ) !== undefined ) { return ret; } return ( elem[ name ] = value ); } if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { return ret; } return elem[ name ]; }, propHooks: { tabIndex: { get: function( elem ) { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ // Use proper attribute retrieval(#12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { return parseInt( tabindex, 10 ); } if ( rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ) { return 0; } return -1; } } }, propFix: { "for": "htmlFor", "class": "className" } } ); // Support: IE <=11 only // Accessing the selectedIndex property // forces the browser to respect setting selected // on the option // The getter ensures a default option is selected // when in an optgroup // eslint rule "no-unused-expressions" is disabled for this code // since it considers such accessions noop if ( !support.optSelected ) { jQuery.propHooks.selected = { get: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent && parent.parentNode ) { parent.parentNode.selectedIndex; } return null; }, set: function( elem ) { /* eslint no-unused-expressions: "off" */ var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } } }; } jQuery.each( [ "tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable" ], function() { jQuery.propFix[ this.toLowerCase() ] = this; } ); // Strip and collapse whitespace according to HTML spec // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace function stripAndCollapse( value ) { var tokens = value.match( rnothtmlwhite ) || []; return tokens.join( " " ); } function getClass( elem ) { return elem.getAttribute && elem.getAttribute( "class" ) || ""; } function classesToArray( value ) { if ( Array.isArray( value ) ) { return value; } if ( typeof value === "string" ) { return value.match( rnothtmlwhite ) || []; } return []; } jQuery.fn.extend( { addClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); } ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { if ( cur.indexOf( " " + clazz + " " ) < 0 ) { cur += clazz + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, removeClass: function( value ) { var classes, elem, cur, curValue, clazz, j, finalValue, i = 0; if ( isFunction( value ) ) { return this.each( function( j ) { jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); } ); } if ( !arguments.length ) { return this.attr( "class", "" ); } classes = classesToArray( value ); if ( classes.length ) { while ( ( elem = this[ i++ ] ) ) { curValue = getClass( elem ); // This expression is here for better compressibility (see addClass) cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { j = 0; while ( ( clazz = classes[ j++ ] ) ) { // Remove *all* instances while ( cur.indexOf( " " + clazz + " " ) > -1 ) { cur = cur.replace( " " + clazz + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { elem.setAttribute( "class", finalValue ); } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isValidValue = type === "string" || Array.isArray( value ); if ( typeof stateVal === "boolean" && isValidValue ) { return stateVal ? this.addClass( value ) : this.removeClass( value ); } if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( value.call( this, i, getClass( this ), stateVal ), stateVal ); } ); } return this.each( function() { var className, i, self, classNames; if ( isValidValue ) { // Toggle individual class names i = 0; self = jQuery( this ); classNames = classesToArray( value ); while ( ( className = classNames[ i++ ] ) ) { // Check each className given, space separated list if ( self.hasClass( className ) ) { self.removeClass( className ); } else { self.addClass( className ); } } // Toggle whole class name } else if ( value === undefined || type === "boolean" ) { className = getClass( this ); if ( className ) { // Store className if set dataPriv.set( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || value === false ? "" : dataPriv.get( this, "__className__" ) || "" ); } } } ); }, hasClass: function( selector ) { var className, elem, i = 0; className = " " + selector + " "; while ( ( elem = this[ i++ ] ) ) { if ( elem.nodeType === 1 && ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { return true; } } return false; } } ); var rreturn = /\r/g; jQuery.fn.extend( { val: function( value ) { var hooks, ret, valueIsFunction, elem = this[ 0 ]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; if ( hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; // Handle most common string cases if ( typeof ret === "string" ) { return ret.replace( rreturn, "" ); } // Handle cases where value is null/undef or number return ret == null ? "" : ret; } return; } valueIsFunction = isFunction( value ); return this.each( function( i ) { var val; if ( this.nodeType !== 1 ) { return; } if ( valueIsFunction ) { val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( Array.isArray( val ) ) { val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // If set returns undefined, fall back to normal setting if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } ); jQuery.extend( { valHooks: { option: { get: function( elem ) { var val = jQuery.find.attr( elem, "value" ); return val != null ? val : // Support: IE <=10 - 11 only // option.text throws exceptions (#14686, #14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); } }, select: { get: function( elem ) { var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max = one ? index + 1 : options.length; if ( index < 0 ) { i = max; } else { i = one ? index : 0; } // Loop through all the selected options for ( ; i < max; i++ ) { option = options[ i ]; // Support: IE <=9 only // IE8-9 doesn't update selected after form reset (#2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup !option.disabled && ( !option.parentNode.disabled || !nodeName( option.parentNode, "optgroup" ) ) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } return values; }, set: function( elem, value ) { var optionSet, option, options = elem.options, values = jQuery.makeArray( value ), i = options.length; while ( i-- ) { option = options[ i ]; /* eslint-disable no-cond-assign */ if ( option.selected = jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { optionSet = true; } /* eslint-enable no-cond-assign */ } // Force browsers to behave consistently when non-matching value is set if ( !optionSet ) { elem.selectedIndex = -1; } return values; } } } } ); // Radios and checkboxes getter/setter jQuery.each( [ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { set: function( elem, value ) { if ( Array.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); } } }; if ( !support.checkOn ) { jQuery.valHooks[ this ].get = function( elem ) { return elem.getAttribute( "value" ) === null ? "on" : elem.value; }; } } ); // Return jQuery for attributes-only inclusion support.focusin = "onfocusin" in window; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function( e ) { e.stopPropagation(); }; jQuery.extend( jQuery.event, { trigger: function( event, data, elem, onlyHandlers ) { var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; cur = lastElement = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "." ) > -1 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split( "." ); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf( ":" ) < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join( "." ); event.rnamespace = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === ( elem.ownerDocument || document ) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { lastElement = cur; event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( ( !special._default || special._default.apply( eventPath.pop(), data ) === false ) && acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; if ( event.isPropagationStopped() ) { lastElement.addEventListener( type, stopPropagationCallback ); } elem[ type ](); if ( event.isPropagationStopped() ) { lastElement.removeEventListener( type, stopPropagationCallback ); } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, // Piggyback on a donor event to simulate a different one // Used only for `focus(in | out)` events simulate: function( type, elem, event ) { var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true } ); jQuery.event.trigger( e, null, elem ); } } ); jQuery.fn.extend( { trigger: function( type, data ) { return this.each( function() { jQuery.event.trigger( type, data, this ); } ); }, triggerHandler: function( type, data ) { var elem = this[ 0 ]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } } ); // Support: Firefox <=44 // Firefox doesn't have focus(in | out) events // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 // // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 // focus(in | out) events fire after focus & blur events, // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 if ( !support.focusin ) { jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); }; jQuery.event.special[ fix ] = { setup: function() { // Handle: regular nodes (via `this.ownerDocument`), window // (via `this.document`) & document (via `this`). var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); dataPriv.remove( doc, fix ); } else { dataPriv.access( doc, fix, attaches ); } } }; } ); } var location = window.location; var nonce = { guid: Date.now() }; var rquery = ( /\?/ ); // Cross-browser xml parsing jQuery.parseXML = function( data ) { var xml; if ( !data || typeof data !== "string" ) { return null; } // Support: IE 9 - 11 only // IE throws on parseFromString with invalid input. try { xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); } catch ( e ) { xml = undefined; } if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }; var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i; function buildParams( prefix, obj, traditional, add ) { var name; if ( Array.isArray( obj ) ) { // Serialize array item. jQuery.each( obj, function( i, v ) { if ( traditional || rbracket.test( prefix ) ) { // Treat each array item as a scalar. add( prefix, v ); } else { // Item is non-scalar (array or object), encode its numeric index. buildParams( prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", v, traditional, add ); } } ); } else if ( !traditional && toType( obj ) === "object" ) { // Serialize object item. for ( name in obj ) { buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); } } else { // Serialize scalar item. add( prefix, obj ); } } // Serialize an array of form elements or a set of // key/values into a query string jQuery.param = function( a, traditional ) { var prefix, s = [], add = function( key, valueOrFunction ) { // If value is a function, invoke it and use its return value var value = isFunction( valueOrFunction ) ? valueOrFunction() : valueOrFunction; s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value == null ? "" : value ); }; if ( a == null ) { return ""; } // If an array was passed in, assume that it is an array of form elements. if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { // Serialize the form elements jQuery.each( a, function() { add( this.name, this.value ); } ); } else { // If traditional, encode the "old" way (the way 1.3.2 or older // did it), otherwise encode params recursively. for ( prefix in a ) { buildParams( prefix, a[ prefix ], traditional, add ); } } // Return the resulting serialization return s.join( "&" ); }; jQuery.fn.extend( { serialize: function() { return jQuery.param( this.serializeArray() ); }, serializeArray: function() { return this.map( function() { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop( this, "elements" ); return elements ? jQuery.makeArray( elements ) : this; } ) .filter( function() { var type = this.type; // Use .is( ":disabled" ) so that fieldset[disabled] works return this.name && !jQuery( this ).is( ":disabled" ) && rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) .map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { return null; } if ( Array.isArray( val ) ) { return jQuery.map( val, function( val ) { return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ); } return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; } ).get(); } } ); var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, // #7653, #8125, #8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, /* Prefilters * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) * 2) These are called: * - BEFORE asking for a transport * - AFTER param serialization (s.data is a string if s.processData is true) * 3) key is the dataType * 4) the catchall symbol "*" can be used * 5) execution will start with transport dataType and THEN continue down to "*" if needed */ prefilters = {}, /* Transports bindings * 1) key is the dataType * 2) the catchall symbol "*" can be used * 3) selection will start with transport dataType and THEN go to "*" if needed */ transports = {}, // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin originAnchor = document.createElement( "a" ); originAnchor.href = location.href; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport function addToPrefiltersOrTransports( structure ) { // dataTypeExpression is optional and defaults to "*" return function( dataTypeExpression, func ) { if ( typeof dataTypeExpression !== "string" ) { func = dataTypeExpression; dataTypeExpression = "*"; } var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; if ( isFunction( func ) ) { // For each dataType in the dataTypeExpression while ( ( dataType = dataTypes[ i++ ] ) ) { // Prepend if requested if ( dataType[ 0 ] === "+" ) { dataType = dataType.slice( 1 ) || "*"; ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); // Otherwise append } else { ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); } } } }; } // Base inspection function for prefilters and transports function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { var inspected = {}, seekingTransport = ( structure === transports ); function inspect( dataType ) { var selected; inspected[ dataType ] = true; jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) { options.dataTypes.unshift( dataTypeOrTransport ); inspect( dataTypeOrTransport ); return false; } else if ( seekingTransport ) { return !( selected = dataTypeOrTransport ); } } ); return selected; } return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); } // A special extend for ajax options // that takes "flat" options (not to be deep extended) // Fixes #9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; for ( key in src ) { if ( src[ key ] !== undefined ) { ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; } } if ( deep ) { jQuery.extend( true, target, deep ); } return target; } /* Handles responses to an ajax request: * - finds the right dataType (mediates between content-type and expected dataType) * - returns the corresponding response */ function ajaxHandleResponses( s, jqXHR, responses ) { var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes; // Remove auto dataType and get content-type in the process while ( dataTypes[ 0 ] === "*" ) { dataTypes.shift(); if ( ct === undefined ) { ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); } } // Check if we're dealing with a known content-type if ( ct ) { for ( type in contents ) { if ( contents[ type ] && contents[ type ].test( ct ) ) { dataTypes.unshift( type ); break; } } } // Check to see if we have a response for the expected dataType if ( dataTypes[ 0 ] in responses ) { finalDataType = dataTypes[ 0 ]; } else { // Try convertible dataTypes for ( type in responses ) { if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { finalDataType = type; break; } if ( !firstDataType ) { firstDataType = type; } } // Or just use first one finalDataType = finalDataType || firstDataType; } // If we found a dataType // We add the dataType to the list if needed // and return the corresponding response if ( finalDataType ) { if ( finalDataType !== dataTypes[ 0 ] ) { dataTypes.unshift( finalDataType ); } return responses[ finalDataType ]; } } /* Chain conversions given the request and the original response * Also sets the responseXXX fields on the jqXHR instance */ function ajaxConvert( s, response, jqXHR, isSuccess ) { var conv2, current, conv, tmp, prev, converters = {}, // Work with a copy of dataTypes in case we need to modify it for conversion dataTypes = s.dataTypes.slice(); // Create converters map with lowercased keys if ( dataTypes[ 1 ] ) { for ( conv in s.converters ) { converters[ conv.toLowerCase() ] = s.converters[ conv ]; } } current = dataTypes.shift(); // Convert to each sequential dataType while ( current ) { if ( s.responseFields[ current ] ) { jqXHR[ s.responseFields[ current ] ] = response; } // Apply the dataFilter if provided if ( !prev && isSuccess && s.dataFilter ) { response = s.dataFilter( response, s.dataType ); } prev = current; current = dataTypes.shift(); if ( current ) { // There's only work to do if current dataType is non-auto if ( current === "*" ) { current = prev; // Convert response if prev dataType is non-auto and differs from current } else if ( prev !== "*" && prev !== current ) { // Seek a direct converter conv = converters[ prev + " " + current ] || converters[ "* " + current ]; // If none found, seek a pair if ( !conv ) { for ( conv2 in converters ) { // If conv2 outputs current tmp = conv2.split( " " ); if ( tmp[ 1 ] === current ) { // If prev can be converted to accepted input conv = converters[ prev + " " + tmp[ 0 ] ] || converters[ "* " + tmp[ 0 ] ]; if ( conv ) { // Condense equivalence converters if ( conv === true ) { conv = converters[ conv2 ]; // Otherwise, insert the intermediate dataType } else if ( converters[ conv2 ] !== true ) { current = tmp[ 0 ]; dataTypes.unshift( tmp[ 1 ] ); } break; } } } } // Apply converter (if not an equivalence) if ( conv !== true ) { // Unless errors are allowed to bubble, catch and return them if ( conv && s.throws ) { response = conv( response ); } else { try { response = conv( response ); } catch ( e ) { return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; } } } } } } return { state: "success", data: response }; } jQuery.extend( { // Counter for holding the number of active queries active: 0, // Last-Modified header cache for next request lastModified: {}, etag: {}, ajaxSettings: { url: location.href, type: "GET", isLocal: rlocalProtocol.test( location.protocol ), global: true, processData: true, async: true, contentType: "application/x-www-form-urlencoded; charset=UTF-8", /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, throws: false, traditional: false, headers: {}, */ accepts: { "*": allTypes, text: "text/plain", html: "text/html", xml: "application/xml, text/xml", json: "application/json, text/javascript" }, contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, responseFields: { xml: "responseXML", text: "responseText", json: "responseJSON" }, // Data converters // Keys separate source (or catchall "*") and destination types with a single space converters: { // Convert anything to text "* text": String, // Text to html (true = no transformation) "text html": true, // Evaluate text as a json expression "text json": JSON.parse, // Parse text as xml "text xml": jQuery.parseXML }, // For options that shouldn't be deep extended: // you can add your own custom options here if // and when you create one that shouldn't be // deep extended (see ajaxExtend) flatOptions: { url: true, context: true } }, // Creates a full fledged settings object into target // with both ajaxSettings and settings fields. // If target is omitted, writes into ajaxSettings. ajaxSetup: function( target, settings ) { return settings ? // Building a settings object ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : // Extending ajaxSettings ajaxExtend( jQuery.ajaxSettings, target ); }, ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), ajaxTransport: addToPrefiltersOrTransports( transports ), // Main method ajax: function( url, options ) { // If url is an object, simulate pre-1.5 signature if ( typeof url === "object" ) { options = url; url = undefined; } // Force options to be an object options = options || {}; var transport, // URL without anti-cache param cacheURL, // Response headers responseHeadersString, responseHeaders, // timeout handle timeoutTimer, // Url cleanup var urlAnchor, // Request state (becomes false upon send and true upon completion) completed, // To know if global events are to be dispatched fireGlobals, // Loop variable i, // uncached part of the url uncached, // Create the final options object s = jQuery.ajaxSetup( {}, options ), // Callbacks context callbackContext = s.context || s, // Context for global events is callbackContext if it is a DOM node or jQuery collection globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ? jQuery( callbackContext ) : jQuery.event, // Deferreds deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks( "once memory" ), // Status-dependent callbacks statusCode = s.statusCode || {}, // Headers (they are sent all at once) requestHeaders = {}, requestHeadersNames = {}, // Default abort message strAbort = "canceled", // Fake xhr jqXHR = { readyState: 0, // Builds headers hashtable if needed getResponseHeader: function( key ) { var match; if ( completed ) { if ( !responseHeaders ) { responseHeaders = {}; while ( ( match = rheaders.exec( responseHeadersString ) ) ) { responseHeaders[ match[ 1 ].toLowerCase() + " " ] = ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) .concat( match[ 2 ] ); } } match = responseHeaders[ key.toLowerCase() + " " ]; } return match == null ? null : match.join( ", " ); }, // Raw string getAllResponseHeaders: function() { return completed ? responseHeadersString : null; }, // Caches the header setRequestHeader: function( name, value ) { if ( completed == null ) { name = requestHeadersNames[ name.toLowerCase() ] = requestHeadersNames[ name.toLowerCase() ] || name; requestHeaders[ name ] = value; } return this; }, // Overrides response content-type header overrideMimeType: function( type ) { if ( completed == null ) { s.mimeType = type; } return this; }, // Status-dependent callbacks statusCode: function( map ) { var code; if ( map ) { if ( completed ) { // Execute the appropriate callbacks jqXHR.always( map[ jqXHR.status ] ); } else { // Lazy-add the new callbacks in a way that preserves old ones for ( code in map ) { statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; } } } return this; }, // Cancel the request abort: function( statusText ) { var finalText = statusText || strAbort; if ( transport ) { transport.abort( finalText ); } done( 0, finalText ); return this; } }; // Attach deferreds deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) // Handle falsy url in the settings object (#10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); // Alias method option to type as per ticket #12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; // A cross-domain request is in order when the origin doesn't match the current origin. if ( s.crossDomain == null ) { urlAnchor = document.createElement( "a" ); // Support: IE <=8 - 11, Edge 12 - 15 // IE throws exception on accessing the href property if url is malformed, // e.g. http://example.com:80x/ try { urlAnchor.href = s.url; // Support: IE <=8 - 11 only // Anchor's host property isn't correctly set when s.url is relative urlAnchor.href = urlAnchor.href; s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host; } catch ( e ) { // If there is an error parsing the URL, assume it is crossDomain, // it can be rejected by the transport if it is invalid s.crossDomain = true; } } // Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param( s.data, s.traditional ); } // Apply prefilters inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); // If request was aborted inside a prefilter, stop there if ( completed ) { return jqXHR; } // We can fire global events as of now if asked to // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests if ( fireGlobals && jQuery.active++ === 0 ) { jQuery.event.trigger( "ajaxStart" ); } // Uppercase the type s.type = s.type.toUpperCase(); // Determine if request has content s.hasContent = !rnoContent.test( s.type ); // Save the URL in case we're toying with the If-Modified-Since // and/or If-None-Match header later on // Remove hash to simplify url manipulation cacheURL = s.url.replace( rhash, "" ); // More options handling for requests with no content if ( !s.hasContent ) { // Remember the hash so we can put it back uncached = s.url.slice( cacheURL.length ); // If data is available and should be processed, append data to url if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; // #9682: remove data so that it's not used in an eventual retry delete s.data; } // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) s.url = cacheURL + uncached; // Change '%20' to '+' if this is encoded form body content (gh-2658) } else if ( s.data && s.processData && ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { s.data = s.data.replace( r20, "+" ); } // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { if ( jQuery.lastModified[ cacheURL ] ) { jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); } if ( jQuery.etag[ cacheURL ] ) { jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); } } // Set the correct header, if data is being sent if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { jqXHR.setRequestHeader( "Content-Type", s.contentType ); } // Set the Accepts header for the server, depending on the dataType jqXHR.setRequestHeader( "Accept", s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : s.accepts[ "*" ] ); // Check for headers option for ( i in s.headers ) { jqXHR.setRequestHeader( i, s.headers[ i ] ); } // Allow custom headers/mimetypes and early abort if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { // Abort if not done already and return return jqXHR.abort(); } // Aborting is no longer a cancellation strAbort = "abort"; // Install callbacks on deferreds completeDeferred.add( s.complete ); jqXHR.done( s.success ); jqXHR.fail( s.error ); // Get transport transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); // If no transport, we auto-abort if ( !transport ) { done( -1, "No Transport" ); } else { jqXHR.readyState = 1; // Send global event if ( fireGlobals ) { globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); } // If request was aborted inside ajaxSend, stop there if ( completed ) { return jqXHR; } // Timeout if ( s.async && s.timeout > 0 ) { timeoutTimer = window.setTimeout( function() { jqXHR.abort( "timeout" ); }, s.timeout ); } try { completed = false; transport.send( requestHeaders, done ); } catch ( e ) { // Rethrow post-completion exceptions if ( completed ) { throw e; } // Propagate others as results done( -1, e ); } } // Callback for when everything is done function done( status, nativeStatusText, responses, headers ) { var isSuccess, success, error, response, modified, statusText = nativeStatusText; // Ignore repeat invocations if ( completed ) { return; } completed = true; // Clear timeout if it exists if ( timeoutTimer ) { window.clearTimeout( timeoutTimer ); } // Dereference transport for early garbage collection // (no matter how long the jqXHR object will be used) transport = undefined; // Cache response headers responseHeadersString = headers || ""; // Set readyState jqXHR.readyState = status > 0 ? 4 : 0; // Determine if successful isSuccess = status >= 200 && status < 300 || status === 304; // Get response data if ( responses ) { response = ajaxHandleResponses( s, jqXHR, responses ); } // Use a noop converter for missing script if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { s.converters[ "text script" ] = function() {}; } // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); // If successful, handle type chaining if ( isSuccess ) { // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. if ( s.ifModified ) { modified = jqXHR.getResponseHeader( "Last-Modified" ); if ( modified ) { jQuery.lastModified[ cacheURL ] = modified; } modified = jqXHR.getResponseHeader( "etag" ); if ( modified ) { jQuery.etag[ cacheURL ] = modified; } } // if no content if ( status === 204 || s.type === "HEAD" ) { statusText = "nocontent"; // if not modified } else if ( status === 304 ) { statusText = "notmodified"; // If we have data, let's convert it } else { statusText = response.state; success = response.data; error = response.error; isSuccess = !error; } } else { // Extract error from statusText and normalize for non-aborts error = statusText; if ( status || !statusText ) { statusText = "error"; if ( status < 0 ) { status = 0; } } } // Set data for the fake xhr object jqXHR.status = status; jqXHR.statusText = ( nativeStatusText || statusText ) + ""; // Success/Error if ( isSuccess ) { deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); } else { deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); } // Status-dependent callbacks jqXHR.statusCode( statusCode ); statusCode = undefined; if ( fireGlobals ) { globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", [ jqXHR, s, isSuccess ? success : error ] ); } // Complete completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); if ( fireGlobals ) { globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); // Handle the global AJAX counter if ( !( --jQuery.active ) ) { jQuery.event.trigger( "ajaxStop" ); } } } return jqXHR; }, getJSON: function( url, data, callback ) { return jQuery.get( url, data, callback, "json" ); }, getScript: function( url, callback ) { return jQuery.get( url, undefined, callback, "script" ); } } ); jQuery.each( [ "get", "post" ], function( _i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted if ( isFunction( data ) ) { type = type || callback; callback = data; data = undefined; } // The url can be an options object (which then must have .url) return jQuery.ajax( jQuery.extend( { url: url, type: method, dataType: type, data: data, success: callback }, jQuery.isPlainObject( url ) && url ) ); }; } ); jQuery.ajaxPrefilter( function( s ) { var i; for ( i in s.headers ) { if ( i.toLowerCase() === "content-type" ) { s.contentType = s.headers[ i ] || ""; } } } ); jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, // Make this explicit, since user can override this through ajaxSetup (#11264) type: "GET", dataType: "script", cache: true, async: false, global: false, // Only evaluate the response if it is successful (gh-4126) // dataFilter is not invoked for failure responses, so using it instead // of the default converter is kludgy but it works. converters: { "text script": function() {} }, dataFilter: function( response ) { jQuery.globalEval( response, options, doc ); } } ); }; jQuery.fn.extend( { wrapAll: function( html ) { var wrap; if ( this[ 0 ] ) { if ( isFunction( html ) ) { html = html.call( this[ 0 ] ); } // The elements to wrap the target around wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); if ( this[ 0 ].parentNode ) { wrap.insertBefore( this[ 0 ] ); } wrap.map( function() { var elem = this; while ( elem.firstElementChild ) { elem = elem.firstElementChild; } return elem; } ).append( this ); } return this; }, wrapInner: function( html ) { if ( isFunction( html ) ) { return this.each( function( i ) { jQuery( this ).wrapInner( html.call( this, i ) ); } ); } return this.each( function() { var self = jQuery( this ), contents = self.contents(); if ( contents.length ) { contents.wrapAll( html ); } else { self.append( html ); } } ); }, wrap: function( html ) { var htmlIsFunction = isFunction( html ); return this.each( function( i ) { jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); } ); }, unwrap: function( selector ) { this.parent( selector ).not( "body" ).each( function() { jQuery( this ).replaceWith( this.childNodes ); } ); return this; } } ); jQuery.expr.pseudos.hidden = function( elem ) { return !jQuery.expr.pseudos.visible( elem ); }; jQuery.expr.pseudos.visible = function( elem ) { return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); }; jQuery.ajaxSettings.xhr = function() { try { return new window.XMLHttpRequest(); } catch ( e ) {} }; var xhrSuccessStatus = { // File protocol always yields status code 0, assume 200 0: 200, // Support: IE <=9 only // #1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); support.ajax = xhrSupported = !!xhrSupported; jQuery.ajaxTransport( function( options ) { var callback, errorCallback; // Cross domain only allowed if supported through XMLHttpRequest if ( support.cors || xhrSupported && !options.crossDomain ) { return { send: function( headers, complete ) { var i, xhr = options.xhr(); xhr.open( options.type, options.url, options.async, options.username, options.password ); // Apply custom fields if provided if ( options.xhrFields ) { for ( i in options.xhrFields ) { xhr[ i ] = options.xhrFields[ i ]; } } // Override mime type if needed if ( options.mimeType && xhr.overrideMimeType ) { xhr.overrideMimeType( options.mimeType ); } // X-Requested-With header // For cross-domain requests, seeing as conditions for a preflight are // akin to a jigsaw puzzle, we simply never set it to be sure. // (it can always be set on a per-request basis or even using ajaxSetup) // For same-domain requests, won't change header if already provided. if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { headers[ "X-Requested-With" ] = "XMLHttpRequest"; } // Set headers for ( i in headers ) { xhr.setRequestHeader( i, headers[ i ] ); } // Callback callback = function( type ) { return function() { if ( callback ) { callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null; if ( type === "abort" ) { xhr.abort(); } else if ( type === "error" ) { // Support: IE <=9 only // On a manual native abort, IE9 throws // errors on any property access that is not readyState if ( typeof xhr.status !== "number" ) { complete( 0, "error" ); } else { complete( // File: protocol always yields status 0; see #8605, #14207 xhr.status, xhr.statusText ); } } else { complete( xhrSuccessStatus[ xhr.status ] || xhr.status, xhr.statusText, // Support: IE <=9 only // IE9 has no XHR2 but throws on binary (trac-11426) // For XHR2 non-text, let the caller handle it (gh-2498) ( xhr.responseType || "text" ) !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders() ); } } }; }; // Listen to events xhr.onload = callback(); errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); // Support: IE 9 only // Use onreadystatechange to replace onabort // to handle uncaught aborts if ( xhr.onabort !== undefined ) { xhr.onabort = errorCallback; } else { xhr.onreadystatechange = function() { // Check readyState before timeout as it changes if ( xhr.readyState === 4 ) { // Allow onerror to be called first, // but that will not handle a native abort // Also, save errorCallback to a variable // as xhr.onerror cannot be accessed window.setTimeout( function() { if ( callback ) { errorCallback(); } } ); } }; } // Create the abort callback callback = callback( "abort" ); try { // Do send the request (this may raise an exception) xhr.send( options.hasContent && options.data || null ); } catch ( e ) { // #14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } } }, abort: function() { if ( callback ) { callback(); } } }; } } ); // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) jQuery.ajaxPrefilter( function( s ) { if ( s.crossDomain ) { s.contents.script = false; } } ); // Install script dataType jQuery.ajaxSetup( { accepts: { script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" }, contents: { script: /\b(?:java|ecma)script\b/ }, converters: { "text script": function( text ) { jQuery.globalEval( text ); return text; } } } ); // Handle cache's special case and crossDomain jQuery.ajaxPrefilter( "script", function( s ) { if ( s.cache === undefined ) { s.cache = false; } if ( s.crossDomain ) { s.type = "GET"; } } ); // Bind script tag hack transport jQuery.ajaxTransport( "script", function( s ) { // This transport only deals with cross domain or forced-by-attrs requests if ( s.crossDomain || s.scriptAttrs ) { var script, callback; return { send: function( _, complete ) { script = jQuery( " ================================================ FILE: static/common/user/uedit/dialogs/attachment/attachment.css ================================================ @charset "utf-8"; /* dialog样式 */ .wrapper { zoom: 1; width: 630px; *width: 626px; height: 380px; margin: 0 auto; padding: 10px; position: relative; font-family: sans-serif; } /*tab样式框大小*/ .tabhead { float:left; } .tabbody { width: 100%; height: 346px; position: relative; clear: both; } .tabbody .panel { position: absolute; width: 0; height: 0; background: #fff; overflow: hidden; display: none; } .tabbody .panel.focus { width: 100%; height: 346px; display: block; } /* 上传附件 */ .tabbody #upload.panel { width: 0; height: 0; overflow: hidden; position: absolute !important; clip: rect(1px, 1px, 1px, 1px); background: #fff; display: block; } .tabbody #upload.panel.focus { width: 100%; height: 346px; display: block; clip: auto; } #upload .queueList { margin: 0; width: 100%; height: 100%; position: absolute; overflow: hidden; } #upload p { margin: 0; } .element-invisible { width: 0 !important; height: 0 !important; border: 0; padding: 0; margin: 0; overflow: hidden; position: absolute !important; clip: rect(1px, 1px, 1px, 1px); } #upload .placeholder { margin: 10px; border: 2px dashed #e6e6e6; *border: 0px dashed #e6e6e6; height: 172px; padding-top: 150px; text-align: center; background: url(./images/image.png) center 70px no-repeat; color: #cccccc; font-size: 18px; position: relative; top:0; *top: 10px; } #upload .placeholder .webuploader-pick { font-size: 18px; background: #00b7ee; border-radius: 3px; line-height: 44px; padding: 0 30px; *width: 120px; color: #fff; display: inline-block; margin: 0 auto 20px auto; cursor: pointer; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } #upload .placeholder .webuploader-pick-hover { background: #00a2d4; } #filePickerContainer { text-align: center; } #upload .placeholder .flashTip { color: #666666; font-size: 12px; position: absolute; width: 100%; text-align: center; bottom: 20px; } #upload .placeholder .flashTip a { color: #0785d1; text-decoration: none; } #upload .placeholder .flashTip a:hover { text-decoration: underline; } #upload .placeholder.webuploader-dnd-over { border-color: #999999; } #upload .filelist { list-style: none; margin: 0; padding: 0; overflow-x: hidden; overflow-y: auto; position: relative; height: 300px; } #upload .filelist:after { content: ''; display: block; width: 0; height: 0; overflow: hidden; clear: both; } #upload .filelist li { width: 113px; height: 113px; background: url(./images/bg.png); text-align: center; margin: 9px 0 0 9px; *margin: 6px 0 0 6px; position: relative; display: block; float: left; overflow: hidden; font-size: 12px; } #upload .filelist li p.log { position: relative; top: -45px; } #upload .filelist li p.title { position: absolute; top: 0; left: 0; width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; top: 5px; text-indent: 5px; text-align: left; } #upload .filelist li p.progress { position: absolute; width: 100%; bottom: 0; left: 0; height: 8px; overflow: hidden; z-index: 50; margin: 0; border-radius: 0; background: none; -webkit-box-shadow: 0 0 0; } #upload .filelist li p.progress span { display: none; overflow: hidden; width: 0; height: 100%; background: #1483d8 url(./images/progress.png) repeat-x; -webit-transition: width 200ms linear; -moz-transition: width 200ms linear; -o-transition: width 200ms linear; -ms-transition: width 200ms linear; transition: width 200ms linear; -webkit-animation: progressmove 2s linear infinite; -moz-animation: progressmove 2s linear infinite; -o-animation: progressmove 2s linear infinite; -ms-animation: progressmove 2s linear infinite; animation: progressmove 2s linear infinite; -webkit-transform: translateZ(0); } @-webkit-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @-moz-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } #upload .filelist li p.imgWrap { position: relative; z-index: 2; line-height: 113px; vertical-align: middle; overflow: hidden; width: 113px; height: 113px; -webkit-transform-origin: 50% 50%; -moz-transform-origin: 50% 50%; -o-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; -webit-transition: 200ms ease-out; -moz-transition: 200ms ease-out; -o-transition: 200ms ease-out; -ms-transition: 200ms ease-out; transition: 200ms ease-out; } #upload .filelist li p.imgWrap.notimage { margin-top: 0; width: 111px; height: 111px; border: 1px #eeeeee solid; } #upload .filelist li p.imgWrap.notimage i.file-preview { margin-top: 15px; } #upload .filelist li img { width: 100%; } #upload .filelist li p.error { background: #f43838; color: #fff; position: absolute; bottom: 0; left: 0; height: 28px; line-height: 28px; width: 100%; z-index: 100; display:none; } #upload .filelist li .success { display: block; position: absolute; left: 0; bottom: 0; height: 40px; width: 100%; z-index: 200; background: url(./images/success.png) no-repeat right bottom; background-image: url(./images/success.gif) \9; } #upload .filelist li.filePickerBlock { width: 113px; height: 113px; background: url(./images/image.png) no-repeat center 12px; border: 1px solid #eeeeee; border-radius: 0; } #upload .filelist li.filePickerBlock div.webuploader-pick { width: 100%; height: 100%; margin: 0; padding: 0; opacity: 0; background: none; font-size: 0; } #upload .filelist div.file-panel { position: absolute; height: 0; filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; background: rgba(0, 0, 0, 0.5); width: 100%; top: 0; left: 0; overflow: hidden; z-index: 300; } #upload .filelist div.file-panel span { width: 24px; height: 24px; display: inline; float: right; text-indent: -9999px; overflow: hidden; background: url(./images/icons.png) no-repeat; background: url(./images/icons.gif) no-repeat \9; margin: 5px 1px 1px; cursor: pointer; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #upload .filelist div.file-panel span.rotateLeft { display:none; background-position: 0 -24px; } #upload .filelist div.file-panel span.rotateLeft:hover { background-position: 0 0; } #upload .filelist div.file-panel span.rotateRight { display:none; background-position: -24px -24px; } #upload .filelist div.file-panel span.rotateRight:hover { background-position: -24px 0; } #upload .filelist div.file-panel span.cancel { background-position: -48px -24px; } #upload .filelist div.file-panel span.cancel:hover { background-position: -48px 0; } #upload .statusBar { height: 45px; border-bottom: 1px solid #dadada; margin: 0 10px; padding: 0; line-height: 45px; vertical-align: middle; position: relative; } #upload .statusBar .progress { border: 1px solid #1483d8; width: 198px; background: #fff; height: 18px; position: absolute; top: 12px; display: none; text-align: center; line-height: 18px; color: #6dbfff; margin: 0 10px 0 0; } #upload .statusBar .progress span.percentage { width: 0; height: 100%; left: 0; top: 0; background: #1483d8; position: absolute; } #upload .statusBar .progress span.text { position: relative; z-index: 10; } #upload .statusBar .info { display: inline-block; font-size: 14px; color: #666666; } #upload .statusBar .btns { position: absolute; top: 7px; right: 0; line-height: 30px; } #filePickerBtn { display: inline-block; float: left; } #upload .statusBar .btns .webuploader-pick, #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-uploading, #upload .statusBar .btns .uploadBtn.state-paused { background: #ffffff; border: 1px solid #cfcfcf; color: #565656; padding: 0 18px; display: inline-block; border-radius: 3px; margin-left: 10px; cursor: pointer; font-size: 14px; float: left; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #upload .statusBar .btns .webuploader-pick-hover, #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-uploading:hover, #upload .statusBar .btns .uploadBtn.state-paused:hover { background: #f0f0f0; } #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-paused{ background: #00b7ee; color: #fff; border-color: transparent; } #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-paused:hover{ background: #00a2d4; } #upload .statusBar .btns .uploadBtn.disabled { pointer-events: none; filter:alpha(opacity=60); -moz-opacity:0.6; -khtml-opacity: 0.6; opacity: 0.6; } /* 图片管理样式 */ #online { width: 100%; height: 336px; padding: 10px 0 0 0; } #online #fileList{ width: 100%; height: 100%; overflow-x: hidden; overflow-y: auto; position: relative; } #online ul { display: block; list-style: none; margin: 0; padding: 0; } #online li { float: left; display: block; list-style: none; padding: 0; width: 113px; height: 113px; margin: 0 0 9px 9px; *margin: 0 0 6px 6px; background-color: #eee; overflow: hidden; cursor: pointer; position: relative; } #online li.clearFloat { float: none; clear: both; display: block; width:0; height:0; margin: 0; padding: 0; } #online li img { cursor: pointer; } #online li div.file-wrapper { cursor: pointer; position: absolute; display: block; width: 111px; height: 111px; border: 1px solid #eee; background: url("./images/bg.png") repeat; } #online li div span.file-title{ display: block; padding: 0 3px; margin: 3px 0 0 0; font-size: 12px; height: 13px; color: #555555; text-align: center; width: 107px; white-space: nowrap; word-break: break-all; overflow: hidden; text-overflow: ellipsis; } #online li .icon { cursor: pointer; width: 113px; height: 113px; position: absolute; top: 0; left: 0; z-index: 2; border: 0; background-repeat: no-repeat; } #online li .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; } #online li.selected .icon { background-image: url(images/success.png); background-image: url(images/success.gif) \9; background-position: 75px 75px; } #online li.selected .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; background-position: 72px 72px; } /* 在线文件的文件预览图标 */ i.file-preview { display: block; margin: 10px auto; width: 70px; height: 70px; background-image: url("./images/file-icons.png"); background-image: url("./images/file-icons.gif") \9; background-position: -140px center; background-repeat: no-repeat; } i.file-preview.file-type-dir{ background-position: 0 center; } i.file-preview.file-type-file{ background-position: -140px center; } i.file-preview.file-type-filelist{ background-position: -210px center; } i.file-preview.file-type-zip, i.file-preview.file-type-rar, i.file-preview.file-type-7z, i.file-preview.file-type-tar, i.file-preview.file-type-gz, i.file-preview.file-type-bz2{ background-position: -280px center; } i.file-preview.file-type-xls, i.file-preview.file-type-xlsx{ background-position: -350px center; } i.file-preview.file-type-doc, i.file-preview.file-type-docx{ background-position: -420px center; } i.file-preview.file-type-ppt, i.file-preview.file-type-pptx{ background-position: -490px center; } i.file-preview.file-type-vsd{ background-position: -560px center; } i.file-preview.file-type-pdf{ background-position: -630px center; } i.file-preview.file-type-txt, i.file-preview.file-type-md, i.file-preview.file-type-json, i.file-preview.file-type-htm, i.file-preview.file-type-xml, i.file-preview.file-type-html, i.file-preview.file-type-js, i.file-preview.file-type-css, i.file-preview.file-type-php, i.file-preview.file-type-jsp, i.file-preview.file-type-asp{ background-position: -700px center; } i.file-preview.file-type-apk{ background-position: -770px center; } i.file-preview.file-type-exe{ background-position: -840px center; } i.file-preview.file-type-ipa{ background-position: -910px center; } i.file-preview.file-type-mp4, i.file-preview.file-type-swf, i.file-preview.file-type-mkv, i.file-preview.file-type-avi, i.file-preview.file-type-flv, i.file-preview.file-type-mov, i.file-preview.file-type-mpg, i.file-preview.file-type-mpeg, i.file-preview.file-type-ogv, i.file-preview.file-type-webm, i.file-preview.file-type-rm, i.file-preview.file-type-rmvb{ background-position: -980px center; } i.file-preview.file-type-ogg, i.file-preview.file-type-wav, i.file-preview.file-type-wmv, i.file-preview.file-type-mid, i.file-preview.file-type-mp3{ background-position: -1050px center; } i.file-preview.file-type-jpg, i.file-preview.file-type-jpeg, i.file-preview.file-type-gif, i.file-preview.file-type-bmp, i.file-preview.file-type-png, i.file-preview.file-type-psd{ background-position: -140px center; } ================================================ FILE: static/common/user/uedit/dialogs/attachment/attachment.html ================================================ ueditor图片对话框
            0%
            ================================================ FILE: static/common/user/uedit/dialogs/attachment/attachment.js ================================================ /** * User: Jinqn * Date: 14-04-08 * Time: 下午16:34 * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 */ (function () { var uploadFile, onlineFile; window.onload = function () { initTabs(); initButtons(); }; /* 初始化tab标签 */ function initTabs() { var tabs = $G('tabhead').children; for (var i = 0; i < tabs.length; i++) { domUtils.on(tabs[i], "click", function (e) { var target = e.target || e.srcElement; setTabFocus(target.getAttribute('data-content-id')); }); } setTabFocus('upload'); } /* 初始化tabbody */ function setTabFocus(id) { if(!id) return; var i, bodyId, tabs = $G('tabhead').children; for (i = 0; i < tabs.length; i++) { bodyId = tabs[i].getAttribute('data-content-id') if (bodyId == id) { domUtils.addClass(tabs[i], 'focus'); domUtils.addClass($G(bodyId), 'focus'); } else { domUtils.removeClasses(tabs[i], 'focus'); domUtils.removeClasses($G(bodyId), 'focus'); } } switch (id) { case 'upload': uploadFile = uploadFile || new UploadFile('queueList'); break; case 'online': onlineFile = onlineFile || new OnlineFile('fileList'); break; } } /* 初始化onok事件 */ function initButtons() { dialog.onok = function () { var list = [], id, tabs = $G('tabhead').children; for (var i = 0; i < tabs.length; i++) { if (domUtils.hasClass(tabs[i], 'focus')) { id = tabs[i].getAttribute('data-content-id'); break; } } switch (id) { case 'upload': list = uploadFile.getInsertList(); var count = uploadFile.getQueueCount(); if (count) { $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); return false; } break; case 'online': list = onlineFile.getInsertList(); break; } editor.execCommand('insertfile', list); }; } /* 上传附件 */ function UploadFile(target) { this.$wrap = target.constructor == String ? $('#' + target) : $(target); this.init(); } UploadFile.prototype = { init: function () { this.fileList = []; this.initContainer(); this.initUploader(); }, initContainer: function () { this.$queue = this.$wrap.find('.filelist'); }, /* 初始化容器 */ initUploader: function () { var _this = this, $ = jQuery, // just in case. Make sure it's not an other libaray. $wrap = _this.$wrap, // 图片容器 $queue = $wrap.find('.filelist'), // 状态栏,包括进度和控制按钮 $statusBar = $wrap.find('.statusBar'), // 文件总体选择信息。 $info = $statusBar.find('.info'), // 上传按钮 $upload = $wrap.find('.uploadBtn'), // 上传按钮 $filePickerBtn = $wrap.find('.filePickerBtn'), // 上传按钮 $filePickerBlock = $wrap.find('.filePickerBlock'), // 没选择文件之前的内容。 $placeHolder = $wrap.find('.placeholder'), // 总体进度条 $progress = $statusBar.find('.progress').hide(), // 添加的文件数量 fileCount = 0, // 添加的文件总大小 fileSize = 0, // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWidth = 113 * ratio, thumbnailHeight = 113 * ratio, // 可能有pedding, ready, uploading, confirm, done. state = '', // 所有文件的进度信息,key为file id percentages = {}, supportTransition = (function () { var s = document.createElement('p').style, r = 'transition' in s || 'WebkitTransition' in s || 'MozTransition' in s || 'msTransition' in s || 'OTransition' in s; s = null; return r; })(), // WebUploader实例 uploader, actionUrl = editor.getActionUrl(editor.getOpt('fileActionName')), fileMaxSize = editor.getOpt('fileMaxSize'), acceptExtensions = (editor.getOpt('fileAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; if (!WebUploader.Uploader.support()) { $('#filePickerReady').after($('
            ').html(lang.errorNotSupport)).hide(); return; } else if (!editor.getOpt('fileActionName')) { $('#filePickerReady').after($('
            ').html(lang.errorLoadConfig)).hide(); return; } uploader = _this.uploader = WebUploader.create({ pick: { id: '#filePickerReady', label: lang.uploadSelectFile }, swf: '../../third-party/webuploader/Uploader.swf', server: actionUrl, fileVal: editor.getOpt('fileFieldName'), duplicate: true, fileSingleSizeLimit: fileMaxSize, compress: false }); uploader.addButton({ id: '#filePickerBlock' }); uploader.addButton({ id: '#filePickerBtn', label: lang.uploadAddFile }); setState('pedding'); // 当有文件添加进来时执行,负责view的创建 function addFile(file) { var $li = $('
          • ' + '

            ' + file.name + '

            ' + '

            ' + '

            ' + '
          • '), $btns = $('
            ' + '' + lang.uploadDelete + '' + '' + lang.uploadTurnRight + '' + '' + lang.uploadTurnLeft + '
            ').appendTo($li), $prgress = $li.find('p.progress span'), $wrap = $li.find('p.imgWrap'), $info = $('

            ').hide().appendTo($li), showError = function (code) { switch (code) { case 'exceed_size': text = lang.errorExceedSize; break; case 'interrupt': text = lang.errorInterrupt; break; case 'http': text = lang.errorHttp; break; case 'not_allow_type': text = lang.errorFileType; break; default: text = lang.errorUploadRetry; break; } $info.text(text).show(); }; if (file.getStatus() === 'invalid') { showError(file.statusText); } else { $wrap.text(lang.uploadPreview); if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { $wrap.empty().addClass('notimage').append('' + '' + file.name + ''); } else { if (browser.ie && browser.version <= 7) { $wrap.text(lang.uploadNoPreview); } else { uploader.makeThumb(file, function (error, src) { if (error || !src) { $wrap.text(lang.uploadNoPreview); } else { var $img = $(''); $wrap.empty().append($img); $img.on('error', function () { $wrap.text(lang.uploadNoPreview); }); } }, thumbnailWidth, thumbnailHeight); } } percentages[ file.id ] = [ file.size, 0 ]; file.rotation = 0; /* 检查文件格式 */ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { showError('not_allow_type'); uploader.removeFile(file); } } file.on('statuschange', function (cur, prev) { if (prev === 'progress') { $prgress.hide().width(0); } else if (prev === 'queued') { $li.off('mouseenter mouseleave'); $btns.remove(); } // 成功 if (cur === 'error' || cur === 'invalid') { showError(file.statusText); percentages[ file.id ][ 1 ] = 1; } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { percentages[ file.id ][ 1 ] = 0; } else if (cur === 'progress') { $info.hide(); $prgress.css('display', 'block'); } else if (cur === 'complete') { } $li.removeClass('state-' + prev).addClass('state-' + cur); }); $li.on('mouseenter', function () { $btns.stop().animate({height: 30}); }); $li.on('mouseleave', function () { $btns.stop().animate({height: 0}); }); $btns.on('click', 'span', function () { var index = $(this).index(), deg; switch (index) { case 0: uploader.removeFile(file); return; case 1: file.rotation += 90; break; case 2: file.rotation -= 90; break; } if (supportTransition) { deg = 'rotate(' + file.rotation + 'deg)'; $wrap.css({ '-webkit-transform': deg, '-mos-transform': deg, '-o-transform': deg, 'transform': deg }); } else { $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); } }); $li.insertBefore($filePickerBlock); } // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); delete percentages[ file.id ]; updateTotalProgress(); $li.off().find('.file-panel').off().end().remove(); } function updateTotalProgress() { var loaded = 0, total = 0, spans = $progress.children(), percent; $.each(percentages, function (k, v) { total += v[ 0 ]; loaded += v[ 0 ] * v[ 1 ]; }); percent = total ? loaded / total : 0; spans.eq(0).text(Math.round(percent * 100) + '%'); spans.eq(1).css('width', Math.round(percent * 100) + '%'); updateStatus(); } function setState(val, files) { if (val != state) { var stats = uploader.getStats(); $upload.removeClass('state-' + state); $upload.addClass('state-' + val); switch (val) { /* 未选择文件 */ case 'pedding': $queue.addClass('element-invisible'); $statusBar.addClass('element-invisible'); $placeHolder.removeClass('element-invisible'); $progress.hide(); $info.hide(); uploader.refresh(); break; /* 可以开始上传 */ case 'ready': $placeHolder.addClass('element-invisible'); $queue.removeClass('element-invisible'); $statusBar.removeClass('element-invisible'); $progress.hide(); $info.show(); $upload.text(lang.uploadStart); uploader.refresh(); break; /* 上传中 */ case 'uploading': $progress.show(); $info.hide(); $upload.text(lang.uploadPause); break; /* 暂停上传 */ case 'paused': $progress.show(); $info.hide(); $upload.text(lang.uploadContinue); break; case 'confirm': $progress.show(); $info.hide(); $upload.text(lang.uploadStart); stats = uploader.getStats(); if (stats.successNum && !stats.uploadFailNum) { setState('finish'); return; } break; case 'finish': $progress.hide(); $info.show(); if (stats.uploadFailNum) { $upload.text(lang.uploadRetry); } else { $upload.text(lang.uploadStart); } break; } state = val; updateStatus(); } if (!_this.getQueueCount()) { $upload.addClass('disabled') } else { $upload.removeClass('disabled') } } function updateStatus() { var text = '', stats; if (state === 'ready') { text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); } else if (state === 'confirm') { stats = uploader.getStats(); if (stats.uploadFailNum) { text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); } } else { stats = uploader.getStats(); text = lang.updateStatusFinish.replace('_', fileCount). replace('_KB', WebUploader.formatSize(fileSize)). replace('_', stats.successNum); if (stats.uploadFailNum) { text += lang.updateStatusError.replace('_', stats.uploadFailNum); } } $info.html(text); } uploader.on('fileQueued', function (file) { fileCount++; fileSize += file.size; if (fileCount === 1) { $placeHolder.addClass('element-invisible'); $statusBar.show(); } addFile(file); }); uploader.on('fileDequeued', function (file) { fileCount--; fileSize -= file.size; removeFile(file); updateTotalProgress(); }); uploader.on('filesQueued', function (file) { if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { setState('ready'); } updateTotalProgress(); }); uploader.on('all', function (type, files) { switch (type) { case 'uploadFinished': setState('confirm', files); break; case 'startUpload': /* 添加额外的GET参数 */ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); uploader.option('server', url); setState('uploading', files); break; case 'stopUpload': setState('paused', files); break; } }); uploader.on('uploadBeforeSend', function (file, data, header) { //这里可以通过data对象添加POST参数 header['X_Requested_With'] = 'XMLHttpRequest'; }); uploader.on('uploadProgress', function (file, percentage) { var $li = $('#' + file.id), $percent = $li.find('.progress span'); $percent.css('width', percentage * 100 + '%'); percentages[ file.id ][ 1 ] = percentage; updateTotalProgress(); }); uploader.on('uploadSuccess', function (file, ret) { var $file = $('#' + file.id); try { var responseText = (ret._raw || ret), json = utils.str2json(responseText); if (json.state == 'SUCCESS') { _this.fileList[$file.index()] = json; $file.append(''); } else { $file.find('.error').text(json.state).show(); } } catch (e) { $file.find('.error').text(lang.errorServerUpload).show(); } }); uploader.on('uploadError', function (file, code) { }); uploader.on('error', function (code, file) { if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { addFile(file); } }); uploader.on('uploadComplete', function (file, ret) { }); $upload.on('click', function () { if ($(this).hasClass('disabled')) { return false; } if (state === 'ready') { uploader.upload(); } else if (state === 'paused') { uploader.upload(); } else if (state === 'uploading') { uploader.stop(); } }); $upload.addClass('state-' + state); updateTotalProgress(); }, getQueueCount: function () { var file, i, status, readyFile = 0, files = this.uploader.getFiles(); for (i = 0; file = files[i++]; ) { status = file.getStatus(); if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; } return readyFile; }, getInsertList: function () { var i, link, data, list = [], prefix = editor.getOpt('fileUrlPrefix'); for (i = 0; i < this.fileList.length; i++) { data = this.fileList[i]; link = data.url; list.push({ title: data.original || link.substr(link.lastIndexOf('/') + 1), url: prefix + link }); } return list; } }; /* 在线附件 */ function OnlineFile(target) { this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } OnlineFile.prototype = { init: function () { this.initContainer(); this.initEvents(); this.initData(); }, /* 初始化容器 */ initContainer: function () { this.container.innerHTML = ''; this.list = document.createElement('ul'); this.clearFloat = document.createElement('li'); domUtils.addClass(this.list, 'list'); domUtils.addClass(this.clearFloat, 'clearFloat'); this.list.appendChild(this.clearFloat); this.container.appendChild(this.list); }, /* 初始化滚动事件,滚动到地步自动拉取数据 */ initEvents: function () { var _this = this; /* 滚动拉取图片 */ domUtils.on($G('fileList'), 'scroll', function(e){ var panel = this; if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { _this.getFileData(); } }); /* 选中图片 */ domUtils.on(this.list, 'click', function (e) { var target = e.target || e.srcElement, li = target.parentNode; if (li.tagName.toLowerCase() == 'li') { if (domUtils.hasClass(li, 'selected')) { domUtils.removeClasses(li, 'selected'); } else { domUtils.addClass(li, 'selected'); } } }); }, /* 初始化第一次的数据 */ initData: function () { /* 拉取数据需要使用的值 */ this.state = 0; this.listSize = editor.getOpt('fileManagerListSize'); this.listIndex = 0; this.listEnd = false; /* 第一次拉取数据 */ this.getFileData(); }, /* 向后台拉取图片列表数据 */ getFileData: function () { var _this = this; if(!_this.listEnd && !this.isLoadingData) { this.isLoadingData = true; ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), { timeout: 100000, data: utils.extend({ start: this.listIndex, size: this.listSize }, editor.queryCommandValue('serverparam')), method: 'get', onsuccess: function (r) { try { var json = eval('(' + r.responseText + ')'); if (json.state == 'SUCCESS') { _this.pushData(json.list); _this.listIndex = parseInt(json.start) + parseInt(json.list.length); if(_this.listIndex >= json.total) { _this.listEnd = true; } _this.isLoadingData = false; } } catch (e) { if(r.responseText.indexOf('ue_separate_ue') != -1) { var list = r.responseText.split(r.responseText); _this.pushData(list); _this.listIndex = parseInt(list.length); _this.listEnd = true; _this.isLoadingData = false; } } }, onerror: function () { _this.isLoadingData = false; } }); } }, /* 添加图片到列表界面上 */ pushData: function (list) { var i, item, img, filetype, preview, icon, _this = this, urlPrefix = editor.getOpt('fileManagerUrlPrefix'); for (i = 0; i < list.length; i++) { if(list[i] && list[i].url) { item = document.createElement('li'); icon = document.createElement('span'); filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1); if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) { preview = document.createElement('img'); domUtils.on(preview, 'load', (function(image){ return function(){ _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); }; })(preview)); preview.width = 113; preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); } else { var ic = document.createElement('i'), textSpan = document.createElement('span'); textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); preview = document.createElement('div'); preview.appendChild(ic); preview.appendChild(textSpan); domUtils.addClass(preview, 'file-wrapper'); domUtils.addClass(textSpan, 'file-title'); domUtils.addClass(ic, 'file-type-' + filetype); domUtils.addClass(ic, 'file-preview'); } domUtils.addClass(icon, 'icon'); item.setAttribute('data-url', urlPrefix + list[i].url); if (list[i].original) { item.setAttribute('data-title', list[i].original); } item.appendChild(preview); item.appendChild(icon); this.list.insertBefore(item, this.clearFloat); } } }, /* 改变图片大小 */ scale: function (img, w, h, type) { var ow = img.width, oh = img.height; if (type == 'justify') { if (ow >= oh) { img.width = w; img.height = h * oh / ow; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; } else { img.width = w * ow / oh; img.height = h; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; } } else { if (ow >= oh) { img.width = w * ow / oh; img.height = h; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; } else { img.width = w; img.height = h * oh / ow; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; } } }, getInsertList: function () { var i, lis = this.list.children, list = []; for (i = 0; i < lis.length; i++) { if (domUtils.hasClass(lis[i], 'selected')) { var url = lis[i].getAttribute('data-url'); var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); list.push({ title: title, url: url }); } } return list; } }; })(); ================================================ FILE: static/common/user/uedit/dialogs/background/background.css ================================================ .wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative} .tabbody{height:225px;} .tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;} .tabbody .focus { display: block;} body{font-size: 12px;color: #888;overflow: hidden;} input,label{vertical-align:middle} .clear{clear: both;} .pl{padding-left: 18px;padding-left: 23px\9;} #imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;} #imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;} #imageList img {cursor: pointer;border: 2px solid white;} .bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;} .content div{margin: 10px 0 10px 5px;} .content .iptradio{margin: 0px 5px 5px 0px;} .txt{width:280px;} .wrapcolor{height: 19px;} div.color{float: left;margin: 0;} #colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;} div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;} #custom input{height: 15px;min-height: 15px;width:20px;} #repeatType{width:100px;} /* 图片管理样式 */ #imgManager { width: 100%; height: 225px; } #imgManager #imageList{ width: 100%; overflow-x: hidden; overflow-y: auto; } #imgManager ul { display: block; list-style: none; margin: 0; padding: 0; } #imgManager li { float: left; display: block; list-style: none; padding: 0; width: 113px; height: 113px; margin: 9px 0 0 19px; background-color: #eee; overflow: hidden; cursor: pointer; position: relative; } #imgManager li.clearFloat { float: none; clear: both; display: block; width:0; height:0; margin: 0; padding: 0; } #imgManager li img { cursor: pointer; } #imgManager li .icon { cursor: pointer; width: 113px; height: 113px; position: absolute; top: 0; left: 0; z-index: 2; border: 0; background-repeat: no-repeat; } #imgManager li .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; } #imgManager li.selected .icon { background-image: url(images/success.png); background-position: 75px 75px; } #imgManager li.selected .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; background-position: 72px 72px; } ================================================ FILE: static/common/user/uedit/dialogs/background/background.html ================================================
            :
            :
            :x:px  y:px
            ================================================ FILE: static/common/user/uedit/dialogs/background/background.js ================================================ (function () { var onlineImage, backupStyle = editor.queryCommandValue('background'); window.onload = function () { initTabs(); initColorSelector(); }; /* 初始化tab标签 */ function initTabs(){ var tabs = $G('tabHeads').children; for (var i = 0; i < tabs.length; i++) { domUtils.on(tabs[i], "click", function (e) { var target = e.target || e.srcElement; for (var j = 0; j < tabs.length; j++) { if(tabs[j] == target){ tabs[j].className = "focus"; var contentId = tabs[j].getAttribute('data-content-id'); $G(contentId).style.display = "block"; if(contentId == 'imgManager') { initImagePanel(); } }else { tabs[j].className = ""; $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; } } }); } } /* 初始化颜色设置 */ function initColorSelector () { var obj = editor.queryCommandValue('background'); if (obj) { var color = obj['background-color'], repeat = obj['background-repeat'] || 'repeat', image = obj['background-image'] || '', position = obj['background-position'] || 'center center', pos = position.split(' '), x = parseInt(pos[0]) || 0, y = parseInt(pos[1]) || 0; if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; image = image.match(/url[\s]*\(([^\)]*)\)/); image = image ? image[1]:''; updateFormState('colored', color, image, repeat, x, y); } else { updateFormState(); } var updateHandler = function () { updateFormState(); updateBackground(); } domUtils.on($G('nocolorRadio'), 'click', updateBackground); domUtils.on($G('coloredRadio'), 'click', updateHandler); domUtils.on($G('url'), 'keyup', function(){ if($G('url').value && $G('alignment').style.display == "none") { utils.each($G('repeatType').children, function(item){ item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false); }); } updateHandler(); }); domUtils.on($G('repeatType'), 'change', updateHandler); domUtils.on($G('x'), 'keyup', updateBackground); domUtils.on($G('y'), 'keyup', updateBackground); initColorPicker(); } /* 初始化颜色选择器 */ function initColorPicker() { var me = editor, cp = $G("colorPicker"); /* 生成颜色选择器ui对象 */ var popup = new UE.ui.Popup({ content: new UE.ui.ColorPicker({ noColorText: me.getLang("clearColor"), editor: me, onpickcolor: function (t, color) { updateFormState('colored', color); updateBackground(); UE.ui.Popup.postHide(); }, onpicknocolor: function (t, color) { updateFormState('colored', 'transparent'); updateBackground(); UE.ui.Popup.postHide(); } }), editor: me, onhide: function () { } }); /* 设置颜色选择器 */ domUtils.on(cp, "click", function () { popup.showAnchor(this); }); domUtils.on(document, 'mousedown', function (evt) { var el = evt.target || evt.srcElement; UE.ui.Popup.postHide(el); }); domUtils.on(window, 'scroll', function () { UE.ui.Popup.postHide(); }); } /* 初始化在线图片列表 */ function initImagePanel() { onlineImage = onlineImage || new OnlineImage('imageList'); } /* 更新背景色设置面板 */ function updateFormState (radio, color, url, align, x, y) { var nocolorRadio = $G('nocolorRadio'), coloredRadio = $G('coloredRadio'); if(radio) { nocolorRadio.checked = (radio == 'colored' ? false:'checked'); coloredRadio.checked = (radio == 'colored' ? 'checked':false); } if(color) { domUtils.setStyle($G("colorPicker"), "background-color", color); } if(url && /^\//.test(url)) { var a = document.createElement('a'); a.href = url; browser.ie && (a.href = a.href); url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash); } if(url || url === '') { $G('url').value = url; } if(align) { utils.each($G('repeatType').children, function(item){ item.selected = (align == item.getAttribute('value') ? 'selected':false); }); } if(x || y) { $G('x').value = parseInt(x) || 0; $G('y').value = parseInt(y) || 0; } $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none'; $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none'; } /* 更新背景颜色 */ function updateBackground () { if ($G('coloredRadio').checked) { var color = domUtils.getStyle($G("colorPicker"), "background-color"), bgimg = $G("url").value, align = $G("repeatType").value, backgroundObj = { "background-repeat": "no-repeat", "background-position": "center center" }; if (color) backgroundObj["background-color"] = color; if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; if (align == 'self') { backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { backgroundObj["background-repeat"] = align; } editor.execCommand('background', backgroundObj); } else { editor.execCommand('background', null); } } /* 在线图片 */ function OnlineImage(target) { this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } OnlineImage.prototype = { init: function () { this.reset(); this.initEvents(); }, /* 初始化容器 */ initContainer: function () { this.container.innerHTML = ''; this.list = document.createElement('ul'); this.clearFloat = document.createElement('li'); domUtils.addClass(this.list, 'list'); domUtils.addClass(this.clearFloat, 'clearFloat'); this.list.id = 'imageListUl'; this.list.appendChild(this.clearFloat); this.container.appendChild(this.list); }, /* 初始化滚动事件,滚动到地步自动拉取数据 */ initEvents: function () { var _this = this; /* 滚动拉取图片 */ domUtils.on($G('imageList'), 'scroll', function(e){ var panel = this; if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { _this.getImageData(); } }); /* 选中图片 */ domUtils.on(this.container, 'click', function (e) { var target = e.target || e.srcElement, li = target.parentNode, nodes = $G('imageListUl').childNodes; if (li.tagName.toLowerCase() == 'li') { updateFormState('nocolor', null, ''); for (var i = 0, node; node = nodes[i++];) { if (node == li && !domUtils.hasClass(node, 'selected')) { domUtils.addClass(node, 'selected'); updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); } else { domUtils.removeClasses(node, 'selected'); } } updateBackground(); } }); }, /* 初始化第一次的数据 */ initData: function () { /* 拉取数据需要使用的值 */ this.state = 0; this.listSize = editor.getOpt('imageManagerListSize'); this.listIndex = 0; this.listEnd = false; /* 第一次拉取数据 */ this.getImageData(); }, /* 重置界面 */ reset: function() { this.initContainer(); this.initData(); }, /* 向后台拉取图片列表数据 */ getImageData: function () { var _this = this; if(!_this.listEnd && !this.isLoadingData) { this.isLoadingData = true; var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), isJsonp = utils.isCrossDomainUrl(url); ajax.request(url, { 'timeout': 100000, 'dataType': isJsonp ? 'jsonp':'', 'data': utils.extend({ start: this.listIndex, size: this.listSize }, editor.queryCommandValue('serverparam')), 'method': 'get', 'onsuccess': function (r) { try { var json = isJsonp ? r:eval('(' + r.responseText + ')'); if (json.state == 'SUCCESS') { _this.pushData(json.list); _this.listIndex = parseInt(json.start) + parseInt(json.list.length); if(_this.listIndex >= json.total) { _this.listEnd = true; } _this.isLoadingData = false; } } catch (e) { if(r.responseText.indexOf('ue_separate_ue') != -1) { var list = r.responseText.split(r.responseText); _this.pushData(list); _this.listIndex = parseInt(list.length); _this.listEnd = true; _this.isLoadingData = false; } } }, 'onerror': function () { _this.isLoadingData = false; } }); } }, /* 添加图片到列表界面上 */ pushData: function (list) { var i, item, img, icon, _this = this, urlPrefix = editor.getOpt('imageManagerUrlPrefix'); for (i = 0; i < list.length; i++) { if(list[i] && list[i].url) { item = document.createElement('li'); img = document.createElement('img'); icon = document.createElement('span'); domUtils.on(img, 'load', (function(image){ return function(){ _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); } })(img)); img.width = 113; img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); img.setAttribute('_src', urlPrefix + list[i].url); domUtils.addClass(icon, 'icon'); item.appendChild(img); item.appendChild(icon); this.list.insertBefore(item, this.clearFloat); } } }, /* 改变图片大小 */ scale: function (img, w, h, type) { var ow = img.width, oh = img.height; if (type == 'justify') { if (ow >= oh) { img.width = w; img.height = h * oh / ow; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; } else { img.width = w * ow / oh; img.height = h; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; } } else { if (ow >= oh) { img.width = w * ow / oh; img.height = h; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; } else { img.width = w; img.height = h * oh / ow; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; } } }, getInsertList: function () { var i, lis = this.list.children, list = [], align = getAlign(); for (i = 0; i < lis.length; i++) { if (domUtils.hasClass(lis[i], 'selected')) { var img = lis[i].firstChild, src = img.getAttribute('_src'); list.push({ src: src, _src: src, floatStyle: align }); } } return list; } }; dialog.onok = function () { updateBackground(); editor.fireEvent('saveScene'); }; dialog.oncancel = function () { editor.execCommand('background', backupStyle); }; })(); ================================================ FILE: static/common/user/uedit/dialogs/charts/chart.config.js ================================================ /* * 图表配置文件 * */ //不同类型的配置 var typeConfig = [ { chart: { type: 'line' }, plotOptions: { line: { dataLabels: { enabled: false }, enableMouseTracking: true } } }, { chart: { type: 'line' }, plotOptions: { line: { dataLabels: { enabled: true }, enableMouseTracking: false } } }, { chart: { type: 'area' } }, { chart: { type: 'bar' } }, { chart: { type: 'column' } }, { chart: { plotBackgroundColor: null, plotBorderWidth: null, plotShadow: false }, plotOptions: { pie: { allowPointSelect: true, cursor: 'pointer', dataLabels: { enabled: true, color: '#000000', connectorColor: '#000000', formatter: function() { return ''+ this.point.name +': '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; } } } } } ]; ================================================ FILE: static/common/user/uedit/dialogs/charts/charts.css ================================================ html, body { width: 100%; height: 100%; margin: 0; padding: 0; overflow-x: hidden; } .main { width: 100%; overflow: hidden; } .table-view { height: 100%; float: left; margin: 20px; width: 40%; } .table-view .table-container { width: 100%; margin-bottom: 50px; overflow: scroll; } .table-view th { padding: 5px 10px; background-color: #F7F7F7; } .table-view td { width: 50px; text-align: center; padding:0; } .table-container input { width: 40px; padding: 5px; border: none; outline: none; } .table-view caption { font-size: 18px; text-align: left; } .charts-view { /*margin-left: 49%!important;*/ width: 50%; margin-left: 49%; height: 400px; } .charts-container { border-left: 1px solid #c3c3c3; } .charts-format fieldset { padding-left: 20px; margin-bottom: 50px; } .charts-format legend { padding-left: 10px; padding-right: 10px; } .format-item-container { padding: 20px; } .format-item-container label { display: block; margin: 10px 0; } .charts-format .data-item { border: 1px solid black; outline: none; padding: 2px 3px; } /* 图表类型 */ .charts-type { margin-top: 50px; height: 300px; } .scroll-view { border: 1px solid #c3c3c3; border-left: none; border-right: none; overflow: hidden; } .scroll-container { margin: 20px; width: 100%; overflow: hidden; } .scroll-bed { width: 10000px; _margin-top: 20px; -webkit-transition: margin-left .5s ease; -moz-transition: margin-left .5s ease; transition: margin-left .5s ease; } .view-box { display: inline-block; *display: inline; *zoom: 1; margin-right: 20px; border: 2px solid white; line-height: 0; overflow: hidden; cursor: pointer; } .view-box img { border: 1px solid #cecece; } .view-box.selected { border-color: #7274A7; } .button-container { margin-bottom: 20px; text-align: center; } .button-container a { display: inline-block; width: 100px; height: 25px; line-height: 25px; border: 1px solid #c2ccd1; margin-right: 30px; text-decoration: none; color: black; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; } .button-container a:HOVER { background: #fcfcfc; } .button-container a:ACTIVE { border-top-color: #c2ccd1; box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); } .edui-charts-not-data { height: 100px; line-height: 100px; text-align: center; } ================================================ FILE: static/common/user/uedit/dialogs/charts/charts.html ================================================ chart


            ================================================ FILE: static/common/user/uedit/dialogs/charts/charts.js ================================================ /* * 图片转换对话框脚本 **/ var tableData = [], //编辑器页面table editorTable = null, chartsConfig = window.typeConfig, resizeTimer = null, //初始默认图表类型 currentChartType = 0; window.onload = function () { editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true); //未找到表格, 显示错误页面 if ( !editorTable ) { document.body.innerHTML = "
            未找到数据
            "; return; } //初始化图表类型选择 initChartsTypeView(); renderTable( editorTable ); initEvent(); initUserConfig( editorTable.getAttribute( "data-chart" ) ); $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" ); updateViewType( currentChartType ); dialog.addListener( "resize", function () { if ( resizeTimer != null ) { window.clearTimeout( resizeTimer ); } resizeTimer = window.setTimeout( function () { resizeTimer = null; renderCharts(); }, 500 ); } ); }; function initChartsTypeView () { var contents = []; for ( var i = 0, len = chartsConfig.length; i
            ' ); } $( "#scrollBed" ).html( contents.join( "" ) ); } //渲染table, 以便用户修改数据 function renderTable ( table ) { var tableHtml = []; //构造数据 for ( var i = 0, row; row = table.rows[ i ]; i++ ) { tableData[ i ] = []; tableHtml[ i ] = []; for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { var value = getCellValue( cell ); if ( i > 0 && j > 0 ) { value = +value; } if ( i === 0 || j === 0 ) { tableHtml[ i ].push( ''+ value +'' ); } else { tableHtml[ i ].push( '' ); } tableData[ i ][ j ] = value; } tableHtml[ i ] = tableHtml[ i ].join( "" ); } //draw 表格 $( "#tableContainer" ).html( ''+ tableHtml.join( "" ) +'
            ' ); } /* * 根据表格已有的图表属性初始化当前图表属性 */ function initUserConfig ( config ) { var parsedConfig = {}; if ( !config ) { return; } config = config.split( ";" ); $.each( config, function ( index, item ) { item = item.split( ":" ); parsedConfig[ item[ 0 ] ] = item[ 1 ]; } ); setUserConfig( parsedConfig ); } function initEvent () { var cacheValue = null, //图表类型数 typeViewCount = chartsConfig.length- 1, $chartsTypeViewBox = $( '#scrollBed .view-box' ); $( ".charts-format" ).delegate( ".format-ctrl", "change", function () { renderCharts(); } ) $( ".table-view" ).delegate( ".data-item", "focus", function () { cacheValue = this.value; } ).delegate( ".data-item", "blur", function () { if ( this.value !== cacheValue ) { renderCharts(); } cacheValue = null; } ); $( "#buttonContainer" ).delegate( "a", "click", function (e) { e.preventDefault(); if ( this.getAttribute( "data-title" ) === 'prev' ) { if ( currentChartType > 0 ) { currentChartType--; updateViewType( currentChartType ); } } else { if ( currentChartType < typeViewCount ) { currentChartType++; updateViewType( currentChartType ); } } } ); //图表类型变化 $( '#scrollBed' ).delegate( ".view-box", "click", function (e) { var index = $( this ).attr( "data-chart-type" ); $chartsTypeViewBox.removeClass( "selected" ); $( $chartsTypeViewBox[ index ] ).addClass( "selected" ); currentChartType = index | 0; //饼图, 禁用部分配置 if ( currentChartType === chartsConfig.length - 1 ) { disableNotPieConfig(); //启用完整配置 } else { enableNotPieConfig(); } renderCharts(); } ); } function renderCharts () { var data = collectData(); $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], { credits: { enabled: false }, exporting: { enabled: false }, title: { text: data.title, x: -20 //center }, subtitle: { text: data.subTitle, x: -20 }, xAxis: { title: { text: data.xTitle }, categories: data.categories }, yAxis: { title: { text: data.yTitle }, plotLines: [{ value: 0, width: 1, color: '#808080' }] }, tooltip: { enabled: true, valueSuffix: data.suffix }, legend: { layout: 'vertical', align: 'right', verticalAlign: 'middle', borderWidth: 1 }, series: data.series } )); } function updateViewType ( index ) { $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' ); } function collectData () { var form = document.forms[ 'data-form' ], data = null; if ( currentChartType !== chartsConfig.length - 1 ) { data = getSeriesAndCategories(); $.extend( data, getUserConfig() ); //饼图数据格式 } else { data = getSeriesForPieChart(); data.title = form[ 'title' ].value; data.suffix = form[ 'unit' ].value; } return data; } /** * 获取用户配置信息 */ function getUserConfig () { var form = document.forms[ 'data-form' ], info = { title: form[ 'title' ].value, subTitle: form[ 'sub-title' ].value, xTitle: form[ 'x-title' ].value, yTitle: form[ 'y-title' ].value, suffix: form[ 'unit' ].value, //数据对齐方式 tableDataFormat: getTableDataFormat (), //饼图提示文字 tip: $( "#tipInput" ).val() }; return info; } function setUserConfig ( config ) { var form = document.forms[ 'data-form' ]; config.title && ( form[ 'title' ].value = config.title ); config.subTitle && ( form[ 'sub-title' ].value = config.subTitle ); config.xTitle && ( form[ 'x-title' ].value = config.xTitle ); config.yTitle && ( form[ 'y-title' ].value = config.yTitle ); config.suffix && ( form[ 'unit' ].value = config.suffix ); config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true ); config.tip && ( form[ 'tip' ].value = config.tip ); currentChartType = config.chartType || 0; } function getSeriesAndCategories () { var form = document.forms[ 'data-form' ], series = [], categories = [], tmp = [], tableData = getTableData(); //反转数据 if ( getTableDataFormat() === "-1" ) { for ( var i = 0, len = tableData.length; i < len; i++ ) { for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) { if ( !tmp[ j ] ) { tmp[ j ] = []; } tmp[ j ][ i ] = tableData[ i ][ j ]; } } tableData = tmp; } categories = tableData[0].slice( 1 ); for ( var i = 1, data; data = tableData[ i ]; i++ ) { series.push( { name: data[ 0 ], data: data.slice( 1 ) } ); } return { series: series, categories: categories }; } /* * 获取数据源数据对齐方式 */ function getTableDataFormat () { var form = document.forms[ 'data-form' ], items = form['charts-format']; return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value; } /* * 禁用非饼图类型的配置项 */ function disableNotPieConfig() { updateConfigItem( 'disable' ); } /* * 启用非饼图类型的配置项 */ function enableNotPieConfig() { updateConfigItem( 'enable' ); } function updateConfigItem ( value ) { var table = $( "#showTable" )[ 0 ], isDisable = value === 'disable' ? true : false; //table中的input处理 for ( var i = 2 , row; row = table.rows[ i ]; i++ ) { for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { $( "input", cell ).attr( "disabled", isDisable ); } } //其他项处理 $( "input.not-pie-item" ).attr( "disabled", isDisable ); $( "#tipInput" ).attr( "disabled", !isDisable ) } /* * 获取饼图数据 * 饼图的数据只取第一行的 **/ function getSeriesForPieChart () { var series = { type: 'pie', name: $("#tipInput").val(), data: [] }, tableData = getTableData(); for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) { var title = tableData[ 0 ][ j ], val = tableData[ 1 ][ j ]; series.data.push( [ title, val ] ); } return { series: [ series ] }; } function getTableData () { var table = document.getElementById( "showTable" ), xCount = table.rows[0].cells.length - 1, values = getTableInputValue(); for ( var i = 0, value; value = values[ i ]; i++ ) { tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ]; } return tableData; } function getTableInputValue () { var table = document.getElementById( "showTable" ), inputs = table.getElementsByTagName( "input" ), values = []; for ( var i = 0, input; input = inputs[ i ]; i++ ) { values.push( input.value | 0 ); } return values; } function getCellValue ( cell ) { var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); } //dialog确认事件 dialog.onok = function () { //收集信息 var form = document.forms[ 'data-form' ], info = getUserConfig(); //添加图表类型 info.chartType = currentChartType; //同步表格数据到编辑器 syncTableData(); //执行图表命令 editor.execCommand( 'charts', info ); }; /* * 同步图表编辑视图的表格数据到编辑器里的原始表格 */ function syncTableData () { var tableData = getTableData(); for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) { for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { cell.innerHTML = tableData[ i ] [ j ]; } } } ================================================ FILE: static/common/user/uedit/dialogs/emotion/emotion.css ================================================ .jd img{ background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top; cursor:pointer;width:35px;height:35px;display:block; } .pp img{ background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top; cursor:pointer;width:25px;height:25px;display:block; } .ldw img{ background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top; cursor:pointer;width:35px;height:35px;display:block; } .tsj img{ background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top; cursor:pointer;width:35px;height:35px;display:block; } .cat img{ background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top; cursor:pointer;width:35px;height:35px;display:block; } .bb img{ background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top; cursor:pointer;width:35px;height:35px;display:block; } .youa img{ background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top; cursor:pointer;width:35px;height:35px;display:block; } .smileytable td {height: 37px;} #tabPanel{margin-left:5px;overflow: hidden;} #tabContent {float:left;background:#FFFFFF;} #tabContent div{display: none;width:480px;overflow:hidden;} #tabIconReview.show{left:17px;display:block;} .menuFocus{background:#ACCD3C;} .menuDefault{background:#FFFFFF;} #tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;} img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;} .wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;} .tabbody table{width: 100%;} .tabbody td{border:1px solid #BAC498;} .tabbody td span{display: block;zoom:1;padding:0 4px;} ================================================ FILE: static/common/user/uedit/dialogs/emotion/emotion.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/emotion/emotion.js ================================================ window.onload = function () { editor.setOpt({ emotionLocalization:false }); emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; emotion.SmileyBox = createTabList( emotion.tabNum ); emotion.tabExist = createArr( emotion.tabNum ); initImgName(); initEvtHandler( "tabHeads" ); }; function initImgName() { for ( var pro in emotion.SmilmgName ) { var tempName = emotion.SmilmgName[pro], tempBox = emotion.SmileyBox[pro], tempStr = ""; if ( tempBox.length ) return; for ( var i = 1; i <= tempName[1]; i++ ) { tempStr = tempName[0]; if ( i < 10 ) tempStr = tempStr + '0'; tempStr = tempStr + i + '.gif'; tempBox.push( tempStr ); } } } function initEvtHandler( conId ) { var tabHeads = $G( conId ); for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) { var tabObj = tabHeads.childNodes[i]; if ( tabObj.nodeType == 1 ) { domUtils.on( tabObj, "click", (function ( index ) { return function () { switchTab( index ); }; })( j ) ); j++; } } switchTab( 0 ); $G( "tabIconReview" ).style.display = 'none'; } function InsertSmiley( url, evt ) { var obj = { src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url }; obj._src = obj.src; editor.execCommand( 'insertimage', obj ); if ( !evt.ctrlKey ) { dialog.popup.hide(); } } function switchTab( index ) { autoHeight( index ); if ( emotion.tabExist[index] == 0 ) { emotion.tabExist[index] = 1; createTab( 'tab' + index ); } //获取呈现元素句柄数组 var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), i = 0, L = tabHeads.length; //隐藏所有呈现元素 for ( ; i < L; i++ ) { tabHeads[i].className = ""; tabBodys[i].style.display = "none"; } //显示对应呈现元素 tabHeads[index].className = "focus"; tabBodys[index].style.display = "block"; } function autoHeight( index ) { var iframe = dialog.getDom( "iframe" ), parent = iframe.parentNode.parentNode; switch ( index ) { case 0: iframe.style.height = "380px"; parent.style.height = "392px"; break; case 1: iframe.style.height = "220px"; parent.style.height = "232px"; break; case 2: iframe.style.height = "260px"; parent.style.height = "272px"; break; case 3: iframe.style.height = "300px"; parent.style.height = "312px"; break; case 4: iframe.style.height = "140px"; parent.style.height = "152px"; break; case 5: iframe.style.height = "260px"; parent.style.height = "272px"; break; case 6: iframe.style.height = "230px"; parent.style.height = "242px"; break; default: } } function createTab( tabName ) { var faceVersion = "?v=1.1", //版本号 tab = $G( tabName ), //获取将要生成的Div句柄 imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径 positionLine = 11 / 2, //中间数 iWidth = iHeight = 35, //图片长宽 iColWidth = 3, //表格剩余空间的显示比例 tableCss = emotion.imageCss[tabName], cssOffset = emotion.imageCssOffset[tabName], textHTML = [''], i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, sUrl, realUrl, posflag, offset, infor; for ( ; i < imgNum; ) { textHTML.push( '' ); for ( var j = 0; j < imgColNum; j++, i++ ) { faceImage = emotion.SmileyBox[tabName][i]; if ( faceImage ) { sUrl = imagePath + faceImage + faceVersion; realUrl = imagePath + faceImage; posflag = j < positionLine ? 0 : 1; offset = cssOffset * i * (-1) - 1; infor = emotion.SmileyInfor[tabName][i]; textHTML.push( '' ); } textHTML.push( '' ); } textHTML.push( '
            ' ); textHTML.push( '' ); textHTML.push( '' ); textHTML.push( '' ); } else { textHTML.push( '' ); } textHTML.push( '
            ' ); textHTML = textHTML.join( "" ); tab.innerHTML = textHTML; } function over( td, srcPath, posFlag ) { td.style.backgroundColor = "#ACCD3C"; $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")"; if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show"; $G( "tabIconReview" ).style.display = 'block'; } function out( td ) { td.style.backgroundColor = "transparent"; var tabIconRevew = $G( "tabIconReview" ); tabIconRevew.className = ""; tabIconRevew.style.display = 'none'; } function createTabList( tabNum ) { var obj = {}; for ( var i = 0; i < tabNum; i++ ) { obj["tab" + i] = []; } return obj; } function createArr( tabNum ) { var arr = []; for ( var i = 0; i < tabNum; i++ ) { arr[i] = 0; } return arr; } ================================================ FILE: static/common/user/uedit/dialogs/gmap/gmap.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/help/help.css ================================================ .wrapper{width: 370px;margin: 10px auto;zoom: 1;} .tabbody{height: 360px;} .tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;} .tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;} .tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;} .tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;} .tabbody table thead{font-weight: bold;line-height: 25px;} ================================================ FILE: static/common/user/uedit/dialogs/help/help.html ================================================ 帮助

            UEditor

            ctrl+b
            ctrl+c
            ctrl+x
            ctrl+v
            ctrl+y
            ctrl+z
            ctrl+i
            ctrl+u
            ctrl+a
            shift+enter
            alt+z
            ================================================ FILE: static/common/user/uedit/dialogs/help/help.js ================================================ /** * Created with JetBrains PhpStorm. * User: xuheng * Date: 12-9-26 * Time: 下午1:06 * To change this template use File | Settings | File Templates. */ /** * tab点击处理事件 * @param tabHeads * @param tabBodys * @param obj */ function clickHandler( tabHeads,tabBodys,obj ) { //head样式更改 for ( var k = 0, len = tabHeads.length; k < len; k++ ) { tabHeads[k].className = ""; } obj.className = "focus"; //body显隐 var tabSrc = obj.getAttribute( "tabSrc" ); for ( var j = 0, length = tabBodys.length; j < length; j++ ) { var body = tabBodys[j], id = body.getAttribute( "id" ); body.onclick = function(){ this.style.zoom = 1; }; if ( id != tabSrc ) { body.style.zIndex = 1; } else { body.style.zIndex = 200; } } } /** * TAB切换 * @param tabParentId tab的父节点ID或者对象本身 */ function switchTab( tabParentId ) { var tabElements = $G( tabParentId ).children, tabHeads = tabElements[0].children, tabBodys = tabElements[1].children; for ( var i = 0, length = tabHeads.length; i < length; i++ ) { var head = tabHeads[i]; if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); head.onclick = function () { clickHandler(tabHeads,tabBodys,this); } } } switchTab("helptab"); document.getElementById('version').innerHTML = parent.UE.version; ================================================ FILE: static/common/user/uedit/dialogs/image/image.css ================================================ @charset "utf-8"; /* dialog样式 */ .wrapper { zoom: 1; width: 630px; *width: 626px; height: 380px; margin: 0 auto; padding: 10px; position: relative; font-family: sans-serif; } /*tab样式框大小*/ .tabhead { float:left; } .tabbody { width: 100%; height: 346px; position: relative; clear: both; } .tabbody .panel { position: absolute; width: 0; height: 0; background: #fff; overflow: hidden; display: none; } .tabbody .panel.focus { width: 100%; height: 346px; display: block; } /* 图片对齐方式 */ .alignBar{ float:right; margin-top: 5px; position: relative; } .alignBar .algnLabel{ float:left; height: 20px; line-height: 20px; } .alignBar #alignIcon{ zoom:1; _display: inline; display: inline-block; position: relative; } .alignBar #alignIcon span{ float: left; cursor: pointer; display: block; width: 19px; height: 17px; margin-right: 3px; margin-left: 3px; background-image: url(./images/alignicon.jpg); } .alignBar #alignIcon .none-align{ background-position: 0 -18px; } .alignBar #alignIcon .left-align{ background-position: -20px -18px; } .alignBar #alignIcon .right-align{ background-position: -40px -18px; } .alignBar #alignIcon .center-align{ background-position: -60px -18px; } .alignBar #alignIcon .none-align.focus{ background-position: 0 0; } .alignBar #alignIcon .left-align.focus{ background-position: -20px 0; } .alignBar #alignIcon .right-align.focus{ background-position: -40px 0; } .alignBar #alignIcon .center-align.focus{ background-position: -60px 0; } /* 远程图片样式 */ #remote { z-index: 200; } #remote .top{ width: 100%; margin-top: 25px; } #remote .left{ display: block; float: left; width: 300px; height:10px; } #remote .right{ display: block; float: right; width: 300px; height:10px; } #remote .row{ margin-left: 20px; clear: both; height: 40px; } #remote .row label{ text-align: center; width: 50px; zoom:1; _display: inline; display:inline-block; vertical-align: middle; } #remote .row label.algnLabel{ float: left; } #remote input.text{ width: 150px; padding: 3px 6px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } #remote input.text:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); } #remote #url{ width: 500px; margin-bottom: 2px; } #remote #width, #remote #height{ width: 20px; margin-left: 2px; margin-right: 2px; } #remote #border, #remote #vhSpace, #remote #title{ width: 180px; margin-right: 5px; } #remote #lock{ } #remote #lockicon{ zoom: 1; _display:inline; display: inline-block; width: 20px; height: 20px; background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat; vertical-align: middle; } #remote #preview{ clear: both; width: 260px; height: 240px; z-index: 9999; margin-top: 10px; background-color: #eee; overflow: hidden; } /* 上传图片 */ .tabbody #upload.panel { width: 0; height: 0; overflow: hidden; position: absolute !important; clip: rect(1px, 1px, 1px, 1px); background: #fff; display: block; } .tabbody #upload.panel.focus { width: 100%; height: 346px; display: block; clip: auto; } #upload .queueList { margin: 0; width: 100%; height: 100%; position: absolute; overflow: hidden; } #upload p { margin: 0; } .element-invisible { width: 0 !important; height: 0 !important; border: 0; padding: 0; margin: 0; overflow: hidden; position: absolute !important; clip: rect(1px, 1px, 1px, 1px); } #upload .placeholder { margin: 10px; border: 2px dashed #e6e6e6; *border: 0px dashed #e6e6e6; height: 172px; padding-top: 150px; text-align: center; background: url(./images/image.png) center 70px no-repeat; color: #cccccc; font-size: 18px; position: relative; top:0; *top: 10px; } #upload .placeholder .webuploader-pick { font-size: 18px; background: #00b7ee; border-radius: 3px; line-height: 44px; padding: 0 30px; *width: 120px; color: #fff; display: inline-block; margin: 0 auto 20px auto; cursor: pointer; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } #upload .placeholder .webuploader-pick-hover { background: #00a2d4; } #filePickerContainer { text-align: center; } #upload .placeholder .flashTip { color: #666666; font-size: 12px; position: absolute; width: 100%; text-align: center; bottom: 20px; } #upload .placeholder .flashTip a { color: #0785d1; text-decoration: none; } #upload .placeholder .flashTip a:hover { text-decoration: underline; } #upload .placeholder.webuploader-dnd-over { border-color: #999999; } #upload .filelist { list-style: none; margin: 0; padding: 0; overflow-x: hidden; overflow-y: auto; position: relative; height: 300px; } #upload .filelist:after { content: ''; display: block; width: 0; height: 0; overflow: hidden; clear: both; position: relative; } #upload .filelist li { width: 113px; height: 113px; background: url(./images/bg.png); text-align: center; margin: 9px 0 0 9px; *margin: 6px 0 0 6px; position: relative; display: block; float: left; overflow: hidden; font-size: 12px; } #upload .filelist li p.log { position: relative; top: -45px; } #upload .filelist li p.title { position: absolute; top: 0; left: 0; width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; top: 5px; text-indent: 5px; text-align: left; } #upload .filelist li p.progress { position: absolute; width: 100%; bottom: 0; left: 0; height: 8px; overflow: hidden; z-index: 50; margin: 0; border-radius: 0; background: none; -webkit-box-shadow: 0 0 0; } #upload .filelist li p.progress span { display: none; overflow: hidden; width: 0; height: 100%; background: #1483d8 url(./images/progress.png) repeat-x; -webit-transition: width 200ms linear; -moz-transition: width 200ms linear; -o-transition: width 200ms linear; -ms-transition: width 200ms linear; transition: width 200ms linear; -webkit-animation: progressmove 2s linear infinite; -moz-animation: progressmove 2s linear infinite; -o-animation: progressmove 2s linear infinite; -ms-animation: progressmove 2s linear infinite; animation: progressmove 2s linear infinite; -webkit-transform: translateZ(0); } @-webkit-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @-moz-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } #upload .filelist li p.imgWrap { position: relative; z-index: 2; line-height: 113px; vertical-align: middle; overflow: hidden; width: 113px; height: 113px; -webkit-transform-origin: 50% 50%; -moz-transform-origin: 50% 50%; -o-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; -webit-transition: 200ms ease-out; -moz-transition: 200ms ease-out; -o-transition: 200ms ease-out; -ms-transition: 200ms ease-out; transition: 200ms ease-out; } #upload .filelist li img { width: 100%; } #upload .filelist li p.error { background: #f43838; color: #fff; position: absolute; bottom: 0; left: 0; height: 28px; line-height: 28px; width: 100%; z-index: 100; display:none; } #upload .filelist li .success { display: block; position: absolute; left: 0; bottom: 0; height: 40px; width: 100%; z-index: 200; background: url(./images/success.png) no-repeat right bottom; background: url(./images/success.gif) no-repeat right bottom \9; } #upload .filelist li.filePickerBlock { width: 113px; height: 113px; background: url(./images/image.png) no-repeat center 12px; border: 1px solid #eeeeee; border-radius: 0; } #upload .filelist li.filePickerBlock div.webuploader-pick { width: 100%; height: 100%; margin: 0; padding: 0; opacity: 0; background: none; font-size: 0; } #upload .filelist div.file-panel { position: absolute; height: 0; filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; background: rgba(0, 0, 0, 0.5); width: 100%; top: 0; left: 0; overflow: hidden; z-index: 300; } #upload .filelist div.file-panel span { width: 24px; height: 24px; display: inline; float: right; text-indent: -9999px; overflow: hidden; background: url(./images/icons.png) no-repeat; background: url(./images/icons.gif) no-repeat \9; margin: 5px 1px 1px; cursor: pointer; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #upload .filelist div.file-panel span.rotateLeft { display:none; background-position: 0 -24px; } #upload .filelist div.file-panel span.rotateLeft:hover { background-position: 0 0; } #upload .filelist div.file-panel span.rotateRight { display:none; background-position: -24px -24px; } #upload .filelist div.file-panel span.rotateRight:hover { background-position: -24px 0; } #upload .filelist div.file-panel span.cancel { background-position: -48px -24px; } #upload .filelist div.file-panel span.cancel:hover { background-position: -48px 0; } #upload .statusBar { height: 45px; border-bottom: 1px solid #dadada; margin: 0 10px; padding: 0; line-height: 45px; vertical-align: middle; position: relative; } #upload .statusBar .progress { border: 1px solid #1483d8; width: 198px; background: #fff; height: 18px; position: absolute; top: 12px; display: none; text-align: center; line-height: 18px; color: #6dbfff; margin: 0 10px 0 0; } #upload .statusBar .progress span.percentage { width: 0; height: 100%; left: 0; top: 0; background: #1483d8; position: absolute; } #upload .statusBar .progress span.text { position: relative; z-index: 10; } #upload .statusBar .info { display: inline-block; font-size: 14px; color: #666666; } #upload .statusBar .btns { position: absolute; top: 7px; right: 0; line-height: 30px; } #filePickerBtn { display: inline-block; float: left; } #upload .statusBar .btns .webuploader-pick, #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-uploading, #upload .statusBar .btns .uploadBtn.state-paused { background: #ffffff; border: 1px solid #cfcfcf; color: #565656; padding: 0 18px; display: inline-block; border-radius: 3px; margin-left: 10px; cursor: pointer; font-size: 14px; float: left; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #upload .statusBar .btns .webuploader-pick-hover, #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-uploading:hover, #upload .statusBar .btns .uploadBtn.state-paused:hover { background: #f0f0f0; } #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-paused{ background: #00b7ee; color: #fff; border-color: transparent; } #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-paused:hover{ background: #00a2d4; } #upload .statusBar .btns .uploadBtn.disabled { pointer-events: none; filter:alpha(opacity=60); -moz-opacity:0.6; -khtml-opacity: 0.6; opacity: 0.6; } /* 图片管理样式 */ #online { width: 100%; height: 336px; padding: 10px 0 0 0; } #online #imageList{ width: 100%; height: 100%; overflow-x: hidden; overflow-y: auto; position: relative; } #online ul { display: block; list-style: none; margin: 0; padding: 0; } #online li { float: left; display: block; list-style: none; padding: 0; width: 113px; height: 113px; margin: 0 0 9px 9px; *margin: 0 0 6px 6px; background-color: #eee; overflow: hidden; cursor: pointer; position: relative; } #online li.clearFloat { float: none; clear: both; display: block; width:0; height:0; margin: 0; padding: 0; } #online li img { cursor: pointer; } #online li .icon { cursor: pointer; width: 113px; height: 113px; position: absolute; top: 0; left: 0; z-index: 2; border: 0; background-repeat: no-repeat; } #online li .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; } #online li.selected .icon { background-image: url(images/success.png); background-image: url(images/success.gif)\9; background-position: 75px 75px; } #online li.selected .icon:hover { width: 107px; height: 107px; border: 3px solid #1094fa; background-position: 72px 72px; } /* 图片搜索样式 */ #search .searchBar { width: 100%; height: 30px; margin: 10px 0 5px 0; padding: 0; } #search input.text{ width: 150px; padding: 3px 6px; font-size: 14px; line-height: 1.42857143; color: #555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } #search input.text:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); } #search input.searchTxt { margin-left:5px; padding-left: 5px; background: #FFF; width: 300px; *width: 260px; height: 21px; line-height: 21px; float: left; dislay: block; } #search .searchType { width: 65px; height: 28px; padding:0; line-height: 28px; border: 1px solid #d7d7d7; border-radius: 0; vertical-align: top; margin-left: 5px; float: left; dislay: block; } #search #searchBtn, #search #searchReset { display: inline-block; margin-bottom: 0; margin-right: 5px; padding: 4px 10px; font-weight: 400; text-align: center; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; font-size: 14px; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; vertical-align: top; float: right; } #search #searchBtn { color: white; border-color: #285e8e; background-color: #3b97d7; } #search #searchReset { color: #333; border-color: #ccc; background-color: #fff; } #search #searchBtn:hover { background-color: #3276b1; } #search #searchReset:hover { background-color: #eee; } #search .msg { margin-left: 5px; } #search .searchList{ width: 100%; height: 300px; overflow: hidden; clear: both; } #search .searchList ul{ margin:0; padding:0; list-style:none; clear: both; width: 100%; height: 100%; overflow-x: hidden; overflow-y: auto; zoom: 1; position: relative; } #search .searchList li { list-style:none; float: left; display: block; width: 115px; margin: 5px 10px 5px 20px; *margin: 5px 10px 5px 15px; padding:0; font-size: 12px; box-shadow: 0 1px 3px rgba(0, 0, 0, .3); -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); position: relative; vertical-align: top; text-align: center; overflow: hidden; cursor: pointer; filter: alpha(Opacity=100); -moz-opacity: 1; opacity: 1; border: 2px solid #eee; } #search .searchList li.selected { filter: alpha(Opacity=40); -moz-opacity: 0.4; opacity: 0.4; border: 2px solid #00a0e9; } #search .searchList li p { background-color: #eee; margin: 0; padding: 0; position: relative; width:100%; height:115px; overflow: hidden; } #search .searchList li p img { cursor: pointer; border: 0; } #search .searchList li a { color: #999; border-top: 1px solid #F2F2F2; background: #FAFAFA; text-align: center; display: block; padding: 0 5px; width: 105px; height:32px; line-height:32px; white-space:nowrap; text-overflow:ellipsis; text-decoration: none; overflow: hidden; word-break: break-all; } #search .searchList a:hover { text-decoration: underline; color: #333; } #search .searchList .clearFloat{ clear: both; } ================================================ FILE: static/common/user/uedit/dialogs/image/image.html ================================================ ueditor图片对话框
              px   px
            px
            px
            0%
            ================================================ FILE: static/common/user/uedit/dialogs/image/image.js ================================================ /** * User: Jinqn * Date: 14-04-08 * Time: 下午16:34 * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 */ (function () { var remoteImage, uploadImage, onlineImage, searchImage; window.onload = function () { initTabs(); initAlign(); initButtons(); }; /* 初始化tab标签 */ function initTabs() { var tabs = $G('tabhead').children; for (var i = 0; i < tabs.length; i++) { domUtils.on(tabs[i], "click", function (e) { var target = e.target || e.srcElement; setTabFocus(target.getAttribute('data-content-id')); }); } var img = editor.selection.getRange().getClosedNode(); if (img && img.tagName && img.tagName.toLowerCase() == 'img') { setTabFocus('remote'); } else { setTabFocus('upload'); } } /* 初始化tabbody */ function setTabFocus(id) { if(!id) return; var i, bodyId, tabs = $G('tabhead').children; for (i = 0; i < tabs.length; i++) { bodyId = tabs[i].getAttribute('data-content-id'); if (bodyId == id) { domUtils.addClass(tabs[i], 'focus'); domUtils.addClass($G(bodyId), 'focus'); } else { domUtils.removeClasses(tabs[i], 'focus'); domUtils.removeClasses($G(bodyId), 'focus'); } } switch (id) { case 'remote': remoteImage = remoteImage || new RemoteImage(); break; case 'upload': setAlign(editor.getOpt('imageInsertAlign')); uploadImage = uploadImage || new UploadImage('queueList'); break; case 'online': setAlign(editor.getOpt('imageManagerInsertAlign')); onlineImage = onlineImage || new OnlineImage('imageList'); onlineImage.reset(); break; case 'search': setAlign(editor.getOpt('imageManagerInsertAlign')); searchImage = searchImage || new SearchImage(); break; } } /* 初始化onok事件 */ function initButtons() { dialog.onok = function () { var remote = false, list = [], id, tabs = $G('tabhead').children; for (var i = 0; i < tabs.length; i++) { if (domUtils.hasClass(tabs[i], 'focus')) { id = tabs[i].getAttribute('data-content-id'); break; } } switch (id) { case 'remote': list = remoteImage.getInsertList(); break; case 'upload': list = uploadImage.getInsertList(); var count = uploadImage.getQueueCount(); if (count) { $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); return false; } break; case 'online': list = onlineImage.getInsertList(); break; case 'search': list = searchImage.getInsertList(); remote = true; break; } if(list) { editor.execCommand('insertimage', list); remote && editor.fireEvent("catchRemoteImage"); } }; } /* 初始化对其方式的点击事件 */ function initAlign(){ /* 点击align图标 */ domUtils.on($G("alignIcon"), 'click', function(e){ var target = e.target || e.srcElement; if(target.className && target.className.indexOf('-align') != -1) { setAlign(target.getAttribute('data-align')); } }); } /* 设置对齐方式 */ function setAlign(align){ align = align || 'none'; var aligns = $G("alignIcon").children; for(i = 0; i < aligns.length; i++){ if(aligns[i].getAttribute('data-align') == align) { domUtils.addClass(aligns[i], 'focus'); $G("align").value = aligns[i].getAttribute('data-align'); } else { domUtils.removeClasses(aligns[i], 'focus'); } } } /* 获取对齐方式 */ function getAlign(){ var align = $G("align").value || 'none'; return align == 'none' ? '':align; } /* 在线图片 */ function RemoteImage(target) { this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } RemoteImage.prototype = { init: function () { this.initContainer(); this.initEvents(); }, initContainer: function () { this.dom = { 'url': $G('url'), 'width': $G('width'), 'height': $G('height'), 'border': $G('border'), 'vhSpace': $G('vhSpace'), 'title': $G('title'), 'align': $G('align') }; var img = editor.selection.getRange().getClosedNode(); if (img) { this.setImage(img); } }, initEvents: function () { var _this = this, locker = $G('lock'); /* 改变url */ domUtils.on($G("url"), 'keyup', updatePreview); domUtils.on($G("border"), 'keyup', updatePreview); domUtils.on($G("title"), 'keyup', updatePreview); domUtils.on($G("width"), 'keyup', function(){ updatePreview(); if(locker.checked) { var proportion =locker.getAttribute('data-proportion'); $G('height').value = Math.round(this.value / proportion); } else { _this.updateLocker(); } }); domUtils.on($G("height"), 'keyup', function(){ updatePreview(); if(locker.checked) { var proportion =locker.getAttribute('data-proportion'); $G('width').value = Math.round(this.value * proportion); } else { _this.updateLocker(); } }); domUtils.on($G("lock"), 'change', function(){ var proportion = parseInt($G("width").value) /parseInt($G("height").value); locker.setAttribute('data-proportion', proportion); }); function updatePreview(){ _this.setPreview(); } }, updateLocker: function(){ var width = $G('width').value, height = $G('height').value, locker = $G('lock'); if(width && height && width == parseInt(width) && height == parseInt(height)) { locker.disabled = false; locker.title = ''; } else { locker.checked = false; locker.disabled = 'disabled'; locker.title = lang.remoteLockError; } }, setImage: function(img){ /* 不是正常的图片 */ if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; var wordImgFlag = img.getAttribute("word_img"), src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), align = editor.queryCommandValue("imageFloat"); /* 防止onchange事件循环调用 */ if (src !== $G("url").value) $G("url").value = src; if(src) { /* 设置表单内容 */ $G("width").value = img.width || ''; $G("height").value = img.height || ''; $G("border").value = img.getAttribute("border") || '0'; $G("vhSpace").value = img.getAttribute("vspace") || '0'; $G("title").value = img.title || img.alt || ''; setAlign(align); this.setPreview(); this.updateLocker(); } }, getData: function(){ var data = {}; for(var k in this.dom){ data[k] = this.dom[k].value; } return data; }, setPreview: function(){ var url = $G('url').value, ow = parseInt($G('width').value, 10) || 0, oh = parseInt($G('height').value, 10) || 0, border = parseInt($G('border').value, 10) || 0, title = $G('title').value, preview = $G('preview'), width, height; url = utils.unhtmlForUrl(url); title = utils.unhtml(title); width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth)); width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2)); height = (!ow || !oh) ? '':width*oh/ow; if(url) { preview.innerHTML = ''; } }, getInsertList: function () { var data = this.getData(); if(data['url']) { return [{ src: data['url'], _src: data['url'], width: data['width'] || '', height: data['height'] || '', border: data['border'] || '', floatStyle: data['align'] || '', vspace: data['vhSpace'] || '', title: data['title'] || '', alt: data['title'] || '', style: "width:" + data['width'] + "px;height:" + data['height'] + "px;" }]; } else { return []; } } }; /* 上传图片 */ function UploadImage(target) { this.$wrap = target.constructor == String ? $('#' + target) : $(target); this.init(); } UploadImage.prototype = { init: function () { this.imageList = []; this.initContainer(); this.initUploader(); }, initContainer: function () { this.$queue = this.$wrap.find('.filelist'); }, /* 初始化容器 */ initUploader: function () { var _this = this, $ = jQuery, // just in case. Make sure it's not an other libaray. $wrap = _this.$wrap, // 图片容器 $queue = $wrap.find('.filelist'), // 状态栏,包括进度和控制按钮 $statusBar = $wrap.find('.statusBar'), // 文件总体选择信息。 $info = $statusBar.find('.info'), // 上传按钮 $upload = $wrap.find('.uploadBtn'), // 上传按钮 $filePickerBtn = $wrap.find('.filePickerBtn'), // 上传按钮 $filePickerBlock = $wrap.find('.filePickerBlock'), // 没选择文件之前的内容。 $placeHolder = $wrap.find('.placeholder'), // 总体进度条 $progress = $statusBar.find('.progress').hide(), // 添加的文件数量 fileCount = 0, // 添加的文件总大小 fileSize = 0, // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWidth = 113 * ratio, thumbnailHeight = 113 * ratio, // 可能有pedding, ready, uploading, confirm, done. state = '', // 所有文件的进度信息,key为file id percentages = {}, supportTransition = (function () { var s = document.createElement('p').style, r = 'transition' in s || 'WebkitTransition' in s || 'MozTransition' in s || 'msTransition' in s || 'OTransition' in s; s = null; return r; })(), // WebUploader实例 uploader, actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')), acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), imageMaxSize = editor.getOpt('imageMaxSize'), imageCompressBorder = editor.getOpt('imageCompressBorder'); if (!WebUploader.Uploader.support()) { $('#filePickerReady').after($('
            ').html(lang.errorNotSupport)).hide(); return; } else if (!editor.getOpt('imageActionName')) { $('#filePickerReady').after($('
            ').html(lang.errorLoadConfig)).hide(); return; } uploader = _this.uploader = WebUploader.create({ pick: { id: '#filePickerReady', label: lang.uploadSelectFile }, accept: { title: 'Images', extensions: acceptExtensions, mimeTypes: 'image/*' }, swf: '../../third-party/webuploader/Uploader.swf', server: actionUrl, fileVal: editor.getOpt('imageFieldName'), duplicate: true, fileSingleSizeLimit: imageMaxSize, // 默认 2 M compress: editor.getOpt('imageCompressEnable') ? { width: imageCompressBorder, height: imageCompressBorder, // 图片质量,只有type为`image/jpeg`的时候才有效。 quality: 90, // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. allowMagnify: false, // 是否允许裁剪。 crop: false, // 是否保留头部meta信息。 preserveHeaders: true }:false }); uploader.addButton({ id: '#filePickerBlock' }); uploader.addButton({ id: '#filePickerBtn', label: lang.uploadAddFile }); setState('pedding'); // 当有文件添加进来时执行,负责view的创建 function addFile(file) { var $li = $('
          • ' + '

            ' + file.name + '

            ' + '

            ' + '

            ' + '
          • '), $btns = $('
            ' + '' + lang.uploadDelete + '' + '' + lang.uploadTurnRight + '' + '' + lang.uploadTurnLeft + '
            ').appendTo($li), $prgress = $li.find('p.progress span'), $wrap = $li.find('p.imgWrap'), $info = $('

            ').hide().appendTo($li), showError = function (code) { switch (code) { case 'exceed_size': text = lang.errorExceedSize; break; case 'interrupt': text = lang.errorInterrupt; break; case 'http': text = lang.errorHttp; break; case 'not_allow_type': text = lang.errorFileType; break; default: text = lang.errorUploadRetry; break; } $info.text(text).show(); }; if (file.getStatus() === 'invalid') { showError(file.statusText); } else { $wrap.text(lang.uploadPreview); if (browser.ie && browser.version <= 7) { $wrap.text(lang.uploadNoPreview); } else { uploader.makeThumb(file, function (error, src) { if (error || !src) { $wrap.text(lang.uploadNoPreview); } else { var $img = $(''); $wrap.empty().append($img); $img.on('error', function () { $wrap.text(lang.uploadNoPreview); }); } }, thumbnailWidth, thumbnailHeight); } percentages[ file.id ] = [ file.size, 0 ]; file.rotation = 0; /* 检查文件格式 */ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { showError('not_allow_type'); uploader.removeFile(file); } } file.on('statuschange', function (cur, prev) { if (prev === 'progress') { $prgress.hide().width(0); } else if (prev === 'queued') { $li.off('mouseenter mouseleave'); $btns.remove(); } // 成功 if (cur === 'error' || cur === 'invalid') { showError(file.statusText); percentages[ file.id ][ 1 ] = 1; } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { percentages[ file.id ][ 1 ] = 0; } else if (cur === 'progress') { $info.hide(); $prgress.css('display', 'block'); } else if (cur === 'complete') { } $li.removeClass('state-' + prev).addClass('state-' + cur); }); $li.on('mouseenter', function () { $btns.stop().animate({height: 30}); }); $li.on('mouseleave', function () { $btns.stop().animate({height: 0}); }); $btns.on('click', 'span', function () { var index = $(this).index(), deg; switch (index) { case 0: uploader.removeFile(file); return; case 1: file.rotation += 90; break; case 2: file.rotation -= 90; break; } if (supportTransition) { deg = 'rotate(' + file.rotation + 'deg)'; $wrap.css({ '-webkit-transform': deg, '-mos-transform': deg, '-o-transform': deg, 'transform': deg }); } else { $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); } }); $li.insertBefore($filePickerBlock); } // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); delete percentages[ file.id ]; updateTotalProgress(); $li.off().find('.file-panel').off().end().remove(); } function updateTotalProgress() { var loaded = 0, total = 0, spans = $progress.children(), percent; $.each(percentages, function (k, v) { total += v[ 0 ]; loaded += v[ 0 ] * v[ 1 ]; }); percent = total ? loaded / total : 0; spans.eq(0).text(Math.round(percent * 100) + '%'); spans.eq(1).css('width', Math.round(percent * 100) + '%'); updateStatus(); } function setState(val, files) { if (val != state) { var stats = uploader.getStats(); $upload.removeClass('state-' + state); $upload.addClass('state-' + val); switch (val) { /* 未选择文件 */ case 'pedding': $queue.addClass('element-invisible'); $statusBar.addClass('element-invisible'); $placeHolder.removeClass('element-invisible'); $progress.hide(); $info.hide(); uploader.refresh(); break; /* 可以开始上传 */ case 'ready': $placeHolder.addClass('element-invisible'); $queue.removeClass('element-invisible'); $statusBar.removeClass('element-invisible'); $progress.hide(); $info.show(); $upload.text(lang.uploadStart); uploader.refresh(); break; /* 上传中 */ case 'uploading': $progress.show(); $info.hide(); $upload.text(lang.uploadPause); break; /* 暂停上传 */ case 'paused': $progress.show(); $info.hide(); $upload.text(lang.uploadContinue); break; case 'confirm': $progress.show(); $info.hide(); $upload.text(lang.uploadStart); stats = uploader.getStats(); if (stats.successNum && !stats.uploadFailNum) { setState('finish'); return; } break; case 'finish': $progress.hide(); $info.show(); if (stats.uploadFailNum) { $upload.text(lang.uploadRetry); } else { $upload.text(lang.uploadStart); } break; } state = val; updateStatus(); } if (!_this.getQueueCount()) { $upload.addClass('disabled') } else { $upload.removeClass('disabled') } } function updateStatus() { var text = '', stats; if (state === 'ready') { text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); } else if (state === 'confirm') { stats = uploader.getStats(); if (stats.uploadFailNum) { text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); } } else { stats = uploader.getStats(); text = lang.updateStatusFinish.replace('_', fileCount). replace('_KB', WebUploader.formatSize(fileSize)). replace('_', stats.successNum); if (stats.uploadFailNum) { text += lang.updateStatusError.replace('_', stats.uploadFailNum); } } $info.html(text); } uploader.on('fileQueued', function (file) { fileCount++; fileSize += file.size; if (fileCount === 1) { $placeHolder.addClass('element-invisible'); $statusBar.show(); } addFile(file); }); uploader.on('fileDequeued', function (file) { fileCount--; fileSize -= file.size; removeFile(file); updateTotalProgress(); }); uploader.on('filesQueued', function (file) { if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { setState('ready'); } updateTotalProgress(); }); uploader.on('all', function (type, files) { switch (type) { case 'uploadFinished': setState('confirm', files); break; case 'startUpload': /* 添加额外的GET参数 */ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); uploader.option('server', url); setState('uploading', files); break; case 'stopUpload': setState('paused', files); break; } }); uploader.on('uploadBeforeSend', function (file, data, header) { //这里可以通过data对象添加POST参数 header['X_Requested_With'] = 'XMLHttpRequest'; }); uploader.on('uploadProgress', function (file, percentage) { var $li = $('#' + file.id), $percent = $li.find('.progress span'); $percent.css('width', percentage * 100 + '%'); percentages[ file.id ][ 1 ] = percentage; updateTotalProgress(); }); uploader.on('uploadSuccess', function (file, ret) { var $file = $('#' + file.id); try { var responseText = (ret._raw || ret), json = utils.str2json(responseText); if (json.state == 'SUCCESS') { _this.imageList[$file.index()] = json; $file.append(''); } else { $file.find('.error').text(json.state).show(); } } catch (e) { $file.find('.error').text(lang.errorServerUpload).show(); } }); uploader.on('uploadError', function (file, code) { }); uploader.on('error', function (code, file) { if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { addFile(file); } }); uploader.on('uploadComplete', function (file, ret) { }); $upload.on('click', function () { if ($(this).hasClass('disabled')) { return false; } if (state === 'ready') { uploader.upload(); } else if (state === 'paused') { uploader.upload(); } else if (state === 'uploading') { uploader.stop(); } }); $upload.addClass('state-' + state); updateTotalProgress(); }, getQueueCount: function () { var file, i, status, readyFile = 0, files = this.uploader.getFiles(); for (i = 0; file = files[i++]; ) { status = file.getStatus(); if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; } return readyFile; }, destroy: function () { this.$wrap.remove(); }, getInsertList: function () { var i, data, list = [], align = getAlign(), prefix = editor.getOpt('imageUrlPrefix'); for (i = 0; i < this.imageList.length; i++) { data = this.imageList[i]; list.push({ src: prefix + data.url, _src: prefix + data.url, title: data.title, alt: data.original, floatStyle: align }); } return list; } }; /* 在线图片 */ function OnlineImage(target) { this.container = utils.isString(target) ? document.getElementById(target) : target; this.init(); } OnlineImage.prototype = { init: function () { this.reset(); this.initEvents(); }, /* 初始化容器 */ initContainer: function () { this.container.innerHTML = ''; this.list = document.createElement('ul'); this.clearFloat = document.createElement('li'); domUtils.addClass(this.list, 'list'); domUtils.addClass(this.clearFloat, 'clearFloat'); this.list.appendChild(this.clearFloat); this.container.appendChild(this.list); }, /* 初始化滚动事件,滚动到地步自动拉取数据 */ initEvents: function () { var _this = this; /* 滚动拉取图片 */ domUtils.on($G('imageList'), 'scroll', function(e){ var panel = this; if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { _this.getImageData(); } }); /* 选中图片 */ domUtils.on(this.container, 'click', function (e) { var target = e.target || e.srcElement, li = target.parentNode; if (li.tagName.toLowerCase() == 'li') { if (domUtils.hasClass(li, 'selected')) { domUtils.removeClasses(li, 'selected'); } else { domUtils.addClass(li, 'selected'); } } }); }, /* 初始化第一次的数据 */ initData: function () { /* 拉取数据需要使用的值 */ this.state = 0; this.listSize = editor.getOpt('imageManagerListSize'); this.listIndex = 0; this.listEnd = false; /* 第一次拉取数据 */ this.getImageData(); }, /* 重置界面 */ reset: function() { this.initContainer(); this.initData(); }, /* 向后台拉取图片列表数据 */ getImageData: function () { var _this = this; if(!_this.listEnd && !this.isLoadingData) { this.isLoadingData = true; var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), isJsonp = utils.isCrossDomainUrl(url); ajax.request(url, { 'timeout': 100000, 'dataType': isJsonp ? 'jsonp':'', 'data': utils.extend({ start: this.listIndex, size: this.listSize }, editor.queryCommandValue('serverparam')), 'method': 'get', 'onsuccess': function (r) { try { var json = isJsonp ? r:eval('(' + r.responseText + ')'); if (json.state == 'SUCCESS') { _this.pushData(json.list); _this.listIndex = parseInt(json.start) + parseInt(json.list.length); if(_this.listIndex >= json.total) { _this.listEnd = true; } _this.isLoadingData = false; } } catch (e) { if(r.responseText.indexOf('ue_separate_ue') != -1) { var list = r.responseText.split(r.responseText); _this.pushData(list); _this.listIndex = parseInt(list.length); _this.listEnd = true; _this.isLoadingData = false; } } }, 'onerror': function () { _this.isLoadingData = false; } }); } }, /* 添加图片到列表界面上 */ pushData: function (list) { var i, item, img, icon, _this = this, urlPrefix = editor.getOpt('imageManagerUrlPrefix'); for (i = 0; i < list.length; i++) { if(list[i] && list[i].url) { item = document.createElement('li'); img = document.createElement('img'); icon = document.createElement('span'); domUtils.on(img, 'load', (function(image){ return function(){ _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); } })(img)); img.width = 113; img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); img.setAttribute('_src', urlPrefix + list[i].url); domUtils.addClass(icon, 'icon'); item.appendChild(img); item.appendChild(icon); this.list.insertBefore(item, this.clearFloat); } } }, /* 改变图片大小 */ scale: function (img, w, h, type) { var ow = img.width, oh = img.height; if (type == 'justify') { if (ow >= oh) { img.width = w; img.height = h * oh / ow; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; } else { img.width = w * ow / oh; img.height = h; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; } } else { if (ow >= oh) { img.width = w * ow / oh; img.height = h; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; } else { img.width = w; img.height = h * oh / ow; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; } } }, getInsertList: function () { var i, lis = this.list.children, list = [], align = getAlign(); for (i = 0; i < lis.length; i++) { if (domUtils.hasClass(lis[i], 'selected')) { var img = lis[i].firstChild, src = img.getAttribute('_src'); list.push({ src: src, _src: src, alt: src.substr(src.lastIndexOf('/') + 1), floatStyle: align }); } } return list; } }; /*搜索图片 */ function SearchImage() { this.init(); } SearchImage.prototype = { init: function () { this.initEvents(); }, initEvents: function(){ var _this = this; /* 点击搜索按钮 */ domUtils.on($G('searchBtn'), 'click', function(){ var key = $G('searchTxt').value; if(key && key != lang.searchRemind) { _this.getImageData(); } }); /* 点击清除妞 */ domUtils.on($G('searchReset'), 'click', function(){ $G('searchTxt').value = lang.searchRemind; $G('searchListUl').innerHTML = ''; $G('searchType').selectedIndex = 0; }); /* 搜索框聚焦 */ domUtils.on($G('searchTxt'), 'focus', function(){ var key = $G('searchTxt').value; if(key && key == lang.searchRemind) { $G('searchTxt').value = ''; } }); /* 搜索框回车键搜索 */ domUtils.on($G('searchTxt'), 'keydown', function(e){ var keyCode = e.keyCode || e.which; if (keyCode == 13) { $G('searchBtn').click(); } }); /* 选中图片 */ domUtils.on($G('searchList'), 'click', function(e){ var target = e.target || e.srcElement, li = target.parentNode.parentNode; if (li.tagName.toLowerCase() == 'li') { if (domUtils.hasClass(li, 'selected')) { domUtils.removeClasses(li, 'selected'); } else { domUtils.addClass(li, 'selected'); } } }); }, encodeToGb2312:function (str){ if(!str) return ''; var strOut = "", z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9'; for (var i = 0; i < str.length; i++) { var c = str.charAt(i), code = str.charCodeAt(i); if (c == " ") strOut += "+"; else if (code >= 19968 && code <= 40869) { var index = code - 19968; strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2); } else { strOut += "%" + str.charCodeAt(i).toString(16); } } return strOut; }, /* 改变图片大小 */ scale: function (img, w, h) { var ow = img.width, oh = img.height; if (ow >= oh) { img.width = w * ow / oh; img.height = h; img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; } else { img.width = w; img.height = h * oh / ow; img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; } }, getImageData: function(){ var _this = this, key = $G('searchTxt').value, type = $G('searchType').value, keepOriginName = editor.options.keepOriginName ? "1" : "0", url = "https://image.baidu.com/search/index?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimage&istype=2&rn=32&fm=index&pv=&word=" + _this.encodeToGb2312(key) + type + "&keeporiginname=" + keepOriginName + "&" + +new Date; $G('searchListUl').innerHTML = lang.searchLoading; ajax.request(url, { 'dataType': 'jsonp', 'charset': 'GB18030', 'onsuccess':function(json){ console.log(json); var list = []; if(json && json.data) { for(var i = 0; i < json.data.length; i++) { if(json.data[i].objURL) { list.push({ title: json.data[i].fromPageTitleEnc, src: json.data[i].objURL, url: json.data[i].fromURL }); } } } _this.setList(list); }, 'onerror':function(){ $G('searchListUl').innerHTML = lang.searchRetry; } }); }, /* 添加图片到列表界面上 */ setList: function (list) { var i, item, p, img, link, _this = this, listUl = $G('searchListUl'); listUl.innerHTML = ''; if(list.length) { for (i = 0; i < list.length; i++) { item = document.createElement('li'); p = document.createElement('p'); img = document.createElement('img'); link = document.createElement('a'); img.onload = function () { _this.scale(this, 113, 113); }; img.width = 113; img.setAttribute('src', list[i].src); link.href = list[i].url; link.target = '_blank'; link.title = list[i].title; link.innerHTML = list[i].title; p.appendChild(img); item.appendChild(p); item.appendChild(link); listUl.appendChild(item); } } else { listUl.innerHTML = lang.searchRetry; } }, getInsertList: function () { var child, src, align = getAlign(), list = [], items = $G('searchListUl').children; for(var i = 0; i < items.length; i++) { child = items[i].firstChild && items[i].firstChild.firstChild; if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) { src = child.src; list.push({ src: src, _src: src, alt: src.substr(src.lastIndexOf('/') + 1), floatStyle: align }); } } return list; } }; })(); ================================================ FILE: static/common/user/uedit/dialogs/insertframe/insertframe.html ================================================
            px
            px
            ================================================ FILE: static/common/user/uedit/dialogs/internal.js ================================================ (function () { var parent = window.parent; //dialog对象 dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )]; //当前打开dialog的编辑器实例 editor = dialog.editor; UE = parent.UE; domUtils = UE.dom.domUtils; utils = UE.utils; browser = UE.browser; ajax = UE.ajax; $G = function ( id ) { return document.getElementById( id ) }; //focus元素 $focus = function ( node ) { setTimeout( function () { if ( browser.ie ) { var r = node.createTextRange(); r.collapse( false ); r.select(); } else { node.focus() } }, 0 ) }; utils.loadFile(document,{ href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(), tag:"link", type:"text/css", rel:"stylesheet" }); lang = editor.getLang(dialog.className.split( "-" )[2]); if(lang){ domUtils.on(window,'load',function () { var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; //针对静态资源 for ( var i in lang["static"] ) { var dom = $G( i ); if(!dom) continue; var tagName = dom.tagName, content = lang["static"][i]; if(content.src){ //clone content = utils.extend({},content,false); content.src = langImgPath + content.src; } if(content.style){ content = utils.extend({},content,false); content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath) } switch ( tagName.toLowerCase() ) { case "var": dom.parentNode.replaceChild( document.createTextNode( content ), dom ); break; case "select": var ops = dom.options; for ( var j = 0, oj; oj = ops[j]; ) { oj.innerHTML = content.options[j++]; } for ( var p in content ) { p != "options" && dom.setAttribute( p, content[p] ); } break; default : domUtils.setAttributes( dom, content); } } } ); } })(); ================================================ FILE: static/common/user/uedit/dialogs/link/link.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/map/map.html ================================================
            : :
            ================================================ FILE: static/common/user/uedit/dialogs/map/show.html ================================================ 百度地图API自定义地图
            ================================================ FILE: static/common/user/uedit/dialogs/music/music.css ================================================ .wrapper{margin: 5px 10px;} .searchBar{height:30px;padding:7px 0 3px;text-align:center;} .searchBtn{font-size:13px;height:24px;} .resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;} .listPanel{overflow: hidden;} .panelon{display:block;} .paneloff{display:none} .page{width:220px;margin:20px auto;overflow: hidden;} .pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center} .pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;} .m-box{width:460px;} .m-m{float: left;line-height: 20px;height: 20px;} .m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;} .m-l{float:left;width:40px; } .m-t{float:left;width:140px;} .m-s{float:left;width:110px;} .m-z{float:left;width:100px;} .m-try-t{float: left;width: 60px;;} .m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;} .m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;} .loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat} .empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;} ================================================ FILE: static/common/user/uedit/dialogs/music/music.html ================================================ 插入音乐
            ================================================ FILE: static/common/user/uedit/dialogs/music/music.js ================================================ function Music() { this.init(); } (function () { var pages = [], panels = [], selectedItem = null; Music.prototype = { total:70, pageSize:10, dataUrl:"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common", playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf", init:function () { var me = this; domUtils.on($G("J_searchName"), "keyup", function (event) { var e = window.event || event; if (e.keyCode == 13) { me.dosearch(); } }); domUtils.on($G("J_searchBtn"), "click", function () { me.dosearch(); }); }, callback:function (data) { var me = this; me.data = data.song_list; setTimeout(function () { $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list); }, 300); }, dosearch:function () { var me = this; selectedItem = null; var key = $G('J_searchName').value; if (utils.trim(key) == "")return false; key = encodeURIComponent(key); me._sent(key); }, doselect:function (i) { var me = this; if (typeof i == 'object') { selectedItem = i; } else if (typeof i == 'number') { selectedItem = me.data[i]; } }, onpageclick:function (id) { var me = this; for (var i = 0; i < pages.length; i++) { $G(pages[i]).className = 'pageoff'; $G(panels[i]).className = 'paneloff'; } $G('page' + id).className = 'pageon'; $G('panel' + id).className = 'panelon'; }, listenTest:function (elem) { var me = this, view = $G('J_preview'), is_play_action = (elem.className == 'm-try'), old_trying = me._getTryingElem(); if (old_trying) { old_trying.className = 'm-try'; view.innerHTML = ''; } if (is_play_action) { elem.className = 'm-trying'; view.innerHTML = me._buildMusicHtml(me._getUrl(true)); } }, _sent:function (param) { var me = this; $G('J_resultBar').innerHTML = '
            '; utils.loadFile(document, { src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(), tag:"script", type:"text/javascript", defer:"defer" }); }, _removeHtml:function (str) { var reg = /<\s*\/?\s*[^>]*\s*>/gi; return str.replace(reg, ""); }, _getUrl:function (isTryListen) { var me = this; var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' + encodeURIComponent(me._removeHtml(selectedItem.album_title)) + '&autoPlay='+isTryListen+'' + '&loop=true'; return me.playerUrl + "?" + param; }, _getTryingElem:function () { var s = $G('J_listPanel').getElementsByTagName('span'); for (var i = 0; i < s.length; i++) { if (s[i].className == 'm-trying') return s[i]; } return null; }, _buildMusicHtml:function (playerUrl) { var html = ' 12) return s.substring(0, 5) + '...'; if (!s) s = " "; return s; }, _rebuildData:function (data) { var me = this, newData = [], d = me.pageSize, itembox; for (var i = 0; i < data.length; i++) { if ((i + d) % d == 0) { itembox = []; newData.push(itembox) } itembox.push(data[i]); } return newData; }, _renderTemplate:function (data) { var me = this; if (data.length == 0)return '
            ' + lang.emptyTxt + '
            '; data = me._rebuildData(data); var s = [], p = [], t = []; s.push('
            '); p.push('
            '); for (var i = 0, tmpList; tmpList = data[i++];) { panels.push('panel' + i); pages.push('page' + i); if (i == 1) { s.push('
            '); if (data.length != 1) { t.push('
            ' + (i ) + '
            '); } } else { s.push('
            '); t.push('
            ' + (i ) + '
            '); } s.push('
            '); s.push('
            ' + lang.chapter + '' + lang.singer + '' + lang.special + '' + lang.listenTest + '
            '); for (var j = 0, tmpObj; tmpObj = tmpList[j++];) { s.push(''); } s.push('
            '); s.push('
            '); } t.reverse(); p.push(t.join('')); s.push('
            '); p.push('
            '); return s.join('') + p.join(''); }, exec:function () { var me = this; if (selectedItem == null) return; $G('J_preview').innerHTML = ""; editor.execCommand('music', { url:me._getUrl(false), width:400, height:95 }); } }; })(); ================================================ FILE: static/common/user/uedit/dialogs/preview/preview.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/scrawl/scrawl.css ================================================ /*common */ body{margin: 0;} table{width:100%;} table td{padding:2px 4px;vertical-align: middle;} a{text-decoration: none;} em{font-style: normal;} .border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} /*module */ .main{margin: 8px;overflow: hidden;} .hot{float:left;height:335px;} .drawBoard{position: relative; cursor: crosshair;} .brushBorad{position: absolute;left:0;top:0;z-index: 998;} .picBoard{border: none;text-align: center;line-height: 300px;cursor: default;} .operateBar{margin-top:10px;font-size:12px;text-align: center;} .operateBar span{margin-left: 10px;} .drawToolbar{float:right;width:110px;height:300px;overflow: hidden;} .colorBar{margin-top:10px;font-size: 12px;text-align: center;} .colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3} .sectionBar{margin-top:15px;font-size: 12px;text-align: center;} .sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3} .size1{background: url('images/size.png') 1px center no-repeat ;} .size2{background: url('images/size.png') -10px center no-repeat;} .size3{background: url('images/size.png') -22px center no-repeat;} .size4{background: url('images/size.png') -35px center no-repeat;} .addImgH{position: relative;} .addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;} .addImgH_form input{width: 100%;} /*scrawl遮罩层 */ .maskLayerNull{display: none;} .maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7; background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;} /*btn state */ .previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;} .previousStepH .text{color:#888;cursor:pointer;} .previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;} .previousStep .text{color:#ccc;cursor:default;} .nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;} .nextStepH .text{color:#888;cursor:pointer;} .nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;} .nextStep .text{color:#ccc;cursor:default;} .clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;} .clearBoardH .text{color:#888;cursor:pointer;} .clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;} .clearBoard .text{color:#ccc;cursor:default;} .scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;} .scaleBoardH .text{color:#888;cursor:pointer;} .scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;} .scaleBoard .text{color:#ccc;cursor:default;} .removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;} .removeImgH .text{color:#888;cursor:pointer;} .removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;} .removeImg .text{color:#ccc;cursor:default;} .addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')} .addImgH .text{color:#888;cursor:pointer;} /*icon */ .brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')} .eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')} ================================================ FILE: static/common/user/uedit/dialogs/scrawl/scrawl.html ================================================
            1 3 5 7
            1 3 5 7
            ================================================ FILE: static/common/user/uedit/dialogs/scrawl/scrawl.js ================================================ /** * Created with JetBrains PhpStorm. * User: xuheng * Date: 12-5-22 * Time: 上午11:38 * To change this template use File | Settings | File Templates. */ var scrawl = function (options) { options && this.initOptions(options); }; (function () { var canvas = $G("J_brushBoard"), context = canvas.getContext('2d'), drawStep = [], //undo redo存储 drawStepIndex = 0; //undo redo指针 scrawl.prototype = { isScrawl:false, //是否涂鸦 brushWidth:-1, //画笔粗细 brushColor:"", //画笔颜色 initOptions:function (options) { var me = this; me.originalState(options);//初始页面状态 me._buildToolbarColor(options.colorList);//动态生成颜色选择集合 me._addBoardListener(options.saveNum);//添加画板处理 me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理 me._addColorBarListener();//添加颜色选择处理 me._addBrushBarListener();//添加画笔大小处理 me._addEraserBarListener();//添加橡皮大小处理 me._addAddImgListener();//添加增添背景图片处理 me._addRemoveImgListenter();//删除背景图片处理 me._addScalePicListenter();//添加缩放处理 me._addClearSelectionListenter();//添加清楚选中状态处理 me._originalColorSelect(options.drawBrushColor);//初始化颜色选中 me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中 me._clearSelection();//清楚选中状态 }, originalState:function (options) { var me = this; me.brushWidth = options.drawBrushSize;//同步画笔粗细 me.brushColor = options.drawBrushColor;//同步画笔颜色 context.lineWidth = me.brushWidth;//初始画笔大小 context.strokeStyle = me.brushColor;//初始画笔颜色 context.fillStyle = "transparent";//初始画布背景颜色 context.lineCap = "round";//去除锯齿 context.fill(); }, _buildToolbarColor:function (colorList) { var tmp = null, arr = []; arr.push(""); for (var i = 0, color; color = colorList[i++];) { if ((i - 1) % 5 == 0) { if (i != 1) { arr.push(""); } arr.push(""); } tmp = '#' + color; arr.push(""); } arr.push("
            "); $G("J_colorBar").innerHTML = arr.join(""); }, _addBoardListener:function (saveNum) { var me = this, margin = 0, startX = -1, startY = -1, isMouseDown = false, isMouseMove = false, isMouseUp = false, buttonPress = 0, button, flag = ''; margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left")); drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); drawStepIndex += 1; domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) { button = browser.webkit ? e.which : buttonPress; switch (e.type) { case 'mousedown': buttonPress = 1; flag = 1; isMouseDown = true; isMouseUp = false; isMouseMove = false; me.isScrawl = true; startX = e.clientX - margin;//10为外边距总和 startY = e.clientY - margin; context.beginPath(); break; case 'mousemove' : if (!flag && button == 0) { return; } if (!flag && button) { startX = e.clientX - margin;//10为外边距总和 startY = e.clientY - margin; context.beginPath(); flag = 1; } if (isMouseUp || !isMouseDown) { return; } var endX = e.clientX - margin, endY = e.clientY - margin; context.moveTo(startX, startY); context.lineTo(endX, endY); context.stroke(); startX = endX; startY = endY; isMouseMove = true; break; case 'mouseup': buttonPress = 0; if (!isMouseDown)return; if (!isMouseMove) { context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false); context.fillStyle = context.strokeStyle; context.fill(); } context.closePath(); me._saveOPerate(saveNum); isMouseDown = false; isMouseMove = false; isMouseUp = true; startX = -1; startY = -1; break; case 'mouseout': flag = ''; buttonPress = 0; if (button == 1) return; context.closePath(); break; } }); }, _addOPerateListener:function (saveNum) { var me = this; domUtils.on($G("J_previousStep"), "click", function () { if (drawStepIndex > 1) { drawStepIndex -= 1; context.clearRect(0, 0, context.canvas.width, context.canvas.height); context.putImageData(drawStep[drawStepIndex - 1], 0, 0); me.btn2Highlight("J_nextStep"); drawStepIndex == 1 && me.btn2disable("J_previousStep"); } }); domUtils.on($G("J_nextStep"), "click", function () { if (drawStepIndex > 0 && drawStepIndex < drawStep.length) { context.clearRect(0, 0, context.canvas.width, context.canvas.height); context.putImageData(drawStep[drawStepIndex], 0, 0); drawStepIndex += 1; me.btn2Highlight("J_previousStep"); drawStepIndex == drawStep.length && me.btn2disable("J_nextStep"); } }); domUtils.on($G("J_clearBoard"), "click", function () { context.clearRect(0, 0, context.canvas.width, context.canvas.height); drawStep = []; me._saveOPerate(saveNum); drawStepIndex = 1; me.isScrawl = false; me.btn2disable("J_previousStep"); me.btn2disable("J_nextStep"); me.btn2disable("J_clearBoard"); }); }, _addColorBarListener:function () { var me = this; domUtils.on($G("J_colorBar"), "click", function (e) { var target = me.getTarget(e), color = target.title; if (!!color) { me._addColorSelect(target); me.brushColor = color; context.globalCompositeOperation = "source-over"; context.lineWidth = me.brushWidth; context.strokeStyle = color; } }); }, _addBrushBarListener:function () { var me = this; domUtils.on($G("J_brushBar"), "click", function (e) { var target = me.getTarget(e), size = browser.ie ? target.innerText : target.text; if (!!size) { me._addBESelect(target); context.globalCompositeOperation = "source-over"; context.lineWidth = parseInt(size); context.strokeStyle = me.brushColor; me.brushWidth = context.lineWidth; } }); }, _addEraserBarListener:function () { var me = this; domUtils.on($G("J_eraserBar"), "click", function (e) { var target = me.getTarget(e), size = browser.ie ? target.innerText : target.text; if (!!size) { me._addBESelect(target); context.lineWidth = parseInt(size); context.globalCompositeOperation = "destination-out"; context.strokeStyle = "#FFF"; } }); }, _addAddImgListener:function () { var file = $G("J_imgTxt"); if (!window.FileReader) { $G("J_addImg").style.display = 'none'; $G("J_removeImg").style.display = 'none'; $G("J_sacleBoard").style.display = 'none'; } domUtils.on(file, "change", function (e) { var frm = file.parentNode; addMaskLayer(lang.backgroundUploading); var target = e.target || e.srcElement, reader = new FileReader(); reader.onload = function(evt){ var target = evt.target || evt.srcElement; ue_callback(target.result, 'SUCCESS'); }; reader.readAsDataURL(target.files[0]); frm.reset(); }); }, _addRemoveImgListenter:function () { var me = this; domUtils.on($G("J_removeImg"), "click", function () { $G("J_picBoard").innerHTML = ""; me.btn2disable("J_removeImg"); me.btn2disable("J_sacleBoard"); }); }, _addScalePicListenter:function () { domUtils.on($G("J_sacleBoard"), "click", function () { var picBoard = $G("J_picBoard"), scaleCon = $G("J_scaleCon"), img = picBoard.children[0]; if (img) { if (!scaleCon) { picBoard.style.cssText = "position:relative;z-index:999;"+picBoard.style.cssText; img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;"; var scale = new ScaleBoy(); picBoard.appendChild(scale.init()); scale.startScale(img); } else { if (scaleCon.style.visibility == "visible") { scaleCon.style.visibility = "hidden"; picBoard.style.position = ""; picBoard.style.zIndex = ""; } else { scaleCon.style.visibility = "visible"; picBoard.style.cssText += "position:relative;z-index:999"; } } } }); }, _addClearSelectionListenter:function () { var doc = document; domUtils.on(doc, 'mousemove', function (e) { if (browser.ie && browser.version < 11) doc.selection.clear(); else window.getSelection().removeAllRanges(); }); }, _clearSelection:function () { var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"]; for (var i = 0, group; group = list[i++];) { domUtils.unSelectable($G(group)); } }, _saveOPerate:function (saveNum) { var me = this; if (drawStep.length <= saveNum) { if(drawStepIndex"); } scale.innerHTML = arr.join(""); return scale; } var rect = [ //[left, top, width, height] [1, 1, -1, -1], [0, 1, 0, -1], [0, 1, 1, -1], [1, 0, -1, 0], [0, 0, 1, 0], [1, 0, -1, 1], [0, 0, 0, 1], [0, 0, 1, 1] ]; ScaleBoy.prototype = { init:function () { _appendStyle(); var me = this, scale = me.dom = _getDom(); me.scaleMousemove.fp = me; domUtils.on(scale, 'mousedown', function (e) { var target = e.target || e.srcElement; me.start = {x:e.clientX, y:e.clientY}; if (target.className.indexOf('hand') != -1) { me.dir = target.className.replace('hand', ''); } domUtils.on(document.body, 'mousemove', me.scaleMousemove); e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; }); domUtils.on(document.body, 'mouseup', function (e) { if (me.start) { domUtils.un(document.body, 'mousemove', me.scaleMousemove); if (me.moved) { me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}}); } delete me.start; delete me.moved; delete me.dir; } }); return scale; }, startScale:function (objElement) { var me = this, Idom = me.dom; Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;'; me.scalingElement = objElement; }, updateScaledElement:function (objStyle) { var cur = this.scalingElement, pos = objStyle.position, size = objStyle.size; if (pos) { typeof pos.x != 'undefined' && (cur.style.left = pos.x); typeof pos.y != 'undefined' && (cur.style.top = pos.y); } if (size) { size.w && (cur.style.width = size.w); size.h && (cur.style.height = size.h); } }, updateStyleByDir:function (dir, offset) { var me = this, dom = me.dom, tmp; rect['def'] = [1, 1, 0, 0]; if (rect[dir][0] != 0) { tmp = parseInt(dom.style.left) + offset.x; dom.style.left = me._validScaledProp('left', tmp) + 'px'; } if (rect[dir][1] != 0) { tmp = parseInt(dom.style.top) + offset.y; dom.style.top = me._validScaledProp('top', tmp) + 'px'; } if (rect[dir][2] != 0) { tmp = dom.clientWidth + rect[dir][2] * offset.x; dom.style.width = me._validScaledProp('width', tmp) + 'px'; } if (rect[dir][3] != 0) { tmp = dom.clientHeight + rect[dir][3] * offset.y; dom.style.height = me._validScaledProp('height', tmp) + 'px'; } if (dir === 'def') { me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}}); } }, scaleMousemove:function (e) { var me = arguments.callee.fp, start = me.start, dir = me.dir || 'def', offset = {x:e.clientX - start.x, y:e.clientY - start.y}; me.updateStyleByDir(dir, offset); arguments.callee.fp.start = {x:e.clientX, y:e.clientY}; arguments.callee.fp.moved = 1; }, _validScaledProp:function (prop, value) { var ele = this.dom, wrap = $G("J_picBoard"); value = isNaN(value) ? 0 : value; switch (prop) { case 'left': return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; case 'top': return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; case 'width': return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; case 'height': return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; } } }; })(); //后台回调 function ue_callback(url, state) { var doc = document, picBorard = $G("J_picBoard"), img = doc.createElement("img"); //图片缩放 function scale(img, max, oWidth, oHeight) { var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; if (ow > max || oh > max) { if (ow >= oh) { if (width = ow - max) { percent = (width / ow).toFixed(2); img.height = oh - oh * percent; img.width = max; } } else { if (height = oh - max) { percent = (height / oh).toFixed(2); img.width = ow - ow * percent; img.height = max; } } } } //移除遮罩层 removeMaskLayer(); //状态响应 if (state == "SUCCESS") { picBorard.innerHTML = ""; img.onload = function () { scale(this, 300); picBorard.appendChild(img); var obj = new scrawl(); obj.btn2Highlight("J_removeImg"); //trace 2457 obj.btn2Highlight("J_sacleBoard"); }; img.src = url; } else { alert(state); } } //去掉遮罩层 function removeMaskLayer() { var maskLayer = $G("J_maskLayer"); maskLayer.className = "maskLayerNull"; maskLayer.innerHTML = ""; dialog.buttons[0].setDisabled(false); } //添加遮罩层 function addMaskLayer(html) { var maskLayer = $G("J_maskLayer"); dialog.buttons[0].setDisabled(true); maskLayer.className = "maskLayer"; maskLayer.innerHTML = html; } //执行确认按钮方法 function exec(scrawlObj) { if (scrawlObj.isScrawl) { addMaskLayer(lang.scrawlUpLoading); var base64 = scrawlObj.getCanvasData(); if (!!base64) { var options = { timeout:100000, onsuccess:function (xhr) { if (!scrawlObj.isCancelScrawl) { var responseObj; responseObj = eval("(" + xhr.responseText + ")"); if (responseObj.state == "SUCCESS") { var imgObj = {}, url = editor.options.scrawlUrlPrefix + responseObj.url; imgObj.src = url; imgObj._src = url; imgObj.alt = responseObj.original || ''; imgObj.title = responseObj.title || ''; editor.execCommand("insertImage", imgObj); dialog.close(); } else { alert(responseObj.state); } } }, onerror:function () { alert(lang.imageError); dialog.close(); } }; options[editor.getOpt('scrawlFieldName')] = base64; var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')), params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); ajax.request(url, options); } } else { addMaskLayer(lang.noScarwl + "   "); } } ================================================ FILE: static/common/user/uedit/dialogs/searchreplace/searchreplace.html ================================================
            :
             
            :
            :
             
            ================================================ FILE: static/common/user/uedit/dialogs/searchreplace/searchreplace.js ================================================ /** * Created with JetBrains PhpStorm. * User: xuheng * Date: 12-9-26 * Time: 下午12:29 * To change this template use File | Settings | File Templates. */ //清空上次查选的痕迹 editor.firstForSR = 0; editor.currentRangeForSR = null; //给tab注册切换事件 /** * tab点击处理事件 * @param tabHeads * @param tabBodys * @param obj */ function clickHandler( tabHeads,tabBodys,obj ) { //head样式更改 for ( var k = 0, len = tabHeads.length; k < len; k++ ) { tabHeads[k].className = ""; } obj.className = "focus"; //body显隐 var tabSrc = obj.getAttribute( "tabSrc" ); for ( var j = 0, length = tabBodys.length; j < length; j++ ) { var body = tabBodys[j], id = body.getAttribute( "id" ); if ( id != tabSrc ) { body.style.zIndex = 1; } else { body.style.zIndex = 200; } } } /** * TAB切换 * @param tabParentId tab的父节点ID或者对象本身 */ function switchTab( tabParentId ) { var tabElements = $G( tabParentId ).children, tabHeads = tabElements[0].children, tabBodys = tabElements[1].children; for ( var i = 0, length = tabHeads.length; i < length; i++ ) { var head = tabHeads[i]; if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); head.onclick = function () { clickHandler(tabHeads,tabBodys,this); } } } $G('searchtab').onmousedown = function(){ $G('search-msg').innerHTML = ''; $G('replace-msg').innerHTML = '' } //是否区分大小写 function getMatchCase(id) { return $G(id).checked ? true : false; } //查找 $G("nextFindBtn").onclick = function (txt, dir, mcase) { var findtxt = $G("findtxt").value, obj; if (!findtxt) { return false; } obj = { searchStr:findtxt, dir:1, casesensitive:getMatchCase("matchCase") }; if (!frCommond(obj)) { var bk = editor.selection.getRange().createBookmark(); $G('search-msg').innerHTML = lang.getEnd; editor.selection.getRange().moveToBookmark(bk).select(); } }; $G("nextReplaceBtn").onclick = function (txt, dir, mcase) { var findtxt = $G("findtxt1").value, obj; if (!findtxt) { return false; } obj = { searchStr:findtxt, dir:1, casesensitive:getMatchCase("matchCase1") }; frCommond(obj); }; $G("preFindBtn").onclick = function (txt, dir, mcase) { var findtxt = $G("findtxt").value, obj; if (!findtxt) { return false; } obj = { searchStr:findtxt, dir:-1, casesensitive:getMatchCase("matchCase") }; if (!frCommond(obj)) { $G('search-msg').innerHTML = lang.getStart; } }; $G("preReplaceBtn").onclick = function (txt, dir, mcase) { var findtxt = $G("findtxt1").value, obj; if (!findtxt) { return false; } obj = { searchStr:findtxt, dir:-1, casesensitive:getMatchCase("matchCase1") }; frCommond(obj); }; //替换 $G("repalceBtn").onclick = function () { var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); if (!findtxt) { return false; } if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { return false; } obj = { searchStr:findtxt, dir:1, casesensitive:getMatchCase("matchCase1"), replaceStr:replacetxt }; frCommond(obj); }; //全部替换 $G("repalceAllBtn").onclick = function () { var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); if (!findtxt) { return false; } if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { return false; } obj = { searchStr:findtxt, casesensitive:getMatchCase("matchCase1"), replaceStr:replacetxt, all:true }; var num = frCommond(obj); if (num) { $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num); } }; //执行 var frCommond = function (obj) { return editor.execCommand("searchreplace", obj); }; switchTab("searchtab"); ================================================ FILE: static/common/user/uedit/dialogs/snapscreen/snapscreen.html ================================================

            ================================================ FILE: static/common/user/uedit/dialogs/spechars/spechars.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/spechars/spechars.js ================================================ /** * Created with JetBrains PhpStorm. * User: xuheng * Date: 12-9-26 * Time: 下午1:09 * To change this template use File | Settings | File Templates. */ var charsContent = [ { name:"tsfh", title:lang.tsfh, content:toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")}, { name:"lmsz", title:lang.lmsz, content:toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")}, { name:"szfh", title:lang.szfh, content:toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")}, { name:"rwfh", title:lang.rwfh, content:toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")}, { name:"xlzm", title:lang.xlzm, content:toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")}, { name:"ewzm", title:lang.ewzm, content:toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")}, { name:"pyzm", title:lang.pyzm, content:toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")}, { name:"yyyb", title:lang.yyyb, content:toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,")}, { name:"zyzf", title:lang.zyzf, content:toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")} ]; (function createTab(content) { for (var i = 0, ci; ci = content[i++];) { var span = document.createElement("span"); span.setAttribute("tabSrc", ci.name); span.innerHTML = ci.title; if (i == 1)span.className = "focus"; domUtils.on(span, "click", function () { var tmps = $G("tabHeads").children; for (var k = 0, sk; sk = tmps[k++];) { sk.className = ""; } tmps = $G("tabBodys").children; for (var k = 0, sk; sk = tmps[k++];) { sk.style.display = "none"; } this.className = "focus"; $G(this.getAttribute("tabSrc")).style.display = ""; }); $G("tabHeads").appendChild(span); domUtils.insertAfter(span, document.createTextNode("\n")); var div = document.createElement("div"); div.id = ci.name; div.style.display = (i == 1) ? "" : "none"; var cons = ci.content; for (var j = 0, con; con = cons[j++];) { var charSpan = document.createElement("span"); charSpan.innerHTML = con; domUtils.on(charSpan, "click", function () { editor.execCommand("insertHTML", this.innerHTML); dialog.close(); }); div.appendChild(charSpan); } $G("tabBodys").appendChild(div); } })(charsContent); function toArray(str) { return str.split(","); } ================================================ FILE: static/common/user/uedit/dialogs/table/edittable.css ================================================ body{ overflow: hidden; width: 540px; } .wrapper { margin: 10px auto 0; font-size: 12px; overflow: hidden; width: 520px; height: 315px; } .clear { clear: both; } .wrapper .left { float: left; margin-left: 10px;; } .wrapper .right { float: right; border-left: 2px dotted #EDEDED; padding-left: 15px; } .section { margin-bottom: 15px; width: 240px; overflow: hidden; } .section h3 { font-weight: bold; padding: 5px 0; margin-bottom: 10px; border-bottom: 1px solid #EDEDED; font-size: 12px; } .section ul { list-style: none; overflow: hidden; clear: both; } .section li { float: left; width: 120px;; } .section .tone { width: 80px;; } .section .preview { width: 220px; } .section .preview table { text-align: center; vertical-align: middle; color: #666; } .section .preview caption { font-weight: bold; } .section .preview td { border-width: 1px; border-style: solid; height: 22px; } .section .preview th { border-style: solid; border-color: #DDD; border-width: 2px 1px 1px 1px; height: 22px; background-color: #F7F7F7; } ================================================ FILE: static/common/user/uedit/dialogs/table/edittable.html ================================================

            ================================================ FILE: static/common/user/uedit/dialogs/table/edittable.js ================================================ /** * Created with JetBrains PhpStorm. * User: xuheng * Date: 12-12-19 * Time: 下午4:55 * To change this template use File | Settings | File Templates. */ (function () { var title = $G("J_title"), titleCol = $G("J_titleCol"), caption = $G("J_caption"), sorttable = $G("J_sorttable"), autoSizeContent = $G("J_autoSizeContent"), autoSizePage = $G("J_autoSizePage"), tone = $G("J_tone"), me, preview = $G("J_preview"); var editTable = function () { me = this; me.init(); }; editTable.prototype = { init:function () { var colorPiker = new UE.ui.ColorPicker({ editor:editor }), colorPop = new UE.ui.Popup({ editor:editor, content:colorPiker }); title.checked = editor.queryCommandState("inserttitle") == -1; titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; caption.checked = editor.queryCommandState("insertcaption") == -1; sorttable.checked = editor.queryCommandState("enablesort") == 1; var enablesortState = editor.queryCommandState("enablesort"), disablesortState = editor.queryCommandState("disablesort"); sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; me.createTable(title.checked, titleCol.checked, caption.checked); me.setAutoSize(); me.setColor(me.getColor()); domUtils.on(title, "click", me.titleHanler); domUtils.on(titleCol, "click", me.titleColHanler); domUtils.on(caption, "click", me.captionHanler); domUtils.on(sorttable, "click", me.sorttableHanler); domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); domUtils.on(autoSizePage, "click", me.autoSizePageHanler); domUtils.on(tone, "click", function () { colorPop.showAnchor(tone); }); domUtils.on(document, 'mousedown', function () { colorPop.hide(); }); colorPiker.addListener("pickcolor", function () { me.setColor(arguments[1]); colorPop.hide(); }); colorPiker.addListener("picknocolor", function () { me.setColor(""); colorPop.hide(); }); }, createTable:function (hasTitle, hasTitleCol, hasCaption) { var arr = [], sortSpan = '^'; arr.push(""); if (hasCaption) { arr.push("") } if (hasTitle) { arr.push(""); if(hasTitleCol) { arr.push(""); } for (var j = 0; j < 5; j++) { arr.push(""); } arr.push(""); } for (var i = 0; i < 6; i++) { arr.push(""); if(hasTitleCol) { arr.push("") } for (var k = 0; k < 5; k++) { arr.push("") } arr.push(""); } arr.push("
            " + lang.captionName + "
            " + lang.titleName + "" + lang.titleName + "
            " + lang.titleName + "" + lang.cellsName + "
            "); preview.innerHTML = arr.join(""); this.updateSortSpan(); }, titleHanler:function () { var example = $G("J_example"), frg=document.createDocumentFragment(), color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), colCount = example.rows[0].children.length; if (title.checked) { example.insertRow(0); for (var i = 0, node; i < colCount; i++) { node = document.createElement("th"); node.innerHTML = lang.titleName; frg.appendChild(node); } example.rows[0].appendChild(frg); } else { domUtils.remove(example.rows[0]); } me.setColor(color); me.updateSortSpan(); }, titleColHanler:function () { var example = $G("J_example"), color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), colArr = example.rows, colCount = colArr.length; if (titleCol.checked) { for (var i = 0, node; i < colCount; i++) { node = document.createElement("th"); node.innerHTML = lang.titleName; colArr[i].insertBefore(node, colArr[i].children[0]); } } else { for (var i = 0; i < colCount; i++) { domUtils.remove(colArr[i].children[0]); } } me.setColor(color); me.updateSortSpan(); }, captionHanler:function () { var example = $G("J_example"); if (caption.checked) { var row = document.createElement('caption'); row.innerHTML = lang.captionName; example.insertBefore(row, example.firstChild); } else { domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); } }, sorttableHanler:function(){ me.updateSortSpan(); }, autoSizeContentHanler:function () { var example = $G("J_example"); example.removeAttribute("width"); }, autoSizePageHanler:function () { var example = $G("J_example"); var tds = example.getElementsByTagName(example, "td"); utils.each(tds, function (td) { td.removeAttribute("width"); }); example.setAttribute('width', '100%'); }, updateSortSpan: function(){ var example = $G("J_example"), row = example.rows[0]; var spans = domUtils.getElementsByTagName(example,"span"); utils.each(spans,function(span){ span.parentNode.removeChild(span); }); if (sorttable.checked) { utils.each(row.cells, function(cell, i){ var span = document.createElement("span"); span.innerHTML = "^"; cell.appendChild(span); }); } }, getColor:function () { var start = editor.selection.getStart(), color, cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true); color = cell && domUtils.getComputedStyle(cell, "border-color"); if (!color) color = "#DDDDDD"; return color; }, setColor:function (color) { var example = $G("J_example"), arr = domUtils.getElementsByTagName(example, "td").concat( domUtils.getElementsByTagName(example, "th"), domUtils.getElementsByTagName(example, "caption") ); tone.value = color; utils.each(arr, function (node) { node.style.borderColor = color; }); }, setAutoSize:function () { var me = this; autoSizePage.checked = true; me.autoSizePageHanler(); } }; new editTable; dialog.onok = function () { editor.__hasEnterExecCommand = true; var checks = { title:"inserttitle deletetitle", titleCol:"inserttitlecol deletetitlecol", caption:"insertcaption deletecaption", sorttable:"enablesort disablesort" }; editor.fireEvent('saveScene'); for(var i in checks){ var cmds = checks[i].split(" "), input = $G("J_" + i); if(input["checked"]){ editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]); }else{ editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]); } } editor.execCommand("edittable", tone.value); autoSizeContent.checked ?editor.execCommand('adaptbytext') : ""; autoSizePage.checked ? editor.execCommand("adaptbywindow") : ""; editor.fireEvent('saveScene'); editor.__hasEnterExecCommand = false; }; })(); ================================================ FILE: static/common/user/uedit/dialogs/table/edittd.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/table/edittip.html ================================================ 表格删除提示
            ================================================ FILE: static/common/user/uedit/dialogs/template/config.js ================================================ /** * Created with JetBrains PhpStorm. * User: xuheng * Date: 12-8-8 * Time: 下午2:00 * To change this template use File | Settings | File Templates. */ var templates = [ { "pre":"pre0.png", 'title':lang.blank, 'preHtml':'

             欢迎使用UEditor!

            ', "html":'

            欢迎使用UEditor!

            ' }, { "pre":"pre1.png", 'title':lang.blog, 'preHtml':'

            深入理解Range

            UEditor二次开发

            什么是Range

            对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。


            Range能干什么

            在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。

            ', "html":'

            [键入文档标题]

            [键入文档副标题]

            [标题 1]

            对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。

            [标题 2]

            在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。

            [标题 3]

            对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。


            ' }, { "pre":"pre2.png", 'title':lang.resume, 'preHtml':'

            WEB前端开发简历


            联系电话:[键入您的电话]

            电子邮件:[键入您的电子邮件地址]

            家庭住址:[键入您的地址]

            目标职位

            WEB前端研发工程师

            学历

            1. [起止时间] [学校名称] [所学专业] [所获学位]

            工作经验


            ', "html":'

            [此处键入简历标题]


            【此处插入照片】


            联系电话:[键入您的电话]


            电子邮件:[键入您的电子邮件地址]


            家庭住址:[键入您的地址]


            目标职位

            [此处键入您的期望职位]

            学历

            1. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

            2. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

            工作经验

            1. [键入起止时间] [键入公司名称] [键入职位名称]

              1. [键入负责项目] [键入项目简介]

              2. [键入负责项目] [键入项目简介]

            2. [键入起止时间] [键入公司名称] [键入职位名称]

              1. [键入负责项目] [键入项目简介]

            掌握技能

             [这里可以键入您所掌握的技能]

            ' }, { "pre":"pre3.png", 'title':lang.richText, 'preHtml':'

            [此处键入文章标题]

            图文混排方法

            图片居左,文字围绕图片排版

            方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文


            还有没有什么其他的环绕方式呢?这里是居右环绕


            欢迎大家多多尝试,为UEditor提供更多高质量模板!

            ', "html":'


            [此处键入文章标题]

            图文混排方法

            1. 图片居左,文字围绕图片排版

            方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本


            2. 图片居右,文字围绕图片排版

            方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本


            3. 图片居中环绕排版

            方法:亲,这个真心没有办法。。。



            还有没有什么其他的环绕方式呢?这里是居右环绕


            欢迎大家多多尝试,为UEditor提供更多高质量模板!


            占位


            占位


            占位


            占位


            占位



            ' }, { "pre":"pre4.png", 'title':lang.sciPapers, 'preHtml':'

            [键入文章标题]

            摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

            标题 1

            这里可以输入很多内容,可以图文混排,可以有列表等。

            标题 2

            1. 列表 1

            2. 列表 2

              1. 多级列表 1

              2. 多级列表 2

            3. 列表 3

            标题 3

            来个文字图文混排的


            ', 'html':'

            [键入文章标题]

            摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

            标题 1

            这里可以输入很多内容,可以图文混排,可以有列表等。

            标题 2

            来个列表瞅瞅:

            1. 列表 1

            2. 列表 2

              1. 多级列表 1

              2. 多级列表 2

            3. 列表 3

            标题 3

            来个文字图文混排的

            这里可以多行

            右边是图片

            绝对没有问题的,不信你也可以试试看


            ' } ]; ================================================ FILE: static/common/user/uedit/dialogs/template/template.css ================================================ .wrap{ padding: 5px;font-size: 14px;} .left{width:425px;float: left;} .right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;} .right .pre{height: 332px;overflow-y: auto;} .right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;} .right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;} .right .preitem img{display: block;margin: 0 auto;width:100px;} .clear{clear: both;} .top{height:26px;line-height: 26px;padding: 5px;} .bottom{height:320px;width:100%;margin: 0 auto;} .transparent{ background: url("images/bg.gif") repeat;} .bottom table tr td{border:1px dashed #ccc;} #colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;} .border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} p{margin: 5px 0} table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;} li{clear:both} ol{padding-left:40px; } ================================================ FILE: static/common/user/uedit/dialogs/template/template.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/template/template.js ================================================ /** * Created with JetBrains PhpStorm. * User: xuheng * Date: 12-8-8 * Time: 下午2:09 * To change this template use File | Settings | File Templates. */ (function () { var me = editor, preview = $G( "preview" ), preitem = $G( "preitem" ), tmps = templates, currentTmp; var initPre = function () { var str = ""; for ( var i = 0, tmp; tmp = tmps[i++]; ) { str += '
            '; } preitem.innerHTML = str; }; var pre = function ( n ) { var tmp = tmps[n - 1]; currentTmp = tmp; clearItem(); domUtils.setStyles( preitem.childNodes[n - 1], { "background-color":"lemonChiffon", "border":"#ccc 1px solid" } ); preview.innerHTML = tmp.preHtml ? tmp.preHtml : ""; }; var clearItem = function () { var items = preitem.children; for ( var i = 0, item; item = items[i++]; ) { domUtils.setStyles( item, { "background-color":"", "border":"white 1px solid" } ); } }; dialog.onok = function () { if ( !$G( "issave" ).checked ){ me.execCommand( "cleardoc" ); } var obj = { html:currentTmp && currentTmp.html }; me.execCommand( "template", obj ); }; initPre(); window.pre = pre; pre(2) })(); ================================================ FILE: static/common/user/uedit/dialogs/video/video.css ================================================ @charset "utf-8"; .wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative} .tabbody{height: 335px;} .tabbody .panel { position: absolute; width: 0; height: 0; background: #fff; overflow: hidden; display: none; } .tabbody .panel.focus { width: 100%; height: 335px; display: block; } .tabbody .panel table td{vertical-align: middle;} #videoUrl { width: 490px; height: 21px; line-height: 21px; margin: 8px 5px; background: #FFF; border: 1px solid #d7d7d7; } #videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;} #searchList{width: 570px;overflow: auto;zoom:1;height: 270px;} #searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;} #searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/ #searchList p{margin-left: 10px;} #videoType{ width: 65px; height: 23px; line-height: 22px; border: 1px solid #d7d7d7; } #videoSearchBtn,#videoSearchReset{ /*width: 80px;*/ height: 25px; line-height: 25px; background: #eee; border: 1px solid #d7d7d7; cursor: pointer; padding: 0 5px; } #preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left} #preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;} #preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;} #preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;} .edui-video-wrapper fieldset{ border: 1px solid #ddd; padding-left: 5px; margin-bottom: 20px; padding-bottom: 5px; width: 115px; } #videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;} fieldset{ border: 1px solid #ddd; padding-left: 5px; margin-bottom: 20px; padding-bottom: 5px; width: 115px; } fieldset legend{font-weight: bold;} fieldset p{line-height: 30px;} fieldset input.txt{ width: 65px; height: 21px; line-height: 21px; margin: 8px 5px; background: #FFF; border: 1px solid #d7d7d7; } label.url{font-weight: bold;margin-left: 5px;color: #06c;} #videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} #videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)} span.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue} /* upload video */ .tabbody #upload.panel { width: 0; height: 0; overflow: hidden; position: absolute !important; clip: rect(1px, 1px, 1px, 1px); background: #fff; display: block; } .tabbody #upload.panel.focus { width: 100%; height: 335px; display: block; clip: auto; } #upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} #upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)} #upload_left { width:427px; float:left; } #upload_left .controller { height: 30px; clear: both; } #uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;} #upload .queueList { margin: 0; } #upload p { margin: 0; } .element-invisible { width: 0 !important; height: 0 !important; border: 0; padding: 0; margin: 0; overflow: hidden; position: absolute !important; clip: rect(1px, 1px, 1px, 1px); } #upload .placeholder { margin: 10px; margin-right:0; border: 2px dashed #e6e6e6; *border: 0px dashed #e6e6e6; height: 161px; padding-top: 150px; text-align: center; width: 97%; float: left; background: url(./images/image.png) center 70px no-repeat; color: #cccccc; font-size: 18px; position: relative; top:0; *margin-left: 0; *left: 10px; } #upload .placeholder .webuploader-pick { font-size: 18px; background: #00b7ee; border-radius: 3px; line-height: 44px; padding: 0 30px; *width: 120px; color: #fff; display: inline-block; margin: 0 auto 20px auto; cursor: pointer; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } #upload .placeholder .webuploader-pick-hover { background: #00a2d4; } #filePickerContainer { text-align: center; } #upload .placeholder .flashTip { color: #666666; font-size: 12px; position: absolute; width: 100%; text-align: center; bottom: 20px; } #upload .placeholder .flashTip a { color: #0785d1; text-decoration: none; } #upload .placeholder .flashTip a:hover { text-decoration: underline; } #upload .placeholder.webuploader-dnd-over { border-color: #999999; } #upload .filelist { list-style: none; margin: 0; padding: 0; overflow-x: hidden; overflow-y: auto; position: relative; height: 285px; } #upload .filelist:after { content: ''; display: block; width: 0; height: 0; overflow: hidden; clear: both; } #upload .filelist li { width: 113px; height: 113px; background: url(./images/bg.png); text-align: center; margin: 15px 0 0 20px; *margin: 15px 0 0 15px; position: relative; display: block; float: left; overflow: hidden; font-size: 12px; } #upload .filelist li p.log { position: relative; top: -45px; } #upload .filelist li p.title { position: absolute; top: 0; left: 0; width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; top: 5px; text-indent: 5px; text-align: left; } #upload .filelist li p.progress { position: absolute; width: 100%; bottom: 0; left: 0; height: 8px; overflow: hidden; z-index: 50; margin: 0; border-radius: 0; background: none; -webkit-box-shadow: 0 0 0; } #upload .filelist li p.progress span { display: none; overflow: hidden; width: 0; height: 100%; background: #1483d8 url(./images/progress.png) repeat-x; -webit-transition: width 200ms linear; -moz-transition: width 200ms linear; -o-transition: width 200ms linear; -ms-transition: width 200ms linear; transition: width 200ms linear; -webkit-animation: progressmove 2s linear infinite; -moz-animation: progressmove 2s linear infinite; -o-animation: progressmove 2s linear infinite; -ms-animation: progressmove 2s linear infinite; animation: progressmove 2s linear infinite; -webkit-transform: translateZ(0); } @-webkit-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @-moz-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } #upload .filelist li p.imgWrap { position: relative; z-index: 2; line-height: 113px; vertical-align: middle; overflow: hidden; width: 113px; height: 113px; -webkit-transform-origin: 50% 50%; -moz-transform-origin: 50% 50%; -o-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; -webit-transition: 200ms ease-out; -moz-transition: 200ms ease-out; -o-transition: 200ms ease-out; -ms-transition: 200ms ease-out; transition: 200ms ease-out; } #upload .filelist li p.imgWrap.notimage { margin-top: 0; width: 111px; height: 111px; border: 1px #eeeeee solid; } #upload .filelist li p.imgWrap.notimage i.file-preview { margin-top: 15px; } #upload .filelist li img { width: 100%; } #upload .filelist li p.error { background: #f43838; color: #fff; position: absolute; bottom: 0; left: 0; height: 28px; line-height: 28px; width: 100%; z-index: 100; display:none; } #upload .filelist li .success { display: block; position: absolute; left: 0; bottom: 0; height: 40px; width: 100%; z-index: 200; background: url(./images/success.png) no-repeat right bottom; background-image: url(./images/success.gif) \9; } #upload .filelist li.filePickerBlock { width: 113px; height: 113px; background: url(./images/image.png) no-repeat center 12px; border: 1px solid #eeeeee; border-radius: 0; } #upload .filelist li.filePickerBlock div.webuploader-pick { width: 100%; height: 100%; margin: 0; padding: 0; opacity: 0; background: none; font-size: 0; } #upload .filelist div.file-panel { position: absolute; height: 0; filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; background: rgba(0, 0, 0, 0.5); width: 100%; top: 0; left: 0; overflow: hidden; z-index: 300; } #upload .filelist div.file-panel span { width: 24px; height: 24px; display: inline; float: right; text-indent: -9999px; overflow: hidden; background: url(./images/icons.png) no-repeat; background: url(./images/icons.gif) no-repeat \9; margin: 5px 1px 1px; cursor: pointer; -webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #upload .filelist div.file-panel span.rotateLeft { display:none; background-position: 0 -24px; } #upload .filelist div.file-panel span.rotateLeft:hover { background-position: 0 0; } #upload .filelist div.file-panel span.rotateRight { display:none; background-position: -24px -24px; } #upload .filelist div.file-panel span.rotateRight:hover { background-position: -24px 0; } #upload .filelist div.file-panel span.cancel { background-position: -48px -24px; } #upload .filelist div.file-panel span.cancel:hover { background-position: -48px 0; } #upload .statusBar { height: 45px; border-bottom: 1px solid #dadada; margin: 0 10px; padding: 0; line-height: 45px; vertical-align: middle; position: relative; } #upload .statusBar .progress { border: 1px solid #1483d8; width: 198px; background: #fff; height: 18px; position: absolute; top: 12px; display: none; text-align: center; line-height: 18px; color: #6dbfff; margin: 0 10px 0 0; } #upload .statusBar .progress span.percentage { width: 0; height: 100%; left: 0; top: 0; background: #1483d8; position: absolute; } #upload .statusBar .progress span.text { position: relative; z-index: 10; } #upload .statusBar .info { display: inline-block; font-size: 14px; color: #666666; } #upload .statusBar .btns { position: absolute; top: 7px; right: 0; line-height: 30px; } #filePickerBtn { display: inline-block; float: left; } #upload .statusBar .btns .webuploader-pick, #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-uploading, #upload .statusBar .btns .uploadBtn.state-paused { background: #ffffff; border: 1px solid #cfcfcf; color: #565656; padding: 0 18px; display: inline-block; border-radius: 3px; margin-left: 10px; cursor: pointer; font-size: 14px; float: left; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #upload .statusBar .btns .webuploader-pick-hover, #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-uploading:hover, #upload .statusBar .btns .uploadBtn.state-paused:hover { background: #f0f0f0; } #upload .statusBar .btns .uploadBtn, #upload .statusBar .btns .uploadBtn.state-paused{ background: #00b7ee; color: #fff; border-color: transparent; } #upload .statusBar .btns .uploadBtn:hover, #upload .statusBar .btns .uploadBtn.state-paused:hover{ background: #00a2d4; } #upload .statusBar .btns .uploadBtn.disabled { pointer-events: none; filter:alpha(opacity=60); -moz-opacity:0.6; -khtml-opacity: 0.6; opacity: 0.6; } /* 在线文件的文件预览图标 */ i.file-preview { display: block; margin: 10px auto; width: 70px; height: 70px; background-image: url("./images/file-icons.png"); background-image: url("./images/file-icons.gif") \9; background-position: -140px center; background-repeat: no-repeat; } i.file-preview.file-type-dir{ background-position: 0 center; } i.file-preview.file-type-file{ background-position: -140px center; } i.file-preview.file-type-filelist{ background-position: -210px center; } i.file-preview.file-type-zip, i.file-preview.file-type-rar, i.file-preview.file-type-7z, i.file-preview.file-type-tar, i.file-preview.file-type-gz, i.file-preview.file-type-bz2{ background-position: -280px center; } i.file-preview.file-type-xls, i.file-preview.file-type-xlsx{ background-position: -350px center; } i.file-preview.file-type-doc, i.file-preview.file-type-docx{ background-position: -420px center; } i.file-preview.file-type-ppt, i.file-preview.file-type-pptx{ background-position: -490px center; } i.file-preview.file-type-vsd{ background-position: -560px center; } i.file-preview.file-type-pdf{ background-position: -630px center; } i.file-preview.file-type-txt, i.file-preview.file-type-md, i.file-preview.file-type-json, i.file-preview.file-type-htm, i.file-preview.file-type-xml, i.file-preview.file-type-html, i.file-preview.file-type-js, i.file-preview.file-type-css, i.file-preview.file-type-php, i.file-preview.file-type-jsp, i.file-preview.file-type-asp{ background-position: -700px center; } i.file-preview.file-type-apk{ background-position: -770px center; } i.file-preview.file-type-exe{ background-position: -840px center; } i.file-preview.file-type-ipa{ background-position: -910px center; } i.file-preview.file-type-mp4, i.file-preview.file-type-swf, i.file-preview.file-type-mkv, i.file-preview.file-type-avi, i.file-preview.file-type-flv, i.file-preview.file-type-mov, i.file-preview.file-type-mpg, i.file-preview.file-type-mpeg, i.file-preview.file-type-ogv, i.file-preview.file-type-webm, i.file-preview.file-type-rm, i.file-preview.file-type-rmvb{ background-position: -980px center; } i.file-preview.file-type-ogg, i.file-preview.file-type-wav, i.file-preview.file-type-wmv, i.file-preview.file-type-mid, i.file-preview.file-type-mp3{ background-position: -1050px center; } i.file-preview.file-type-jpg, i.file-preview.file-type-jpeg, i.file-preview.file-type-gif, i.file-preview.file-type-bmp, i.file-preview.file-type-png, i.file-preview.file-type-psd{ background-position: -140px center; } ================================================ FILE: static/common/user/uedit/dialogs/video/video.html ================================================
            0%
            ================================================ FILE: static/common/user/uedit/dialogs/video/video.js ================================================ /** * Created by JetBrains PhpStorm. * User: taoqili * Date: 12-2-20 * Time: 上午11:19 * To change this template use File | Settings | File Templates. */ (function(){ var video = {}, uploadVideoList = [], isModifyUploadVideo = false, uploadFile; window.onload = function(){ $focus($G("videoUrl")); initTabs(); initVideo(); initUpload(); }; /* 初始化tab标签 */ function initTabs(){ var tabs = $G('tabHeads').children; for (var i = 0; i < tabs.length; i++) { domUtils.on(tabs[i], "click", function (e) { var j, bodyId, target = e.target || e.srcElement; for (j = 0; j < tabs.length; j++) { bodyId = tabs[j].getAttribute('data-content-id'); if(tabs[j] == target){ domUtils.addClass(tabs[j], 'focus'); domUtils.addClass($G(bodyId), 'focus'); }else { domUtils.removeClasses(tabs[j], 'focus'); domUtils.removeClasses($G(bodyId), 'focus'); } } }); } } function initVideo(){ createAlignButton( ["videoFloat", "upload_alignment"] ); addUrlChangeListener($G("videoUrl")); addOkListener(); //编辑视频时初始化相关信息 (function(){ var img = editor.selection.getRange().getClosedNode(),url; if(img && img.className){ var hasFakedClass = (img.className == "edui-faked-video"), hasUploadClass = img.className.indexOf("edui-upload-video")!=-1; if(hasFakedClass || hasUploadClass) { $G("videoUrl").value = url = img.getAttribute("_url"); $G("videoWidth").value = img.width; $G("videoHeight").value = img.height; var align = domUtils.getComputedStyle(img,"float"), parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); updateAlignButton(parentAlign==="center"?"center":align); } if(hasUploadClass) { isModifyUploadVideo = true; } } createPreviewVideo(url); })(); } /** * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作 */ function addOkListener(){ dialog.onok = function(){ $G("preview").innerHTML = ""; var currentTab = findFocus("tabHeads","tabSrc"); switch(currentTab){ case "video": return insertSingle(); break; case "videoSearch": return insertSearch("searchList"); break; case "upload": return insertUpload(); break; } }; dialog.oncancel = function(){ $G("preview").innerHTML = ""; }; } /** * 依据传入的align值更新按钮信息 * @param align */ function updateAlignButton( align ) { var aligns = $G( "videoFloat" ).children; for ( var i = 0, ci; ci = aligns[i++]; ) { if ( ci.getAttribute( "name" ) == align ) { if ( ci.className !="focus" ) { ci.className = "focus"; } } else { if ( ci.className =="focus" ) { ci.className = ""; } } } } /** * 将单个视频信息插入编辑器中 */ function insertSingle(){ var width = $G("videoWidth"), height = $G("videoHeight"), url=$G('videoUrl').value, align = findFocus("videoFloat","name"); if(!url) return false; if ( !checkNum( [width, height] ) ) return false; editor.execCommand('insertvideo', { url: convert_url(url), width: width.value, height: height.value, align: align }, isModifyUploadVideo ? 'upload':null); } /** * 将元素id下的所有代表视频的图片插入编辑器中 * @param id */ function insertSearch(id){ var imgs = domUtils.getElementsByTagName($G(id),"img"), videoObjs=[]; for(var i=0,img; img=imgs[i++];){ if(img.getAttribute("selected")){ videoObjs.push({ url:img.getAttribute("ue_video_url"), width:420, height:280, align:"none" }); } } editor.execCommand('insertvideo',videoObjs); } /** * 找到id下具有focus类的节点并返回该节点下的某个属性 * @param id * @param returnProperty */ function findFocus( id, returnProperty ) { var tabs = $G( id ).children, property; for ( var i = 0, ci; ci = tabs[i++]; ) { if ( ci.className=="focus" ) { property = ci.getAttribute( returnProperty ); break; } } return property; } function convert_url(url){ if ( !url ) return ''; url = utils.trim(url) .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1") .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf") .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf") .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf") .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf") .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0") .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1") .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1") .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1") .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1"); return url; } /** * 检测传入的所有input框中输入的长宽是否是正数 * @param nodes input框集合, */ function checkNum( nodes ) { for ( var i = 0, ci; ci = nodes[i++]; ) { var value = ci.value; if ( !isNumber( value ) && value) { alert( lang.numError ); ci.value = ""; ci.focus(); return false; } } return true; } /** * 数字判断 * @param value */ function isNumber( value ) { return /(0|^[1-9]\d*$)/.test( value ); } /** * 创建图片浮动选择按钮 * @param ids */ function createAlignButton( ids ) { for ( var i = 0, ci; ci = ids[i++]; ) { var floatContainer = $G( ci ), nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight, "center":lang.block}; for ( var j in nameMaps ) { var div = document.createElement( "div" ); div.setAttribute( "name", j ); if ( j == "none" ) div.className="focus"; div.style.cssText = "background:url(images/" + j + "_focus.jpg);"; div.setAttribute( "title", nameMaps[j] ); floatContainer.appendChild( div ); } switchSelect( ci ); } } /** * 选择切换 * @param selectParentId */ function switchSelect( selectParentId ) { var selects = $G( selectParentId ).children; for ( var i = 0, ci; ci = selects[i++]; ) { domUtils.on( ci, "click", function () { for ( var j = 0, cj; cj = selects[j++]; ) { cj.className = ""; cj.removeAttribute && cj.removeAttribute( "class" ); } this.className = "focus"; } ) } } /** * 监听url改变事件 * @param url */ function addUrlChangeListener(url){ if (browser.ie) { url.onpropertychange = function () { createPreviewVideo( this.value ); } } else { url.addEventListener( "input", function () { createPreviewVideo( this.value ); }, false ); } } /** * 根据url生成视频预览 * @param url */ function createPreviewVideo(url){ if ( !url )return; var conUrl = convert_url(url); conUrl = utils.unhtmlForUrl(conUrl); $G("preview").innerHTML = '
            '+lang.urlError+'
            '+ '' + ''; } /* 插入上传视频 */ function insertUpload(){ var videoObjs=[], uploadDir = editor.getOpt('videoUrlPrefix'), width = parseInt($G('upload_width').value, 10) || 420, height = parseInt($G('upload_height').value, 10) || 280, align = findFocus("upload_alignment","name") || 'none'; for(var key in uploadVideoList) { var file = uploadVideoList[key]; videoObjs.push({ url: uploadDir + file.url, width:width, height:height, align:align }); } var count = uploadFile.getQueueCount(); if (count) { $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); return false; } else { editor.execCommand('insertvideo', videoObjs, 'upload'); } } /*初始化上传标签*/ function initUpload(){ uploadFile = new UploadFile('queueList'); } /* 上传附件 */ function UploadFile(target) { this.$wrap = target.constructor == String ? $('#' + target) : $(target); this.init(); } UploadFile.prototype = { init: function () { this.fileList = []; this.initContainer(); this.initUploader(); }, initContainer: function () { this.$queue = this.$wrap.find('.filelist'); }, /* 初始化容器 */ initUploader: function () { var _this = this, $ = jQuery, // just in case. Make sure it's not an other libaray. $wrap = _this.$wrap, // 图片容器 $queue = $wrap.find('.filelist'), // 状态栏,包括进度和控制按钮 $statusBar = $wrap.find('.statusBar'), // 文件总体选择信息。 $info = $statusBar.find('.info'), // 上传按钮 $upload = $wrap.find('.uploadBtn'), // 上传按钮 $filePickerBtn = $wrap.find('.filePickerBtn'), // 上传按钮 $filePickerBlock = $wrap.find('.filePickerBlock'), // 没选择文件之前的内容。 $placeHolder = $wrap.find('.placeholder'), // 总体进度条 $progress = $statusBar.find('.progress').hide(), // 添加的文件数量 fileCount = 0, // 添加的文件总大小 fileSize = 0, // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWidth = 113 * ratio, thumbnailHeight = 113 * ratio, // 可能有pedding, ready, uploading, confirm, done. state = '', // 所有文件的进度信息,key为file id percentages = {}, supportTransition = (function () { var s = document.createElement('p').style, r = 'transition' in s || 'WebkitTransition' in s || 'MozTransition' in s || 'msTransition' in s || 'OTransition' in s; s = null; return r; })(), // WebUploader实例 uploader, actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')), fileMaxSize = editor.getOpt('videoMaxSize'), acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; if (!WebUploader.Uploader.support()) { $('#filePickerReady').after($('
            ').html(lang.errorNotSupport)).hide(); return; } else if (!editor.getOpt('videoActionName')) { $('#filePickerReady').after($('
            ').html(lang.errorLoadConfig)).hide(); return; } uploader = _this.uploader = WebUploader.create({ pick: { id: '#filePickerReady', label: lang.uploadSelectFile }, swf: '../../third-party/webuploader/Uploader.swf', server: actionUrl, fileVal: editor.getOpt('videoFieldName'), duplicate: true, fileSingleSizeLimit: fileMaxSize, compress: false }); uploader.addButton({ id: '#filePickerBlock' }); uploader.addButton({ id: '#filePickerBtn', label: lang.uploadAddFile }); setState('pedding'); // 当有文件添加进来时执行,负责view的创建 function addFile(file) { var $li = $('
          • ' + '

            ' + file.name + '

            ' + '

            ' + '

            ' + '
          • '), $btns = $('
            ' + '' + lang.uploadDelete + '' + '' + lang.uploadTurnRight + '' + '' + lang.uploadTurnLeft + '
            ').appendTo($li), $prgress = $li.find('p.progress span'), $wrap = $li.find('p.imgWrap'), $info = $('

            ').hide().appendTo($li), showError = function (code) { switch (code) { case 'exceed_size': text = lang.errorExceedSize; break; case 'interrupt': text = lang.errorInterrupt; break; case 'http': text = lang.errorHttp; break; case 'not_allow_type': text = lang.errorFileType; break; default: text = lang.errorUploadRetry; break; } $info.text(text).show(); }; if (file.getStatus() === 'invalid') { showError(file.statusText); } else { $wrap.text(lang.uploadPreview); if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { $wrap.empty().addClass('notimage').append('' + '' + file.name + ''); } else { if (browser.ie && browser.version <= 7) { $wrap.text(lang.uploadNoPreview); } else { uploader.makeThumb(file, function (error, src) { if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) { $wrap.text(lang.uploadNoPreview); } else { var $img = $(''); $wrap.empty().append($img); $img.on('error', function () { $wrap.text(lang.uploadNoPreview); }); } }, thumbnailWidth, thumbnailHeight); } } percentages[ file.id ] = [ file.size, 0 ]; file.rotation = 0; /* 检查文件格式 */ if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { showError('not_allow_type'); uploader.removeFile(file); } } file.on('statuschange', function (cur, prev) { if (prev === 'progress') { $prgress.hide().width(0); } else if (prev === 'queued') { $li.off('mouseenter mouseleave'); $btns.remove(); } // 成功 if (cur === 'error' || cur === 'invalid') { showError(file.statusText); percentages[ file.id ][ 1 ] = 1; } else if (cur === 'interrupt') { showError('interrupt'); } else if (cur === 'queued') { percentages[ file.id ][ 1 ] = 0; } else if (cur === 'progress') { $info.hide(); $prgress.css('display', 'block'); } else if (cur === 'complete') { } $li.removeClass('state-' + prev).addClass('state-' + cur); }); $li.on('mouseenter', function () { $btns.stop().animate({height: 30}); }); $li.on('mouseleave', function () { $btns.stop().animate({height: 0}); }); $btns.on('click', 'span', function () { var index = $(this).index(), deg; switch (index) { case 0: uploader.removeFile(file); return; case 1: file.rotation += 90; break; case 2: file.rotation -= 90; break; } if (supportTransition) { deg = 'rotate(' + file.rotation + 'deg)'; $wrap.css({ '-webkit-transform': deg, '-mos-transform': deg, '-o-transform': deg, 'transform': deg }); } else { $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); } }); $li.insertBefore($filePickerBlock); } // 负责view的销毁 function removeFile(file) { var $li = $('#' + file.id); delete percentages[ file.id ]; updateTotalProgress(); $li.off().find('.file-panel').off().end().remove(); } function updateTotalProgress() { var loaded = 0, total = 0, spans = $progress.children(), percent; $.each(percentages, function (k, v) { total += v[ 0 ]; loaded += v[ 0 ] * v[ 1 ]; }); percent = total ? loaded / total : 0; spans.eq(0).text(Math.round(percent * 100) + '%'); spans.eq(1).css('width', Math.round(percent * 100) + '%'); updateStatus(); } function setState(val, files) { if (val != state) { var stats = uploader.getStats(); $upload.removeClass('state-' + state); $upload.addClass('state-' + val); switch (val) { /* 未选择文件 */ case 'pedding': $queue.addClass('element-invisible'); $statusBar.addClass('element-invisible'); $placeHolder.removeClass('element-invisible'); $progress.hide(); $info.hide(); uploader.refresh(); break; /* 可以开始上传 */ case 'ready': $placeHolder.addClass('element-invisible'); $queue.removeClass('element-invisible'); $statusBar.removeClass('element-invisible'); $progress.hide(); $info.show(); $upload.text(lang.uploadStart); uploader.refresh(); break; /* 上传中 */ case 'uploading': $progress.show(); $info.hide(); $upload.text(lang.uploadPause); break; /* 暂停上传 */ case 'paused': $progress.show(); $info.hide(); $upload.text(lang.uploadContinue); break; case 'confirm': $progress.show(); $info.hide(); $upload.text(lang.uploadStart); stats = uploader.getStats(); if (stats.successNum && !stats.uploadFailNum) { setState('finish'); return; } break; case 'finish': $progress.hide(); $info.show(); if (stats.uploadFailNum) { $upload.text(lang.uploadRetry); } else { $upload.text(lang.uploadStart); } break; } state = val; updateStatus(); } if (!_this.getQueueCount()) { $upload.addClass('disabled') } else { $upload.removeClass('disabled') } } function updateStatus() { var text = '', stats; if (state === 'ready') { text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); } else if (state === 'confirm') { stats = uploader.getStats(); if (stats.uploadFailNum) { text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); } } else { stats = uploader.getStats(); text = lang.updateStatusFinish.replace('_', fileCount). replace('_KB', WebUploader.formatSize(fileSize)). replace('_', stats.successNum); if (stats.uploadFailNum) { text += lang.updateStatusError.replace('_', stats.uploadFailNum); } } $info.html(text); } uploader.on('fileQueued', function (file) { fileCount++; fileSize += file.size; if (fileCount === 1) { $placeHolder.addClass('element-invisible'); $statusBar.show(); } addFile(file); }); uploader.on('fileDequeued', function (file) { fileCount--; fileSize -= file.size; removeFile(file); updateTotalProgress(); }); uploader.on('filesQueued', function (file) { if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { setState('ready'); } updateTotalProgress(); }); uploader.on('all', function (type, files) { switch (type) { case 'uploadFinished': setState('confirm', files); break; case 'startUpload': /* 添加额外的GET参数 */ var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); uploader.option('server', url); setState('uploading', files); break; case 'stopUpload': setState('paused', files); break; } }); uploader.on('uploadBeforeSend', function (file, data, header) { //这里可以通过data对象添加POST参数 header['X_Requested_With'] = 'XMLHttpRequest'; }); uploader.on('uploadProgress', function (file, percentage) { var $li = $('#' + file.id), $percent = $li.find('.progress span'); $percent.css('width', percentage * 100 + '%'); percentages[ file.id ][ 1 ] = percentage; updateTotalProgress(); }); uploader.on('uploadSuccess', function (file, ret) { var $file = $('#' + file.id); try { var responseText = (ret._raw || ret), json = utils.str2json(responseText); if (json.state == 'SUCCESS') { uploadVideoList.push({ 'url': json.url, 'type': json.type, 'original':json.original }); $file.append(''); } else { $file.find('.error').text(json.state).show(); } } catch (e) { $file.find('.error').text(lang.errorServerUpload).show(); } }); uploader.on('uploadError', function (file, code) { }); uploader.on('error', function (code, file) { if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { addFile(file); } }); uploader.on('uploadComplete', function (file, ret) { }); $upload.on('click', function () { if ($(this).hasClass('disabled')) { return false; } if (state === 'ready') { uploader.upload(); } else if (state === 'paused') { uploader.upload(); } else if (state === 'uploading') { uploader.stop(); } }); $upload.addClass('state-' + state); updateTotalProgress(); }, getQueueCount: function () { var file, i, status, readyFile = 0, files = this.uploader.getFiles(); for (i = 0; file = files[i++]; ) { status = file.getStatus(); if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; } return readyFile; }, refresh: function(){ this.uploader.refresh(); } }; })(); ================================================ FILE: static/common/user/uedit/dialogs/webapp/webapp.html ================================================
            ================================================ FILE: static/common/user/uedit/dialogs/wordimage/tangram.js ================================================ // Copyright (c) 2009, Baidu Inc. All rights reserved. // // Licensed under the BSD License // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http:// tangram.baidu.com/license.html // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @namespace T Tangram七巧板 * @name T * @version 1.6.0 */ /** * 声明baidu包 * @author: allstar, erik, meizz, berg */ var T, baidu = T = baidu || {version: "1.5.0"}; baidu.guid = "$BAIDU$"; baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}}; /** * 使用flash资源封装的一些功能 * @namespace baidu.flash */ baidu.flash = baidu.flash || {}; /** * 操作dom的方法 * @namespace baidu.dom */ baidu.dom = baidu.dom || {}; /** * 从文档中获取指定的DOM元素 * @name baidu.dom.g * @function * @grammar baidu.dom.g(id) * @param {string|HTMLElement} id 元素的id或DOM元素. * @shortcut g,T.G * @meta standard * @see baidu.dom.q * * @return {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数. */ baidu.dom.g = function(id) { if (!id) return null; if ('string' == typeof id || id instanceof String) { return document.getElementById(id); } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { return id; } return null; }; baidu.g = baidu.G = baidu.dom.g; /** * 操作数组的方法 * @namespace baidu.array */ baidu.array = baidu.array || {}; /** * 遍历数组中所有元素 * @name baidu.array.each * @function * @grammar baidu.array.each(source, iterator[, thisObject]) * @param {Array} source 需要遍历的数组 * @param {Function} iterator 对每个数组元素进行调用的函数,该函数有两个参数,第一个为数组元素,第二个为数组索引值,function (item, index)。 * @param {Object} [thisObject] 函数调用时的this指针,如果没有此参数,默认是当前遍历的数组 * @remark * each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。 * @shortcut each * @meta standard * * @returns {Array} 遍历的数组 */ baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) { var returnValue, item, i, len = source.length; if ('function' == typeof iterator) { for (i = 0; i < len; i++) { item = source[i]; returnValue = iterator.call(thisObject || source, item, i); if (returnValue === false) { break; } } } return source; }; /** * 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。 * @namespace baidu.lang */ baidu.lang = baidu.lang || {}; /** * 判断目标参数是否为function或Function实例 * @name baidu.lang.isFunction * @function * @grammar baidu.lang.isFunction(source) * @param {Any} source 目标参数 * @version 1.2 * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate * @meta standard * @returns {boolean} 类型判断结果 */ baidu.lang.isFunction = function (source) { return '[object Function]' == Object.prototype.toString.call(source); }; /** * 判断目标参数是否string类型或String对象 * @name baidu.lang.isString * @function * @grammar baidu.lang.isString(source) * @param {Any} source 目标参数 * @shortcut isString * @meta standard * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate * * @returns {boolean} 类型判断结果 */ baidu.lang.isString = function (source) { return '[object String]' == Object.prototype.toString.call(source); }; baidu.isString = baidu.lang.isString; /** * 判断浏览器类型和特性的属性 * @namespace baidu.browser */ baidu.browser = baidu.browser || {}; /** * 判断是否为opera浏览器 * @property opera opera版本号 * @grammar baidu.browser.opera * @meta standard * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome * @returns {Number} opera版本号 */ /** * opera 从10开始不是用opera后面的字符串进行版本的判断 * 在Browser identification最后添加Version + 数字进行版本标识 * opera后面的数字保持在9.80不变 */ baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ? + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined; /** * 在目标元素的指定位置插入HTML代码 * @name baidu.dom.insertHTML * @function * @grammar baidu.dom.insertHTML(element, position, html) * @param {HTMLElement|string} element 目标元素或目标元素的id * @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd * @param {string} html 要插入的html * @remark * * 对于position参数,大小写不敏感
            * 参数的意思:beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
            * 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。 * * @shortcut insertHTML * @meta standard * * @returns {HTMLElement} 目标元素 */ baidu.dom.insertHTML = function (element, position, html) { element = baidu.dom.g(element); var range,begin; if (element.insertAdjacentHTML && !baidu.browser.opera) { element.insertAdjacentHTML(position, html); } else { range = element.ownerDocument.createRange(); position = position.toUpperCase(); if (position == 'AFTERBEGIN' || position == 'BEFOREEND') { range.selectNodeContents(element); range.collapse(position == 'AFTERBEGIN'); } else { begin = position == 'BEFOREBEGIN'; range[begin ? 'setStartBefore' : 'setEndAfter'](element); range.collapse(begin); } range.insertNode(range.createContextualFragment(html)); } return element; }; baidu.insertHTML = baidu.dom.insertHTML; /** * 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号 * @namespace baidu.swf */ baidu.swf = baidu.swf || {}; /** * 浏览器支持的flash插件版本 * @property version 浏览器支持的flash插件版本 * @grammar baidu.swf.version * @return {String} 版本号 * @meta standard */ baidu.swf.version = (function () { var n = navigator; if (n.plugins && n.mimeTypes.length) { var plugin = n.plugins["Shockwave Flash"]; if (plugin && plugin.description) { return plugin.description .replace(/([a-zA-Z]|\s)+/, "") .replace(/(\s)+r/, ".") + ".0"; } } else if (window.ActiveXObject && !window.opera) { for (var i = 12; i >= 2; i--) { try { var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i); if (c) { var version = c.GetVariable("$version"); return version.replace(/WIN/g,'').replace(/,/g,'.'); } } catch(e) {} } } })(); /** * 操作字符串的方法 * @namespace baidu.string */ baidu.string = baidu.string || {}; /** * 对目标字符串进行html编码 * @name baidu.string.encodeHTML * @function * @grammar baidu.string.encodeHTML(source) * @param {string} source 目标字符串 * @remark * 编码字符有5个:&<>"' * @shortcut encodeHTML * @meta standard * @see baidu.string.decodeHTML * * @returns {string} html编码后的字符串 */ baidu.string.encodeHTML = function (source) { return String(source) .replace(/&/g,'&') .replace(//g,'>') .replace(/"/g, """) .replace(/'/g, "'"); }; baidu.encodeHTML = baidu.string.encodeHTML; /** * 创建flash对象的html字符串 * @name baidu.swf.createHTML * @function * @grammar baidu.swf.createHTML(options) * * @param {Object} options 创建flash的选项参数 * @param {string} options.id 要创建的flash的标识 * @param {string} options.url flash文件的url * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 * @param {string} options.ver 最低需要的flash player版本号 * @param {string} options.width flash的宽度 * @param {string} options.height flash的高度 * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL * @param {string} options.bgcolor swf文件的背景色 * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 * * @see baidu.swf.create * @meta standard * @returns {string} flash对象的html字符串 */ baidu.swf.createHTML = function (options) { options = options || {}; var version = baidu.swf.version, needVersion = options['ver'] || '6.0.0', vUnit1, vUnit2, i, k, len, item, tmpOpt = {}, encodeHTML = baidu.string.encodeHTML; for (k in options) { tmpOpt[k] = options[k]; } options = tmpOpt; if (version) { version = version.split('.'); needVersion = needVersion.split('.'); for (i = 0; i < 3; i++) { vUnit1 = parseInt(version[i], 10); vUnit2 = parseInt(needVersion[i], 10); if (vUnit2 < vUnit1) { break; } else if (vUnit2 > vUnit1) { return ''; } } } else { return ''; } var vars = options['vars'], objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align']; options['align'] = options['align'] || 'middle'; options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'; options['movie'] = options['url'] || ''; delete options['vars']; delete options['url']; if ('string' == typeof vars) { options['flashvars'] = vars; } else { var fvars = []; for (k in vars) { item = vars[k]; fvars.push(k + "=" + encodeURIComponent(item)); } options['flashvars'] = fvars.join('&'); } var str = [''); var params = { 'wmode' : 1, 'scale' : 1, 'quality' : 1, 'play' : 1, 'loop' : 1, 'menu' : 1, 'salign' : 1, 'bgcolor' : 1, 'base' : 1, 'allowscriptaccess' : 1, 'allownetworking' : 1, 'allowfullscreen' : 1, 'seamlesstabbing' : 1, 'devicefont' : 1, 'swliveconnect' : 1, 'flashvars' : 1, 'movie' : 1 }; for (k in options) { item = options[k]; k = k.toLowerCase(); if (params[k] && (item || item === false || item === 0)) { str.push(''); } } options['src'] = options['movie']; options['name'] = options['id']; delete options['id']; delete options['movie']; delete options['classid']; delete options['codebase']; options['type'] = 'application/x-shockwave-flash'; options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer'; str.push(''); return str.join(''); }; /** * 在页面中创建一个flash对象 * @name baidu.swf.create * @function * @grammar baidu.swf.create(options[, container]) * * @param {Object} options 创建flash的选项参数 * @param {string} options.id 要创建的flash的标识 * @param {string} options.url flash文件的url * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 * @param {string} options.ver 最低需要的flash player版本号 * @param {string} options.width flash的宽度 * @param {string} options.height flash的高度 * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL * @param {string} options.bgcolor swf文件的背景色 * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 * * @param {HTMLElement|string} [container] flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。 * @meta standard * @see baidu.swf.createHTML,baidu.swf.getMovie */ baidu.swf.create = function (options, target) { options = options || {}; var html = baidu.swf.createHTML(options) || options['errorMessage'] || ''; if (target && 'string' == typeof target) { target = document.getElementById(target); } baidu.dom.insertHTML( target || document.body ,'beforeEnd',html ); }; /** * 判断是否为ie浏览器 * @name baidu.browser.ie * @field * @grammar baidu.browser.ie * @returns {Number} IE版本号 */ baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined; /** * 移除数组中的项 * @name baidu.array.remove * @function * @grammar baidu.array.remove(source, match) * @param {Array} source 需要移除项的数组 * @param {Any} match 要移除的项 * @meta standard * @see baidu.array.removeAt * * @returns {Array} 移除后的数组 */ baidu.array.remove = function (source, match) { var len = source.length; while (len--) { if (len in source && source[len] === match) { source.splice(len, 1); } } return source; }; /** * 判断目标参数是否Array对象 * @name baidu.lang.isArray * @function * @grammar baidu.lang.isArray(source) * @param {Any} source 目标参数 * @meta standard * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate * * @returns {boolean} 类型判断结果 */ baidu.lang.isArray = function (source) { return '[object Array]' == Object.prototype.toString.call(source); }; /** * 将一个变量转换成array * @name baidu.lang.toArray * @function * @grammar baidu.lang.toArray(source) * @param {mix} source 需要转换成array的变量 * @version 1.3 * @meta standard * @returns {array} 转换后的array */ baidu.lang.toArray = function (source) { if (source === null || source === undefined) return []; if (baidu.lang.isArray(source)) return source; if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) { return [source]; } if (source.item) { var l = source.length, array = new Array(l); while (l--) array[l] = source[l]; return array; } return [].slice.call(source); }; /** * 获得flash对象的实例 * @name baidu.swf.getMovie * @function * @grammar baidu.swf.getMovie(name) * @param {string} name flash对象的名称 * @see baidu.swf.create * @meta standard * @returns {HTMLElement} flash对象的实例 */ baidu.swf.getMovie = function (name) { var movie = document[name], ret; return baidu.browser.ie == 9 ? movie && movie.length ? (ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){ return item.tagName.toLowerCase() != "embed"; })).length == 1 ? ret[0] : ret : movie : movie || window[name]; }; baidu.flash._Base = (function(){ var prefix = 'bd__flash__'; /** * 创建一个随机的字符串 * @private * @return {String} */ function _createString(){ return prefix + Math.floor(Math.random() * 2147483648).toString(36); }; /** * 检查flash状态 * @private * @param {Object} target flash对象 * @return {Boolean} */ function _checkReady(target){ if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){ return true; }else{ return false; } }; /** * 调用之前进行压栈的函数 * @private * @param {Array} callQueue 调用队列 * @param {Object} target flash对象 * @return {Null} */ function _callFn(callQueue, target){ var result = null; callQueue = callQueue.reverse(); baidu.each(callQueue, function(item){ result = target.call(item.fnName, item.params); item.callBack(result); }); }; /** * 为传入的匿名函数创建函数名 * @private * @param {String|Function} fun 传入的匿名函数或者函数名 * @return {String} */ function _createFunName(fun){ var name = ''; if(baidu.lang.isFunction(fun)){ name = _createString(); window[name] = function(){ fun.apply(window, arguments); }; return name; }else if(baidu.lang.isString){ return fun; } }; /** * 绘制flash * @private * @param {Object} options 创建参数 * @return {Object} */ function _render(options){ if(!options.id){ options.id = _createString(); } var container = options.container || ''; delete(options.container); baidu.swf.create(options, container); return baidu.swf.getMovie(options.id); }; return function(options, callBack){ var me = this, autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true), createOptions = options.createOptions || {}, target = null, isReady = false, callQueue = [], timeHandle = null, callBack = callBack || []; /** * 将flash文件绘制到页面上 * @public * @return {Null} */ me.render = function(){ target = _render(createOptions); if(callBack.length > 0){ baidu.each(callBack, function(funName, index){ callBack[index] = _createFunName(options[funName] || new Function()); }); } me.call('setJSFuncName', [callBack]); }; /** * 返回flash状态 * @return {Boolean} */ me.isReady = function(){ return isReady; }; /** * 调用flash接口的统一入口 * @param {String} fnName 调用的函数名 * @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组 * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数 * @return {Null} */ me.call = function(fnName, params, callBack){ if(!fnName) return null; callBack = callBack || new Function(); var result = null; if(isReady){ result = target.call(fnName, params); callBack(result); }else{ callQueue.push({ fnName: fnName, params: params, callBack: callBack }); (!timeHandle) && (timeHandle = setInterval(_check, 200)); } }; /** * 为传入的匿名函数创建函数名 * @public * @param {String|Function} fun 传入的匿名函数或者函数名 * @return {String} */ me.createFunName = function(fun){ return _createFunName(fun); }; /** * 检查flash是否ready, 并进行调用 * @private * @return {Null} */ function _check(){ if(_checkReady(target)){ clearInterval(timeHandle); timeHandle = null; _call(); isReady = true; } }; /** * 调用之前进行压栈的函数 * @private * @return {Null} */ function _call(){ _callFn(callQueue, target); callQueue = []; } autoRender && me.render(); }; })(); /** * 创建flash based imageUploader * @class * @grammar baidu.flash.imageUploader(options) * @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 * @config {Object} vars 创建imageUploader时所需要的参数 * @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除 * @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除 * @config {Number} vars.picWidth 单张预览图片的宽度 * @config {Number} vars.picHeight 单张预览图片的高度 * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata' * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc' * @config {Number} vars.maxSize 文件的最大体积,单位'MB' * @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩 * @config {Number} vars.maxNum:32 最大上传多少个文件 * @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩 * @config {String} vars.url 上传的url地址 * @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0 * @see baidu.swf.createHTML * @param {String} backgroundUrl 背景图片路径 * @param {String} listBacgroundkUrl 布局控件背景 * @param {String} buttonUrl 按钮图片不背景 * @param {String|Function} selectFileCallback 选择文件的回调 * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调 * @param {String|Function} deleteFileCallback 删除文件的回调 * @param {String|Function} startUploadCallback 开始上传某个文件时的回调 * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调 * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调 * @param {String|Function} allCompleteCallback 全部上传完成时的回调 * @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用 */ baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){ var me = this, options = options || {}, _flash = new baidu.flash._Base(options, [ 'selectFileCallback', 'exceedFileCallback', 'deleteFileCallback', 'startUploadCallback', 'uploadCompleteCallback', 'uploadErrorCallback', 'allCompleteCallback', 'changeFlashHeight' ]); /** * 开始或回复上传图片 * @public * @return {Null} */ me.upload = function(){ _flash.call('upload'); }; /** * 暂停上传图片 * @public * @return {Null} */ me.pause = function(){ _flash.call('pause'); }; me.addCustomizedParams = function(index,obj){ _flash.call('addCustomizedParams',[index,obj]); } }; /** * 操作原生对象的方法 * @namespace baidu.object */ baidu.object = baidu.object || {}; /** * 将源对象的所有属性拷贝到目标对象中 * @author erik * @name baidu.object.extend * @function * @grammar baidu.object.extend(target, source) * @param {Object} target 目标对象 * @param {Object} source 源对象 * @see baidu.array.merge * @remark * 1.目标对象中,与源对象key相同的成员将会被覆盖。
            2.源对象的prototype成员不会拷贝。 * @shortcut extend * @meta standard * * @returns {Object} 目标对象 */ baidu.extend = baidu.object.extend = function (target, source) { for (var p in source) { if (source.hasOwnProperty(p)) { target[p] = source[p]; } } return target; }; /** * 创建flash based fileUploader * @class * @grammar baidu.flash.fileUploader(options) * @param {Object} options * @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 * @config {String} createOptions.width * @config {String} createOptions.height * @config {Number} maxNum 最大可选文件数 * @config {Function|String} selectFile * @config {Function|String} exceedMaxSize * @config {Function|String} deleteFile * @config {Function|String} uploadStart * @config {Function|String} uploadComplete * @config {Function|String} uploadError * @config {Function|String} uploadProgress */ baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){ var me = this, options = options || {}; options.createOptions = baidu.extend({ wmod: 'transparent' },options.createOptions || {}); var _flash = new baidu.flash._Base(options, [ 'selectFile', 'exceedMaxSize', 'deleteFile', 'uploadStart', 'uploadComplete', 'uploadError', 'uploadProgress' ]); _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]); /** * 设置当鼠标移动到flash上时,是否变成手型 * @public * @param {Boolean} isCursor * @return {Null} */ me.setHandCursor = function(isCursor){ _flash.call('setHandCursor', [isCursor || false]); }; /** * 设置鼠标相应函数名 * @param {String|Function} fun */ me.setMSFunName = function(fun){ _flash.call('setMSFunName',[_flash.createFunName(fun)]); }; /** * 执行上传操作 * @param {String} url 上传的url * @param {String} fieldName 上传的表单字段名 * @param {Object} postData 键值对,上传的POST数据 * @param {Number|Array|null|-1} [index]上传的文件序列 * Int值上传该文件 * Array一次串行上传该序列文件 * -1/null上传所有文件 * @return {Null} */ me.upload = function(url, fieldName, postData, index){ if(typeof url !== 'string' || typeof fieldName !== 'string') return null; if(typeof index === 'undefined') index = -1; _flash.call('upload', [url, fieldName, postData, index]); }; /** * 取消上传操作 * @public * @param {Number|-1} index */ me.cancel = function(index){ if(typeof index === 'undefined') index = -1; _flash.call('cancel', [index]); }; /** * 删除文件 * @public * @param {Number|Array} [index] 要删除的index,不传则全部删除 * @param {Function} callBack * */ me.deleteFile = function(index, callBack){ var callBackAll = function(list){ callBack && callBack(list); }; if(typeof index === 'undefined'){ _flash.call('deleteFilesAll', [], callBackAll); return; }; if(typeof index === 'Number') index = [index]; index.sort(function(a,b){ return b-a; }); baidu.each(index, function(item){ _flash.call('deleteFileBy', item, callBackAll); }); }; /** * 添加文件类型,支持macType * @public * @param {Object|Array[Object]} type {description:String, extention:String} * @return {Null}; */ me.addFileType = function(type){ var type = type || [[]]; if(type instanceof Array) type = [type]; else type = [[type]]; _flash.call('addFileTypes', type); }; /** * 设置文件类型,支持macType * @public * @param {Object|Array[Object]} type {description:String, extention:String} * @return {Null}; */ me.setFileType = function(type){ var type = type || [[]]; if(type instanceof Array) type = [type]; else type = [[type]]; _flash.call('setFileTypes', type); }; /** * 设置可选文件的数量限制 * @public * @param {Number} num * @return {Null} */ me.setMaxNum = function(num){ _flash.call('setMaxNum', [num]); }; /** * 设置可选文件大小限制,以兆M为单位 * @public * @param {Number} num,0为无限制 * @return {Null} */ me.setMaxSize = function(num){ _flash.call('setMaxSize', [num]); }; /** * @public */ me.getFileAll = function(callBack){ _flash.call('getFileAll', [], callBack); }; /** * @public * @param {Number} index * @param {Function} [callBack] */ me.getFileByIndex = function(index, callBack){ _flash.call('getFileByIndex', [], callBack); }; /** * @public * @param {Number} index * @param {function} [callBack] */ me.getStatusByIndex = function(index, callBack){ _flash.call('getStatusByIndex', [], callBack); }; }; /** * 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调 * @namespace baidu.sio */ baidu.sio = baidu.sio || {}; /** * * @param {HTMLElement} src script节点 * @param {String} url script节点的地址 * @param {String} [charset] 编码 */ baidu.sio._createScriptTag = function(scr, url, charset){ scr.setAttribute('type', 'text/javascript'); charset && scr.setAttribute('charset', charset); scr.setAttribute('src', url); document.getElementsByTagName('head')[0].appendChild(scr); }; /** * 删除script的属性,再删除script标签,以解决修复内存泄漏的问题 * * @param {HTMLElement} src script节点 */ baidu.sio._removeScriptTag = function(scr){ if (scr.clearAttributes) { scr.clearAttributes(); } else { for (var attr in scr) { if (scr.hasOwnProperty(attr)) { delete scr[attr]; } } } if(scr && scr.parentNode){ scr.parentNode.removeChild(scr); } scr = null; }; /** * 通过script标签加载数据,加载完成由浏览器端触发回调 * @name baidu.sio.callByBrowser * @function * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options) * @param {string} url 加载数据的url * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名 * @param {Object} opt_options 其他可选项 * @config {String} [charset] script的字符集 * @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数 * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 * @remark * 1、与callByServer不同,callback参数只支持Function类型,不支持string。 * 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。 * @meta standard * @see baidu.sio.callByServer */ baidu.sio.callByBrowser = function (url, opt_callback, opt_options) { var scr = document.createElement("SCRIPT"), scriptLoaded = 0, options = opt_options || {}, charset = options['charset'], callback = opt_callback || function(){}, timeOut = options['timeOut'] || 0, timer; scr.onload = scr.onreadystatechange = function () { if (scriptLoaded) { return; } var readyState = scr.readyState; if ('undefined' == typeof readyState || readyState == "loaded" || readyState == "complete") { scriptLoaded = 1; try { callback(); clearTimeout(timer); } finally { scr.onload = scr.onreadystatechange = null; baidu.sio._removeScriptTag(scr); } } }; if( timeOut ){ timer = setTimeout(function(){ scr.onload = scr.onreadystatechange = null; baidu.sio._removeScriptTag(scr); options.onfailure && options.onfailure(); }, timeOut); } baidu.sio._createScriptTag(scr, url, charset); }; /** * 通过script标签加载数据,加载完成由服务器端触发回调 * @name baidu.sio.callByServer * @function * @grammar baidu.sio.callByServer(url, callback[, opt_options]) * @param {string} url 加载数据的url. * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名. * @param {Object} opt_options 加载数据时的选项. * @config {string} [charset] script的字符集 * @config {string} [queryField] 服务器端callback请求字段名,默认为callback * @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数 * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 * @remark * 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。 * @meta standard * @see baidu.sio.callByBrowser */ baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) { var scr = document.createElement('SCRIPT'), prefix = 'bd__cbs__', callbackName, callbackImpl, options = opt_options || {}, charset = options['charset'], queryField = options['queryField'] || 'callback', timeOut = options['timeOut'] || 0, timer, reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'), matches; if (baidu.lang.isFunction(callback)) { callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36); window[callbackName] = getCallBack(0); } else if(baidu.lang.isString(callback)){ callbackName = callback; } else { if (matches = reg.exec(url)) { callbackName = matches[2]; } } if( timeOut ){ timer = setTimeout(getCallBack(1), timeOut); } url = url.replace(reg, '\x241' + queryField + '=' + callbackName); if (url.search(reg) < 0) { url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName; } baidu.sio._createScriptTag(scr, url, charset); /* * 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行 */ function getCallBack(onTimeOut){ /*global callbackName, callback, scr, options;*/ return function(){ try { if( onTimeOut ){ options.onfailure && options.onfailure(); }else{ callback.apply(window, arguments); clearTimeout(timer); } window[callbackName] = null; delete window[callbackName]; } catch (exception) { } finally { baidu.sio._removeScriptTag(scr); } } } }; /** * 通过请求一个图片的方式令服务器存储一条日志 * @function * @grammar baidu.sio.log(url) * @param {string} url 要发送的地址. * @author: int08h,leeight */ baidu.sio.log = function(url) { var img = new Image(), key = 'tangram_sio_log_' + Math.floor(Math.random() * 2147483648).toString(36); window[key] = img; img.onload = img.onerror = img.onabort = function() { img.onload = img.onerror = img.onabort = null; window[key] = null; img = null; }; img.src = url; }; /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/json.js * author: erik * version: 1.1.0 * date: 2009/12/02 */ /** * 操作json对象的方法 * @namespace baidu.json */ baidu.json = baidu.json || {}; /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/json/parse.js * author: erik, berg * version: 1.2 * date: 2009/11/23 */ /** * 将字符串解析成json对象。注:不会自动祛除空格 * @name baidu.json.parse * @function * @grammar baidu.json.parse(data) * @param {string} source 需要解析的字符串 * @remark * 该方法的实现与ecma-262第五版中规定的JSON.parse不同,暂时只支持传入一个参数。后续会进行功能丰富。 * @meta standard * @see baidu.json.stringify,baidu.json.decode * * @returns {JSON} 解析结果json对象 */ baidu.json.parse = function (data) { //2010/12/09:更新至不使用原生parse,不检测用户输入是否正确 return (new Function("return (" + data + ")"))(); }; /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/json/decode.js * author: erik, cat * version: 1.3.4 * date: 2010/12/23 */ /** * 将字符串解析成json对象,为过时接口,今后会被baidu.json.parse代替 * @name baidu.json.decode * @function * @grammar baidu.json.decode(source) * @param {string} source 需要解析的字符串 * @meta out * @see baidu.json.encode,baidu.json.parse * * @returns {JSON} 解析结果json对象 */ baidu.json.decode = baidu.json.parse; /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/json/stringify.js * author: erik * version: 1.1.0 * date: 2010/01/11 */ /** * 将json对象序列化 * @name baidu.json.stringify * @function * @grammar baidu.json.stringify(value) * @param {JSON} value 需要序列化的json对象 * @remark * 该方法的实现与ecma-262第五版中规定的JSON.stringify不同,暂时只支持传入一个参数。后续会进行功能丰富。 * @meta standard * @see baidu.json.parse,baidu.json.encode * * @returns {string} 序列化后的字符串 */ baidu.json.stringify = (function () { /** * 字符串处理时需要转义的字符表 * @private */ var escapeMap = { "\b": '\\b', "\t": '\\t', "\n": '\\n', "\f": '\\f', "\r": '\\r', '"' : '\\"', "\\": '\\\\' }; /** * 字符串序列化 * @private */ function encodeString(source) { if (/["\\\x00-\x1f]/.test(source)) { source = source.replace( /["\\\x00-\x1f]/g, function (match) { var c = escapeMap[match]; if (c) { return c; } c = match.charCodeAt(); return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }); } return '"' + source + '"'; } /** * 数组序列化 * @private */ function encodeArray(source) { var result = ["["], l = source.length, preComma, i, item; for (i = 0; i < l; i++) { item = source[i]; switch (typeof item) { case "undefined": case "function": case "unknown": break; default: if(preComma) { result.push(','); } result.push(baidu.json.stringify(item)); preComma = 1; } } result.push("]"); return result.join(""); } /** * 处理日期序列化时的补零 * @private */ function pad(source) { return source < 10 ? '0' + source : source; } /** * 日期序列化 * @private */ function encodeDate(source){ return '"' + source.getFullYear() + "-" + pad(source.getMonth() + 1) + "-" + pad(source.getDate()) + "T" + pad(source.getHours()) + ":" + pad(source.getMinutes()) + ":" + pad(source.getSeconds()) + '"'; } return function (value) { switch (typeof value) { case 'undefined': return 'undefined'; case 'number': return isFinite(value) ? String(value) : "null"; case 'string': return encodeString(value); case 'boolean': return String(value); default: if (value === null) { return 'null'; } else if (value instanceof Array) { return encodeArray(value); } else if (value instanceof Date) { return encodeDate(value); } else { var result = ['{'], encode = baidu.json.stringify, preComma, item; for (var key in value) { if (Object.prototype.hasOwnProperty.call(value, key)) { item = value[key]; switch (typeof item) { case 'undefined': case 'unknown': case 'function': break; default: if (preComma) { result.push(','); } preComma = 1; result.push(encode(key) + ':' + encode(item)); } } } result.push('}'); return result.join(''); } } }; })(); /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/json/encode.js * author: erik, cat * version: 1.3.4 * date: 2010/12/23 */ /** * 将json对象序列化,为过时接口,今后会被baidu.json.stringify代替 * @name baidu.json.encode * @function * @grammar baidu.json.encode(value) * @param {JSON} value 需要序列化的json对象 * @meta out * @see baidu.json.decode,baidu.json.stringify * * @returns {string} 序列化后的字符串 */ baidu.json.encode = baidu.json.stringify; ================================================ FILE: static/common/user/uedit/dialogs/wordimage/wordimage.html ================================================
            :
            ================================================ FILE: static/common/user/uedit/dialogs/wordimage/wordimage.js ================================================ /** * Created by JetBrains PhpStorm. * User: taoqili * Date: 12-1-30 * Time: 下午12:50 * To change this template use File | Settings | File Templates. */ var wordImage = {}; //(function(){ var g = baidu.g, flashObj,flashContainer; wordImage.init = function(opt, callbacks) { showLocalPath("localPath"); //createCopyButton("clipboard","localPath"); createFlashUploader(opt, callbacks); addUploadListener(); addOkListener(); }; function hideFlash(){ flashObj = null; flashContainer.innerHTML = ""; } function addOkListener() { dialog.onok = function() { if (!imageUrls.length) return; var urlPrefix = editor.getOpt('imageUrlPrefix'), images = domUtils.getElementsByTagName(editor.document,"img"); editor.fireEvent('saveScene'); for (var i = 0,img; img = images[i++];) { var src = img.getAttribute("word_img"); if (!src) continue; for (var j = 0,url; url = imageUrls[j++];) { if (src.indexOf(url.original.replace(" ","")) != -1) { img.src = urlPrefix + url.url; img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 img.setAttribute("title",url.title); domUtils.removeAttributes(img, ["word_img","style","width","height"]); editor.fireEvent("selectionchange"); break; } } } editor.fireEvent('saveScene'); hideFlash(); }; dialog.oncancel = function(){ hideFlash(); } } /** * 绑定开始上传事件 */ function addUploadListener() { g("upload").onclick = function () { flashObj.upload(); this.style.display = "none"; }; } function showLocalPath(id) { //单张编辑 var img = editor.selection.getRange().getClosedNode(); var images = editor.execCommand('wordimage'); if(images.length==1 || img && img.tagName == 'IMG'){ g(id).value = images[0]; return; } var path = images[0]; var leftSlashIndex = path.lastIndexOf("/")||0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种 rightSlashIndex = path.lastIndexOf("\\")||0, separater = leftSlashIndex > rightSlashIndex ? "/":"\\" ; path = path.substring(0, path.lastIndexOf(separater)+1); g(id).value = path; } function createFlashUploader(opt, callbacks) { //由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容 var i18n = utils.extend({},lang.flashI18n); //处理图片资源地址的编码,补全等问题 for(var i in i18n){ if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){ i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]); } } opt = utils.extend(opt,i18n,false); var option = { createOptions:{ id:'flash', url:opt.flashUrl, width:opt.width, height:opt.height, errorMessage:lang.flashError, wmode:browser.safari ? 'transparent' : 'window', ver:'10.0.0', vars:opt, container:opt.container } }; option = extendProperty(callbacks, option); flashObj = new baidu.flash.imageUploader(option); flashContainer = $G(opt.container); } function extendProperty(fromObj, toObj) { for (var i in fromObj) { if (!toObj[i]) { toObj[i] = fromObj[i]; } } return toObj; } //})(); function getPasteData(id) { baidu.g("msg").innerHTML = lang.copySuccess + "
            "; setTimeout(function() { baidu.g("msg").innerHTML = ""; }, 5000); return baidu.g(id).value; } function createCopyButton(id, dataFrom) { baidu.swf.create({ id:"copyFlash", url:"fClipboard_ueditor.swf", width:"58", height:"25", errorMessage:"", bgColor:"#CBCBCB", wmode:"transparent", ver:"10.0.0", vars:{ tid:dataFrom } }, id ); var clipboard = baidu.swf.getMovie("copyFlash"); var clipinterval = setInterval(function() { if (clipboard && clipboard.flashInit) { clearInterval(clipinterval); clipboard.setHandCursor(true); clipboard.setContentFuncName("getPasteData"); //clipboard.setMEFuncName("mouseEventHandler"); } }, 500); } createCopyButton("clipboard", "localPath"); ================================================ FILE: static/common/user/uedit/lang/en/en.js ================================================ /** * Created with JetBrains PhpStorm. * User: taoqili * Date: 12-6-12 * Time: 下午6:57 * To change this template use File | Settings | File Templates. */ UE.I18N['en'] = { 'labelMap':{ 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap', 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts' }, 'insertorderedlist':{ 'num':'1,2,3...', 'num1':'1),2),3)...', 'num2':'(1),(2),(3)...', 'cn':'一,二,三....', 'cn1':'一),二),三)....', 'cn2':'(一),(二),(三)....', 'decimal':'1,2,3...', 'lower-alpha':'a,b,c...', 'lower-roman':'i,ii,iii...', 'upper-alpha':'A,B,C...', 'upper-roman':'I,II,III...' }, 'insertunorderedlist':{ 'circle':'○ Circle', 'disc':'● Circle dot', 'square':'■ Rectangle ', 'dash' :'- Dash', 'dot' : '。dot' }, 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, 'fontfamily':{ 'songti':'Sim Sun', 'kaiti':'Sim Kai', 'heiti':'Sim Hei', 'lishu':'Sim Li', 'yahei': 'Microsoft YaHei', 'andaleMono':'Andale Mono', 'arial': 'Arial', 'arialBlack':'Arial Black', 'comicSansMs':'Comic Sans MS', 'impact':'Impact', 'timesNewRoman':'Times New Roman' }, 'customstyle':{ 'tc':'Title center', 'tl':'Title left', 'im':'Important', 'hi':'Highlight' }, 'autoupload': { 'exceedSizeError': 'File Size Exceed', 'exceedTypeError': 'File Type Not Allow', 'jsonEncodeError': 'Server Return Format Error', 'loading':"loading...", 'loadError':"load error", 'errorLoadConfig': 'Server config not loaded, upload can not work.', }, 'simpleupload':{ 'exceedSizeError': 'File Size Exceed', 'exceedTypeError': 'File Type Not Allow', 'jsonEncodeError': 'Server Return Format Error', 'loading':"loading...", 'loadError':"load error", 'errorLoadConfig': 'Server config not loaded, upload can not work.', }, 'elementPathTip':"Path", 'wordCountTip':"Word Count", 'wordCountMsg':'{#count} characters entered,{#leave} left. ', 'wordOverFlowMsg':'The number of characters has exceeded allowable maximum values, the server may refuse to save!', 'ok':"OK", 'cancel':"Cancel", 'closeDialog':"closeDialog", 'tableDrag':"You must import the file uiUtils.js before drag! ", 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", 'loadconfigError': 'Get server config error.', 'loadconfigFormatError': 'Server config format error.', 'loadconfigHttpError': 'Get server config http error.', 'snapScreen_plugin':{ 'browserMsg':"Only IE supported!", 'callBackErrorMsg':"The callback data is wrong,please check the config!", 'uploadErrorMsg':"Upload error,please check your server environment! " }, 'insertcode':{ 'as3':'ActionScript 3', 'bash':'Bash/Shell', 'cpp':'C/C++', 'css':'CSS', 'cf':'ColdFusion', 'c#':'C#', 'delphi':'Delphi', 'diff':'Diff', 'erlang':'Erlang', 'groovy':'Groovy', 'html':'HTML', 'java':'Java', 'jfx':'JavaFX', 'js':'JavaScript', 'pl':'Perl', 'php':'PHP', 'plain':'Plain Text', 'ps':'PowerShell', 'python':'Python', 'ruby':'Ruby', 'scala':'Scala', 'sql':'SQL', 'vb':'Visual Basic', 'xml':'XML' }, 'confirmClear':"Do you confirm to clear the Document?", 'contextMenu':{ 'delete':"Delete", 'selectall':"Select all", 'deletecode':"Delete Code", 'cleardoc':"Clear Document", 'confirmclear':"Do you confirm to clear the Document?", 'unlink':"Unlink", 'paragraph':"Paragraph", 'edittable':"Table property", 'aligncell':'Align cell', 'aligntable':'Table alignment', 'tableleft':'Left float', 'tablecenter':'Center', 'tableright':'Right float', 'aligntd':'Cell alignment', 'edittd':"Cell property", 'setbordervisible':'set table edge visible', 'table':"Table", 'justifyleft':'Justify Left', 'justifyright':'Justify Right', 'justifycenter':'Justify Center', 'justifyjustify':'Default', 'deletetable':"Delete table", 'insertparagraphbefore':"InsertedBeforeLine", 'insertparagraphafter':'InsertedAfterLine', 'inserttable':'Insert table', 'insertcaption':'Insert caption', 'deletecaption':'Delete Caption', 'inserttitle':'Insert Title', 'deletetitle':'Delete Title', 'inserttitlecol':'Insert Title Col', 'deletetitlecol':'Delete Title Col', 'averageDiseRow':'AverageDise Row', 'averageDisCol':'AverageDis Col', 'deleterow':"Delete row", 'deletecol':"Delete col", 'insertrow':"Insert row", 'insertcol':"Insert col", 'insertrownext':'Insert Row Next', 'insertcolnext':'Insert Col Next', 'mergeright':"Merge right", 'mergeleft':"Merge left", 'mergedown':"Merge down", 'mergecells':"Merge cells", 'splittocells':"Split to cells", 'splittocols':"Split to Cols", 'splittorows':"Split to Rows", 'tablesort':'Table sorting', 'enablesort':'Sorting Enable', 'disablesort':'Sorting Disable', 'reversecurrent':'Reverse current', 'orderbyasc':'Order By ASCII', 'reversebyasc':'Reverse By ASCII', 'orderbynum':'Order By Num', 'reversebynum':'Reverse By Num', 'borderbk':'Border shading', 'setcolor':'interlaced color', 'unsetcolor':'Cancel interlacedcolor', 'setbackground':'Background interlaced', 'unsetbackground':'Cancel Bk interlaced', 'redandblue':'Blue and red', 'threecolorgradient':'Three-color gradient', 'copy':"Copy(Ctrl + c)", 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!", 'paste':"Paste(Ctrl + v)", 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!" }, 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", 'anthorMsg':"Link", 'clearColor':'Clear', 'standardColor':'Standard color', 'themeColor':'Theme color', 'property':'Property', 'default':'Default', 'modify':'Modify', 'justifyleft':'Justify Left', 'justifyright':'Justify Right', 'justifycenter':'Justify Center', 'justify':'Default', 'clear':'Clear', 'anchorMsg':'Anchor', 'delete':'Delete', 'clickToUpload':"Click to upload", 'unset':'Language hasn\'t been set!', 't_row':'row', 't_col':'col', 'pasteOpt':'Paste Option', 'pasteSourceFormat':"Keep Source Formatting", 'tagFormat':'Keep tag', 'pasteTextFormat':'Keep Text only', 'more':'More', 'autoTypeSet':{ 'mergeLine':"Merge empty line", 'delLine':"Del empty line", 'removeFormat':"Remove format", 'indent':"Indent", 'alignment':"Alignment", 'imageFloat':"Image float", 'removeFontsize':"Remove font size", 'removeFontFamily':"Remove fontFamily", 'removeHtml':"Remove redundant HTML code", 'pasteFilter':"Paste filter", 'run':"Done", 'symbol':'Symbol Conversion', 'bdc2sb':'Full-width to Half-width', 'tobdc':'Half-width to Full-width' }, 'background':{ 'static':{ 'lang_background_normal':'Normal', 'lang_background_local':'Online', 'lang_background_set':'Background Set', 'lang_background_none':'No Background', 'lang_background_colored':'Colored Background', 'lang_background_color':'Color Set', 'lang_background_netimg':'Net-Image', 'lang_background_align':'Align Type', 'lang_background_position':'Position', 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]} }, 'noUploadImage':"No pictures has been uploaded!", 'toggleSelect':'Change the active state by click!\n Image Size: ' }, //===============dialog i18N======================= 'insertimage':{ 'static':{ 'lang_tab_remote':"Insert", 'lang_tab_upload':"Local", 'lang_tab_online':"Manager", 'lang_tab_search':"Search", 'lang_input_url':"Address:", 'lang_input_size':"Size:", 'lang_input_width':"Width", 'lang_input_height':"Height", 'lang_input_border':"Border:", 'lang_input_vhspace':"Margins:", 'lang_input_title':"Title:", 'lang_input_align':'Image Float Style:', 'lang_imgLoading':"Loading...", 'lang_start_upload':"Start Upload", 'lock':{'title':"Lock rate"}, 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]}, 'searchTxt':{'value':"Enter the search keyword!"}, 'searchBtn':{'value':"Search"}, 'searchReset':{'value':"Clear"}, 'noneAlign':{'title':'None Float'}, 'leftAlign':{'title':'Left Float'}, 'rightAlign':{'title':'Right Float'}, 'centerAlign':{'title':'Center In A Line'} }, 'uploadSelectFile':'Select File', 'uploadAddFile':'Add File', 'uploadStart':'Start Upload', 'uploadPause':'Pause Upload', 'uploadContinue':'Continue Upload', 'uploadRetry':'Retry Upload', 'uploadDelete':'Delete', 'uploadTurnLeft':'Turn Left', 'uploadTurnRight':'Turn Right', 'uploadPreview':'Doing Preview', 'uploadNoPreview':'Can Not Preview', 'updateStatusReady': 'Selected _ pictures, total _KB.', 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully', 'updateStatusError': ' and _ upload failed', 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', 'errorLoadConfig': 'Server config not loaded, upload can not work.', 'errorExceedSize':'File Size Exceed', 'errorFileType':'File Type Not Allow', 'errorInterrupt':'File Upload Interrupted', 'errorUploadRetry':'Upload Error, Please Retry.', 'errorHttp':'Http Error', 'errorServerUpload':'Server Result Error.', 'remoteLockError':"Cannot Lock the Proportion between width and height", 'numError':"Please enter the correct Num. e.g 123,400", 'imageUrlError':"The image format may be wrong!", 'imageLoadError':"Error,please check the network or URL!", 'searchRemind':"Enter the search keyword!", 'searchLoading':"Image is loading,please wait...", 'searchRetry':" Sorry,can't find the image,please try again!" }, 'attachment':{ 'static':{ 'lang_tab_upload': 'Upload', 'lang_tab_online': 'Online', 'lang_start_upload':"Start upload", 'lang_drop_remind':"You can drop files here, a single maximum of 300 files" }, 'uploadSelectFile':'Select File', 'uploadAddFile':'Add File', 'uploadStart':'Start Upload', 'uploadPause':'Pause Upload', 'uploadContinue':'Continue Upload', 'uploadRetry':'Retry Upload', 'uploadDelete':'Delete', 'uploadTurnLeft':'Turn Left', 'uploadTurnRight':'Turn Right', 'uploadPreview':'Doing Preview', 'updateStatusReady': 'Selected _ files, total _KB.', 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', 'updateStatusError': ' and _ upload failed', 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', 'errorLoadConfig': 'Server config not loaded, upload can not work.', 'errorExceedSize':'File Size Exceed', 'errorFileType':'File Type Not Allow', 'errorInterrupt':'File Upload Interrupted', 'errorUploadRetry':'Upload Error, Please Retry.', 'errorHttp':'Http Error', 'errorServerUpload':'Server Result Error.' }, 'insertvideo':{ 'static':{ 'lang_tab_insertV':"Video", 'lang_tab_searchV':"Search", 'lang_tab_uploadV':"Upload", 'lang_video_url':" URL ", 'lang_video_size':"Video Size", 'lang_videoW':"Width", 'lang_videoH':"Height", 'lang_alignment':"Alignment", 'videoSearchTxt':{'value':"Enter the search keyword!"}, 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, 'videoSearchBtn':{'value':"Search in Baidu"}, 'videoSearchReset':{'value':"Clear result"}, 'lang_input_fileStatus':' No file uploaded!', 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, 'lang_upload_size':"Video Size", 'lang_upload_width':"Width", 'lang_upload_height':"Height", 'lang_upload_alignment':"Alignment", 'lang_format_advice':"Recommends mp4 format." }, 'numError':"Please enter the correct Num. e.g 123,400", 'floatLeft':"Float left", 'floatRight':"Float right", 'default':"Default", 'block':"Display in block", 'urlError':"The video url format may be wrong!", 'loading':"  The video is loading, please wait…", 'clickToSelect':"Click to select", 'goToSource':'Visit source video ', 'noVideo':"    Sorry,can't find the video,please try again!", 'browseFiles':'Open files', 'uploadSuccess':'Upload Successful!', 'delSuccessFile':'Remove from the success of the queue', 'delFailSaveFile':'Remove the save failed file', 'statusPrompt':' file(s) uploaded! ', 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!', 'flashLoadingError':'The Flash failed loading! Please check the path or network state', 'fileUploadReady':'Wait for uploading...', 'delUploadQueue':'Remove from the uploading queue ', 'limitPrompt1':'Can not choose more than single', 'limitPrompt2':'file(s)!Please choose again!', 'delFailFile':'Remove failure file', 'fileSizeLimit':'File size exceeds the limit!', 'emptyFile':'Can not upload an empty file!', 'fileTypeError':'File type error!', 'unknownError':'Unknown error!', 'fileUploading':'Uploading,please wait...', 'cancelUpload':'Cancel upload', 'netError':'Network error', 'failUpload':'Upload failed', 'serverIOError':'Server IO error!', 'noAuthority':'No Permission!', 'fileNumLimit':'Upload limit to the number', 'failCheck':'Authentication fails, the upload is skipped!', 'fileCanceling':'Cancel, please wait...', 'stopUploading':'Upload has stopped...', 'uploadSelectFile':'Select File', 'uploadAddFile':'Add File', 'uploadStart':'Start Upload', 'uploadPause':'Pause Upload', 'uploadContinue':'Continue Upload', 'uploadRetry':'Retry Upload', 'uploadDelete':'Delete', 'uploadTurnLeft':'Turn Left', 'uploadTurnRight':'Turn Right', 'uploadPreview':'Doing Preview', 'updateStatusReady': 'Selected _ files, total _KB.', 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', 'updateStatusError': ' and _ upload failed', 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', 'errorLoadConfig': 'Server config not loaded, upload can not work.', 'errorExceedSize':'File Size Exceed', 'errorFileType':'File Type Not Allow', 'errorInterrupt':'File Upload Interrupted', 'errorUploadRetry':'Upload Error, Please Retry.', 'errorHttp':'Http Error', 'errorServerUpload':'Server Result Error.' }, 'webapp':{ 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", 'tip2':"And then open the file ueditor.config.js to set it! ", 'applyFor':"APPLY FOR", 'anthorApi':"Baidu API" }, 'template':{ 'static':{ 'lang_template_bkcolor':'Background Color', 'lang_template_clear' : 'Keep Content', 'lang_template_select':'Select Template' }, 'blank':"Blank", 'blog':"Blog", 'resume':"Resume", 'richText':"Rich Text", 'scrPapers':"Scientific Papers" }, scrawl:{ 'static':{ 'lang_input_previousStep':"Previous", 'lang_input_nextsStep':"Next", 'lang_input_clear':'Clear', 'lang_input_addPic':'AddImage', 'lang_input_ScalePic':'ScaleImage', 'lang_input_removePic':'RemoveImage', 'J_imgTxt':{title:'Add background image'} }, 'noScarwl':"No paint, a white paper...", 'scrawlUpLoading':"Image is uploading, please wait...", 'continueBtn':"Try again", 'imageError':"Image failed to load!", 'backgroundUploading':'Image is uploading,please wait...' }, 'music':{ 'static':{ 'lang_input_tips':"Input singer/song/album, search you interested in music!", 'J_searchBtn':{value:'Search songs'} }, 'emptyTxt':'Not search to the relevant music results, please change a keyword try.', 'chapter':'Songs', 'singer':'Singer', 'special':'Album', 'listenTest':'Audition' }, anchor:{ 'static':{ 'lang_input_anchorName':'Anchor Name:' } }, 'charts':{ 'static':{ 'lang_data_source':'Data source:', 'lang_chart_format': 'Chart format:', 'lang_data_align': 'Align', 'lang_chart_align_same': 'Consistent with the X-axis Y-axis', 'lang_chart_align_reverse': 'X-axis Y-axis opposite', 'lang_chart_title': 'Title', 'lang_chart_main_title': 'main title:', 'lang_chart_sub_title': 'sub title:', 'lang_chart_x_title': 'X-axis title:', 'lang_chart_y_title': 'Y-axis title:', 'lang_chart_tip': 'Prompt', 'lang_cahrt_tip_prefix': 'prefix:', 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', 'lang_chart_data_unit': 'Unit', 'lang_chart_data_unit_title': 'unit:', 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', 'lang_chart_type': 'Chart type:', 'lang_prev_btn': 'Previous', 'lang_next_btn': 'Next' } }, emotion:{ 'static':{ 'lang_input_choice':'Choice', 'lang_input_Tuzki':'Tuzki', 'lang_input_lvdouwa':'LvDouWa', 'lang_input_BOBO':'BOBO', 'lang_input_babyCat':'BabyCat', 'lang_input_bubble':'Bubble', 'lang_input_youa':'YouA' } }, gmap:{ 'static':{ 'lang_input_address':'Address:', 'lang_input_search':'Search', 'address':{value:"Beijing"} }, searchError:'Unable to locate the address!' }, help:{ 'static':{ 'lang_input_about':'About', 'lang_input_shortcuts':'Shortcuts', 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", 'lang_Txt_shortcuts':'Shortcuts', 'lang_Txt_func':'Function', 'lang_Txt_bold':'Bold', 'lang_Txt_copy':'Copy', 'lang_Txt_cut':'Cut', 'lang_Txt_Paste':'Paste', 'lang_Txt_undo':'Undo', 'lang_Txt_redo':'Redo', 'lang_Txt_italic':'Italic', 'lang_Txt_underline':'Underline', 'lang_Txt_selectAll':'Select All', 'lang_Txt_visualEnter':'Submit', 'lang_Txt_fullscreen':'Fullscreen' } }, insertframe:{ 'static':{ 'lang_input_address':'Address:', 'lang_input_width':'Width:', 'lang_input_height':'height:', 'lang_input_isScroll':'Enable scrollbars:', 'lang_input_frameborder':'Show frame border:', 'lang_input_alignMode':'Alignment:', 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]} }, 'enterAddress':'Please enter an address!' }, link:{ 'static':{ 'lang_input_text':'Text:', 'lang_input_url':'URL:', 'lang_input_title':'Title:', 'lang_input_target':'open in new window:' }, 'validLink':'Supports only effective when a link is selected', 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' }, map:{ 'static':{ lang_city:"City", lang_address:"Address", city:{value:"Beijing"}, lang_search:"Search", lang_dynamicmap:"Dynamic map" }, cityMsg:"Please enter the city name!", errorMsg:"Can't find the place!" }, searchreplace:{ 'static':{ lang_tab_search:"Search", lang_tab_replace:"Replace", lang_search1:"Search", lang_search2:"Search", lang_replace:"Replace", lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', lang_case_sensitive1:"Case sense", lang_case_sensitive2:"Case sense", nextFindBtn:{value:"Next"}, preFindBtn:{value:"Preview"}, nextReplaceBtn:{value:"Next"}, preReplaceBtn:{value:"Preview"}, repalceBtn:{value:"Replace"}, repalceAllBtn:{value:"Replace all"} }, getEnd:"Has the search to the bottom!", getStart:"Has the search to the top!", countMsg:"Altogether replaced {#count} character(s)!" }, snapscreen:{ 'static':{ lang_showMsg:"You should install the UEditor screenshots program first!", lang_download:"Download!", lang_step1:"Step1:Download the program and then run it", lang_step2:"Step2:After complete install,try to click the button again" } }, spechars:{ 'static':{}, tsfh:"Special", lmsz:"Roman", szfh:"Numeral", rwfh:"Japanese", xlzm:"The Greek", ewzm:"Russian", pyzm:"Phonetic", yyyb:"English", zyzf:"Others" }, 'edittable':{ 'static':{ 'lang_tableStyle':'Table style', 'lang_insertCaption':'Add table header row', 'lang_insertTitle':'Add table title row', 'lang_insertTitleCol':'Add table title col', 'lang_tableSize':'Automatically adjust table size', 'lang_autoSizeContent':'Adaptive by form text', 'lang_orderbycontent':"Table of contents sortable", 'lang_autoSizePage':'Page width adaptive', 'lang_example':'Example', 'lang_borderStyle':'Table Border', 'lang_color':'Color:' }, captionName:'Caption', titleName:'Title', cellsName:'text', errorMsg:'There are merged cells, can not sort.' }, 'edittip':{ 'static':{ lang_delRow:'Delete entire row', lang_delCol:'Delete entire col' } }, 'edittd':{ 'static':{ lang_tdBkColor:'Background Color:' } }, 'formula':{ 'static':{ } }, wordimage:{ 'static':{ lang_resave:"The re-save step", uploadBtn:{src:"upload.png", alt:"Upload"}, clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." }, fileType:"Image", flashError:"Flash initialization failed!", netError:"Network error! Please try again!", copySuccess:"URL has been copied!", 'flashI18n':{ lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ), uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ), imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ), textEncoding:"utf-8", addImageSkinURL:"addImage.png", allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png", allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png", rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png", rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png", rotateRightBtnEnableSkinURL:"rotateRightEnable.png", rotateRightBtnDisableSkinURL:"rotateRightDisable.png", deleteBtnEnableSkinURL:"deleteEnable.png", deleteBtnDisableSkinURL:"deleteDisable.png", backgroundURL:'', listBackgroundURL:'', buttonURL:'button.png' } }, 'autosave': { 'success':'Local conservation success' } }; ================================================ FILE: static/common/user/uedit/lang/zh-cn/zh-cn.js ================================================ /** * Created with JetBrains PhpStorm. * User: taoqili * Date: 12-6-12 * Time: 下午5:02 * To change this template use File | Settings | File Templates. */ UE.I18N['zh-cn'] = { 'labelMap':{ 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图', 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框', 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用', 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览', 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期', 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格', 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题', 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言', 'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接', 'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图', 'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐', 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表', 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入', 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认', 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存', 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版', 'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦', 'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表' }, 'insertorderedlist':{ 'num':'1,2,3...', 'num1':'1),2),3)...', 'num2':'(1),(2),(3)...', 'cn':'一,二,三....', 'cn1':'一),二),三)....', 'cn2':'(一),(二),(三)....', 'decimal':'1,2,3...', 'lower-alpha':'a,b,c...', 'lower-roman':'i,ii,iii...', 'upper-alpha':'A,B,C...', 'upper-roman':'I,II,III...' }, 'insertunorderedlist':{ 'circle':'○ 大圆圈', 'disc':'● 小黑点', 'square':'■ 小方块 ', 'dash' :'— 破折号', 'dot':' 。 小圆圈' }, 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'}, 'fontfamily':{ 'songti':'宋体', 'kaiti':'楷体', 'heiti':'黑体', 'lishu':'隶书', 'yahei':'微软雅黑', 'andaleMono':'andale mono', 'arial': 'arial', 'arialBlack':'arial black', 'comicSansMs':'comic sans ms', 'impact':'impact', 'timesNewRoman':'times new roman' }, 'customstyle':{ 'tc':'标题居中', 'tl':'标题居左', 'im':'强调', 'hi':'明显强调' }, 'autoupload': { 'exceedSizeError': '文件大小超出限制', 'exceedTypeError': '文件格式不允许', 'jsonEncodeError': '服务器返回格式错误', 'loading':"正在上传...", 'loadError':"上传错误", 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' }, 'simpleupload':{ 'exceedSizeError': '文件大小超出限制', 'exceedTypeError': '文件格式不允许', 'jsonEncodeError': '服务器返回格式错误', 'loading':"正在上传...", 'loadError':"上传错误", 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' }, 'elementPathTip':"元素路径", 'wordCountTip':"字数统计", 'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ', 'wordOverFlowMsg':'字数超出最大允许值,服务器可能拒绝保存!', 'ok':"确认", 'cancel':"取消", 'closeDialog':"关闭对话框", 'tableDrag':"表格拖动必须引入uiUtils.js文件!", 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', 'snapScreen_plugin':{ 'browserMsg':"仅支持IE浏览器!", 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。", 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! " }, 'insertcode':{ 'as3':'ActionScript 3', 'bash':'Bash/Shell', 'cpp':'C/C++', 'css':'CSS', 'cf':'ColdFusion', 'c#':'C#', 'delphi':'Delphi', 'diff':'Diff', 'erlang':'Erlang', 'groovy':'Groovy', 'html':'HTML', 'java':'Java', 'jfx':'JavaFX', 'js':'JavaScript', 'pl':'Perl', 'php':'PHP', 'plain':'Plain Text', 'ps':'PowerShell', 'python':'Python', 'ruby':'Ruby', 'scala':'Scala', 'sql':'SQL', 'vb':'Visual Basic', 'xml':'XML' }, 'confirmClear':"确定清空当前文档么?", 'contextMenu':{ 'delete':"删除", 'selectall':"全选", 'deletecode':"删除代码", 'cleardoc':"清空文档", 'confirmclear':"确定清空当前文档么?", 'unlink':"删除超链接", 'paragraph':"段落格式", 'edittable':"表格属性", 'aligntd':"单元格对齐方式", 'aligntable':'表格对齐方式', 'tableleft':'左浮动', 'tablecenter':'居中显示', 'tableright':'右浮动', 'edittd':"单元格属性", 'setbordervisible':'设置表格边线可见', 'justifyleft':'左对齐', 'justifyright':'右对齐', 'justifycenter':'居中对齐', 'justifyjustify':'两端对齐', 'table':"表格", 'inserttable':'插入表格', 'deletetable':"删除表格", 'insertparagraphbefore':"前插入段落", 'insertparagraphafter':'后插入段落', 'deleterow':"删除当前行", 'deletecol':"删除当前列", 'insertrow':"前插入行", 'insertcol':"左插入列", 'insertrownext':'后插入行', 'insertcolnext':'右插入列', 'insertcaption':'插入表格名称', 'deletecaption':'删除表格名称', 'inserttitle':'插入表格标题行', 'deletetitle':'删除表格标题行', 'inserttitlecol':'插入表格标题列', 'deletetitlecol':'删除表格标题列', 'averageDiseRow':'平均分布各行', 'averageDisCol':'平均分布各列', 'mergeright':"向右合并", 'mergeleft':"向左合并", 'mergedown':"向下合并", 'mergecells':"合并单元格", 'splittocells':"完全拆分单元格", 'splittocols':"拆分成列", 'splittorows':"拆分成行", 'tablesort':'表格排序', 'enablesort':'设置表格可排序', 'disablesort':'取消表格可排序', 'reversecurrent':'逆序当前', 'orderbyasc':'按ASCII字符升序', 'reversebyasc':'按ASCII字符降序', 'orderbynum':'按数值大小升序', 'reversebynum':'按数值大小降序', 'borderbk':'边框底纹', 'setcolor':'表格隔行变色', 'unsetcolor':'取消表格隔行变色', 'setbackground':'选区背景隔行', 'unsetbackground':'取消选区背景', 'redandblue':'红蓝相间', 'threecolorgradient':'三色渐变', 'copy':"复制(Ctrl + c)", 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", 'paste':"粘贴(Ctrl + v)", 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" }, 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", 'anthorMsg':"链接", 'clearColor':'清空颜色', 'standardColor':'标准颜色', 'themeColor':'主题颜色', 'property':'属性', 'default':'默认', 'modify':'修改', 'justifyleft':'左对齐', 'justifyright':'右对齐', 'justifycenter':'居中', 'justify':'默认', 'clear':'清除', 'anchorMsg':'锚点', 'delete':'删除', 'clickToUpload':"点击上传", 'unset':'尚未设置语言文件', 't_row':'行', 't_col':'列', 'more':'更多', 'pasteOpt':'粘贴选项', 'pasteSourceFormat':"保留源格式", 'tagFormat':'只保留标签', 'pasteTextFormat':'只保留文本', 'autoTypeSet':{ 'mergeLine':"合并空行", 'delLine':"清除空行", 'removeFormat':"清除格式", 'indent':"首行缩进", 'alignment':"对齐方式", 'imageFloat':"图片浮动", 'removeFontsize':"清除字号", 'removeFontFamily':"清除字体", 'removeHtml':"清除冗余HTML代码", 'pasteFilter':"粘贴过滤", 'run':"执行", 'symbol':'符号转换', 'bdc2sb':'全角转半角', 'tobdc':'半角转全角' }, 'background':{ 'static':{ 'lang_background_normal':'背景设置', 'lang_background_local':'在线图片', 'lang_background_set':'选项', 'lang_background_none':'无背景色', 'lang_background_colored':'有背景色', 'lang_background_color':'颜色设置', 'lang_background_netimg':'网络图片', 'lang_background_align':'对齐方式', 'lang_background_position':'精确定位', 'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]} }, 'noUploadImage':"当前未上传过任何图片!", 'toggleSelect':"单击可切换选中状态\n原图尺寸: " }, //===============dialog i18N======================= 'insertimage':{ 'static':{ 'lang_tab_remote':"插入图片", //节点 'lang_tab_upload':"本地上传", 'lang_tab_online':"在线管理", 'lang_tab_search':"图片搜索", 'lang_input_url':"地 址:", 'lang_input_size':"大 小:", 'lang_input_width':"宽度", 'lang_input_height':"高度", 'lang_input_border':"边 框:", 'lang_input_vhspace':"边 距:", 'lang_input_title':"描 述:", 'lang_input_align':'图片浮动方式:', 'lang_imgLoading':" 图片加载中……", 'lang_start_upload':"开始上传", 'lock':{'title':"锁定宽高比例"}, //属性 'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option 'searchTxt':{'value':"请输入搜索关键词"}, 'searchBtn':{'value':"百度一下"}, 'searchReset':{'value':"清空搜索"}, 'noneAlign':{'title':'无浮动'}, 'leftAlign':{'title':'左浮动'}, 'rightAlign':{'title':'右浮动'}, 'centerAlign':{'title':'居中独占一行'} }, 'uploadSelectFile':'点击选择图片', 'uploadAddFile':'继续添加', 'uploadStart':'开始上传', 'uploadPause':'暂停上传', 'uploadContinue':'继续上传', 'uploadRetry':'重试上传', 'uploadDelete':'删除', 'uploadTurnLeft':'向左旋转', 'uploadTurnRight':'向右旋转', 'uploadPreview':'预览中', 'uploadNoPreview':'不能预览', 'updateStatusReady': '选中_张图片,共_KB。', 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败', 'updateStatusFinish': '共_张(_KB),_张上传成功', 'updateStatusError': ',_张上传失败。', 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', 'errorExceedSize':'文件大小超出', 'errorFileType':'文件格式不允许', 'errorInterrupt':'文件传输中断', 'errorUploadRetry':'上传失败,请重试', 'errorHttp':'http请求错误', 'errorServerUpload':'服务器返回出错', 'remoteLockError':"宽高不正确,不能所定比例", 'numError':"请输入正确的长度或者宽度值!例如:123,400", 'imageUrlError':"不允许的图片格式或者图片域!", 'imageLoadError':"图片加载失败!请检查链接地址或网络状态!", 'searchRemind':"请输入搜索关键词", 'searchLoading':"图片加载中,请稍后……", 'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!" }, 'attachment':{ 'static':{ 'lang_tab_upload': '上传附件', 'lang_tab_online': '在线附件', 'lang_start_upload':"开始上传", 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件" }, 'uploadSelectFile':'点击选择文件', 'uploadAddFile':'继续添加', 'uploadStart':'开始上传', 'uploadPause':'暂停上传', 'uploadContinue':'继续上传', 'uploadRetry':'重试上传', 'uploadDelete':'删除', 'uploadTurnLeft':'向左旋转', 'uploadTurnRight':'向右旋转', 'uploadPreview':'预览中', 'updateStatusReady': '选中_个文件,共_KB。', 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败', 'updateStatusFinish': '共_个(_KB),_个上传成功', 'updateStatusError': ',_张上传失败。', 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', 'errorExceedSize':'文件大小超出', 'errorFileType':'文件格式不允许', 'errorInterrupt':'文件传输中断', 'errorUploadRetry':'上传失败,请重试', 'errorHttp':'http请求错误', 'errorServerUpload':'服务器返回出错' }, 'insertvideo':{ 'static':{ 'lang_tab_insertV':"插入视频", 'lang_tab_searchV':"搜索视频", 'lang_tab_uploadV':"上传视频", 'lang_video_url':"视频网址", 'lang_video_size':"视频尺寸", 'lang_videoW':"宽度", 'lang_videoH':"高度", 'lang_alignment':"对齐方式", 'videoSearchTxt':{'value':"请输入搜索关键字!"}, 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, 'videoSearchBtn':{'value':"百度一下"}, 'videoSearchReset':{'value':"清空结果"}, 'lang_input_fileStatus':' 当前未上传文件', 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, 'lang_upload_size':"视频尺寸", 'lang_upload_width':"宽度", 'lang_upload_height':"高度", 'lang_upload_alignment':"对齐方式", 'lang_format_advice':"建议使用mp4格式." }, 'numError':"请输入正确的数值,如123,400", 'floatLeft':"左浮动", 'floatRight':"右浮动", '"default"':"默认", 'block':"独占一行", 'urlError':"输入的视频地址有误,请检查后再试!", 'loading':"  视频加载中,请等待……", 'clickToSelect':"点击选中", 'goToSource':'访问源视频', 'noVideo':"    抱歉,找不到对应的视频,请重试!", 'browseFiles':'浏览文件', 'uploadSuccess':'上传成功!', 'delSuccessFile':'从成功队列中移除', 'delFailSaveFile':'移除保存失败文件', 'statusPrompt':' 个文件已上传! ', 'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!', 'flashLoadingError':'Flash加载失败!请检查路径或网络状态', 'fileUploadReady':'等待上传……', 'delUploadQueue':'从上传队列中移除', 'limitPrompt1':'单次不能选择超过', 'limitPrompt2':'个文件!请重新选择!', 'delFailFile':'移除失败文件', 'fileSizeLimit':'文件大小超出限制!', 'emptyFile':'空文件无法上传!', 'fileTypeError':'文件类型不允许!', 'unknownError':'未知错误!', 'fileUploading':'上传中,请等待……', 'cancelUpload':'取消上传', 'netError':'网络错误', 'failUpload':'上传失败!', 'serverIOError':'服务器IO错误!', 'noAuthority':'无权限!', 'fileNumLimit':'上传个数限制', 'failCheck':'验证失败,本次上传被跳过!', 'fileCanceling':'取消中,请等待……', 'stopUploading':'上传已停止……', 'uploadSelectFile':'点击选择文件', 'uploadAddFile':'继续添加', 'uploadStart':'开始上传', 'uploadPause':'暂停上传', 'uploadContinue':'继续上传', 'uploadRetry':'重试上传', 'uploadDelete':'删除', 'uploadTurnLeft':'向左旋转', 'uploadTurnRight':'向右旋转', 'uploadPreview':'预览中', 'updateStatusReady': '选中_个文件,共_KB。', 'updateStatusConfirm': '成功上传_个,_个失败', 'updateStatusFinish': '共_个(_KB),_个成功上传', 'updateStatusError': ',_张上传失败。', 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', 'errorExceedSize':'文件大小超出', 'errorFileType':'文件格式不允许', 'errorInterrupt':'文件传输中断', 'errorUploadRetry':'上传失败,请重试', 'errorHttp':'http请求错误', 'errorServerUpload':'服务器返回出错' }, 'webapp':{ 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!", 'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ", 'applyFor':"点此申请", 'anthorApi':"百度API" }, 'template':{ 'static':{ 'lang_template_bkcolor':'背景颜色', 'lang_template_clear' : '保留原有内容', 'lang_template_select' : '选择模板' }, 'blank':"空白文档", 'blog':"博客文章", 'resume':"个人简历", 'richText':"图文混排", 'sciPapers':"科技论文" }, 'scrawl':{ 'static':{ 'lang_input_previousStep':"上一步", 'lang_input_nextsStep':"下一步", 'lang_input_clear':'清空', 'lang_input_addPic':'添加背景', 'lang_input_ScalePic':'缩放背景', 'lang_input_removePic':'删除背景', 'J_imgTxt':{title:'添加背景图片'} }, 'noScarwl':"尚未作画,白纸一张~", 'scrawlUpLoading':"涂鸦上传中,别急哦~", 'continueBtn':"继续", 'imageError':"糟糕,图片读取失败了!", 'backgroundUploading':'背景图片上传中,别急哦~' }, 'music':{ 'static':{ 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!", 'J_searchBtn':{value:'搜索歌曲'} }, 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。', 'chapter':'歌曲', 'singer':'歌手', 'special':'专辑', 'listenTest':'试听' }, 'anchor':{ 'static':{ 'lang_input_anchorName':'锚点名字:' } }, 'charts':{ 'static':{ 'lang_data_source':'数据源:', 'lang_chart_format': '图表格式:', 'lang_data_align': '数据对齐方式', 'lang_chart_align_same': '数据源与图表X轴Y轴一致', 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反', 'lang_chart_title': '图表标题', 'lang_chart_main_title': '主标题:', 'lang_chart_sub_title': '子标题:', 'lang_chart_x_title': 'X轴标题:', 'lang_chart_y_title': 'Y轴标题:', 'lang_chart_tip': '提示文字', 'lang_cahrt_tip_prefix': '提示文字前缀:', 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', 'lang_chart_data_unit': '数据单位', 'lang_chart_data_unit_title': '单位:', 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', 'lang_chart_type': '图表类型:', 'lang_prev_btn': '上一个', 'lang_next_btn': '下一个' } }, 'emotion':{ 'static':{ 'lang_input_choice':'精选', 'lang_input_Tuzki':'兔斯基', 'lang_input_BOBO':'BOBO', 'lang_input_lvdouwa':'绿豆蛙', 'lang_input_babyCat':'baby猫', 'lang_input_bubble':'泡泡', 'lang_input_youa':'有啊' } }, 'gmap':{ 'static':{ 'lang_input_address':'地址', 'lang_input_search':'搜索', 'address':{value:"北京"} }, searchError:'无法定位到该地址!' }, 'help':{ 'static':{ 'lang_input_about':'关于UEditor', 'lang_input_shortcuts':'快捷键', 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。', 'lang_Txt_shortcuts':'快捷键', 'lang_Txt_func':'功能', 'lang_Txt_bold':'给选中字设置为加粗', 'lang_Txt_copy':'复制选中内容', 'lang_Txt_cut':'剪切选中内容', 'lang_Txt_Paste':'粘贴', 'lang_Txt_undo':'重新执行上次操作', 'lang_Txt_redo':'撤销上一次操作', 'lang_Txt_italic':'给选中字设置为斜体', 'lang_Txt_underline':'给选中字加下划线', 'lang_Txt_selectAll':'全部选中', 'lang_Txt_visualEnter':'软回车', 'lang_Txt_fullscreen':'全屏' } }, 'insertframe':{ 'static':{ 'lang_input_address':'地址:', 'lang_input_width':'宽度:', 'lang_input_height':'高度:', 'lang_input_isScroll':'允许滚动条:', 'lang_input_frameborder':'显示框架边框:', 'lang_input_alignMode':'对齐方式:', 'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]} }, 'enterAddress':'请输入地址!' }, 'link':{ 'static':{ 'lang_input_text':'文本内容:', 'lang_input_url':'链接地址:', 'lang_input_title':'标题:', 'lang_input_target':'是否在新窗口打开:' }, 'validLink':'只支持选中一个链接时生效', 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' }, 'map':{ 'static':{ lang_city:"城市", lang_address:"地址", city:{value:"北京"}, lang_search:"搜索", lang_dynamicmap:"插入动态地图" }, cityMsg:"请选择城市", errorMsg:"抱歉,找不到该位置!" }, 'searchreplace':{ 'static':{ lang_tab_search:"查找", lang_tab_replace:"替换", lang_search1:"查找", lang_search2:"查找", lang_replace:"替换", lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', lang_case_sensitive1:"区分大小写", lang_case_sensitive2:"区分大小写", nextFindBtn:{value:"下一个"}, preFindBtn:{value:"上一个"}, nextReplaceBtn:{value:"下一个"}, preReplaceBtn:{value:"上一个"}, repalceBtn:{value:"替换"}, repalceAllBtn:{value:"全部替换"} }, getEnd:"已经搜索到文章末尾!", getStart:"已经搜索到文章头部", countMsg:"总共替换了{#count}处!" }, 'snapscreen':{ 'static':{ lang_showMsg:"截图功能需要首先安装UEditor截图插件! ", lang_download:"点此下载", lang_step1:"第一步,下载UEditor截图插件并运行安装。", lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!" } }, 'spechars':{ 'static':{}, tsfh:"特殊字符", lmsz:"罗马字符", szfh:"数学字符", rwfh:"日文字符", xlzm:"希腊字母", ewzm:"俄文字符", pyzm:"拼音字母", yyyb:"英语音标", zyzf:"其他" }, 'edittable':{ 'static':{ 'lang_tableStyle':'表格样式', 'lang_insertCaption':'添加表格名称行', 'lang_insertTitle':'添加表格标题行', 'lang_insertTitleCol':'添加表格标题列', 'lang_orderbycontent':"使表格内容可排序", 'lang_tableSize':'自动调整表格尺寸', 'lang_autoSizeContent':'按表格文字自适应', 'lang_autoSizePage':'按页面宽度自适应', 'lang_example':'示例', 'lang_borderStyle':'表格边框', 'lang_color':'颜色:' }, captionName:'表格名称', titleName:'标题', cellsName:'内容', errorMsg:'有合并单元格,不可排序' }, 'edittip':{ 'static':{ lang_delRow:'删除整行', lang_delCol:'删除整列' } }, 'edittd':{ 'static':{ lang_tdBkColor:'背景颜色:' } }, 'formula':{ 'static':{ } }, 'wordimage':{ 'static':{ lang_resave:"转存步骤", uploadBtn:{src:"upload.png",alt:"上传"}, clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。" }, 'fileType':"图片", 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!", 'netError':"网络连接错误,请重试!", 'copySuccess':"图片地址已经复制!", 'flashI18n':{} //留空默认中文 }, 'autosave': { 'saving':'保存中...', 'success':'本地保存成功' } }; ================================================ FILE: static/common/user/uedit/themes/default/_css/autotypesetpicker.css ================================================ /*自动排版弹出菜单*/ .edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body { font-size: 12px; margin-bottom: 3px; clear: both; } .edui-default .edui-autotypesetpicker-body table { border-collapse: separate; border-spacing: 2px; } .edui-default .edui-autotypesetpicker-body td { font-size: 12px; word-wrap:break-word; } .edui-default .edui-autotypesetpicker-body td input { margin: 3px 3px 3px 4px; *margin: 1px 0 0 0; } ================================================ FILE: static/common/user/uedit/themes/default/_css/button.css ================================================ /*普通按钮样式及状态*/ .edui-default .edui-toolbar .edui-button .edui-icon, .edui-default .edui-toolbar .edui-menubutton .edui-icon, .edui-default .edui-toolbar .edui-splitbutton .edui-icon { height: 20px !important; width: 20px !important; background-image: url(../images/icons.png); background-image: url(../images/icons.gif) \9; } .edui-default .edui-toolbar .edui-button .edui-button-wrap { padding: 1px; position: relative; } .edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { background-color: #fff5d4; padding: 0; border: 1px solid #dcac6c; } .edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { background-color: #ffe69f; padding: 0; border: 1px solid #dcac6c; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; } .edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { background-color: #ffffff; padding: 0; border: 1px solid gray; } .edui-default .edui-toolbar .edui-state-disabled .edui-label { color: #ccc; } .edui-default .edui-toolbar .edui-state-disabled .edui-icon { opacity: 0.3; filter: alpha(opacity = 30); } ================================================ FILE: static/common/user/uedit/themes/default/_css/buttonicon.css ================================================ /* toolbar icons */ .edui-default .edui-for-undo .edui-icon { background-position: -160px 0; } .edui-default .edui-for-redo .edui-icon { background-position: -100px 0; } .edui-default .edui-for-bold .edui-icon { background-position: 0 0; } .edui-default .edui-for-italic .edui-icon { background-position: -60px 0; } .edui-default .edui-for-fontborder .edui-icon { background-position:-160px -40px; } .edui-default .edui-for-underline .edui-icon { background-position: -140px 0; } .edui-default .edui-for-strikethrough .edui-icon { background-position: -120px 0; } .edui-default .edui-for-subscript .edui-icon { background-position: -600px 0; } .edui-default .edui-for-superscript .edui-icon { background-position: -620px 0; } .edui-default .edui-for-blockquote .edui-icon { background-position: -220px 0; } .edui-default .edui-for-forecolor .edui-icon { background-position: -720px 0; } .edui-default .edui-for-backcolor .edui-icon { background-position: -760px 0; } .edui-default .edui-for-inserttable .edui-icon { background-position: -580px -20px; } .edui-default .edui-for-autotypeset .edui-icon { background-position: -640px -40px; } .edui-default .edui-for-justifyleft .edui-icon { background-position: -460px 0; } .edui-default .edui-for-justifycenter .edui-icon { background-position: -420px 0; } .edui-default .edui-for-justifyright .edui-icon { background-position: -480px 0; } .edui-default .edui-for-justifyjustify .edui-icon { background-position: -440px 0; } .edui-default .edui-for-insertorderedlist .edui-icon { background-position: -80px 0; } .edui-default .edui-for-insertunorderedlist .edui-icon { background-position: -20px 0; } .edui-default .edui-for-lineheight .edui-icon { background-position: -725px -40px; } .edui-default .edui-for-rowspacingbottom .edui-icon { background-position: -745px -40px; } .edui-default .edui-for-rowspacingtop .edui-icon { background-position: -765px -40px; } .edui-default .edui-for-horizontal .edui-icon { background-position: -360px 0; } .edui-default .edui-for-link .edui-icon { background-position: -500px 0; } .edui-default .edui-for-code .edui-icon { background-position: -440px -40px; } .edui-default .edui-for-insertimage .edui-icon { background-position: -726px -77px; } .edui-default .edui-for-insertframe .edui-icon { background-position: -240px -40px; } .edui-default .edui-for-emoticon .edui-icon { background-position: -60px -20px; } .edui-default .edui-for-spechars .edui-icon { background-position: -240px 0; } .edui-default .edui-for-help .edui-icon { background-position: -340px 0; } .edui-default .edui-for-print .edui-icon { background-position: -440px -20px; } .edui-default .edui-for-preview .edui-icon { background-position: -420px -20px; } .edui-default .edui-for-selectall .edui-icon { background-position: -400px -20px; } .edui-default .edui-for-searchreplace .edui-icon { background-position: -520px -20px; } .edui-default .edui-for-map .edui-icon { background-position: -40px -40px; } .edui-default .edui-for-gmap .edui-icon { background-position: -260px -40px; } .edui-default .edui-for-insertvideo .edui-icon { background-position: -320px -20px; } .edui-default .edui-for-time .edui-icon { background-position: -160px -20px; } .edui-default .edui-for-date .edui-icon { background-position: -140px -20px; } .edui-default .edui-for-cut .edui-icon { background-position: -680px 0; } .edui-default .edui-for-copy .edui-icon { background-position: -700px 0; } .edui-default .edui-for-paste .edui-icon { background-position: -560px 0; } .edui-default .edui-for-formatmatch .edui-icon { background-position: -40px 0; } .edui-default .edui-for-pasteplain .edui-icon { background-position: -360px -20px; } .edui-default .edui-for-directionalityltr .edui-icon { background-position: -20px -20px; } .edui-default .edui-for-directionalityrtl .edui-icon { background-position: -40px -20px; } .edui-default .edui-for-source .edui-icon { background-position: -261px -0px; } .edui-default .edui-for-removeformat .edui-icon { background-position: -580px 0; } .edui-default .edui-for-unlink .edui-icon { background-position: -640px 0; } .edui-default .edui-for-touppercase .edui-icon { background-position: -786px 0; } .edui-default .edui-for-tolowercase .edui-icon { background-position: -806px 0; } .edui-default .edui-for-insertrow .edui-icon { background-position: -478px -76px; } .edui-default .edui-for-insertrownext .edui-icon { background-position: -498px -76px; } .edui-default .edui-for-insertcol .edui-icon { background-position: -455px -76px; } .edui-default .edui-for-insertcolnext .edui-icon { background-position: -429px -76px; } .edui-default .edui-for-mergeright .edui-icon { background-position: -60px -40px; } .edui-default .edui-for-mergedown .edui-icon { background-position: -80px -40px; } .edui-default .edui-for-splittorows .edui-icon { background-position: -100px -40px; } .edui-default .edui-for-splittocols .edui-icon { background-position: -120px -40px; } .edui-default .edui-for-insertparagraphbeforetable .edui-icon { background-position: -140px -40px; } .edui-default .edui-for-deleterow .edui-icon { background-position: -660px -20px; } .edui-default .edui-for-deletecol .edui-icon { background-position: -640px -20px; } .edui-default .edui-for-splittocells .edui-icon { background-position: -800px -20px; } .edui-default .edui-for-mergecells .edui-icon { background-position: -760px -20px; } .edui-default .edui-for-deletetable .edui-icon { background-position: -620px -20px; } .edui-default .edui-for-cleardoc .edui-icon { background-position: -520px 0; } .edui-default .edui-for-fullscreen .edui-icon { background-position: -100px -20px; } .edui-default .edui-for-anchor .edui-icon { background-position: -200px 0; } .edui-default .edui-for-pagebreak .edui-icon { background-position: -460px -40px; } .edui-default .edui-for-imagenone .edui-icon { background-position: -480px -40px; } .edui-default .edui-for-imageleft .edui-icon { background-position: -500px -40px; } .edui-default .edui-for-wordimage .edui-icon { background-position: -660px -40px; } .edui-default .edui-for-imageright .edui-icon { background-position: -520px -40px; } .edui-default .edui-for-imagecenter .edui-icon { background-position: -540px -40px; } .edui-default .edui-for-indent .edui-icon { background-position: -400px 0; } .edui-default .edui-for-outdent .edui-icon { background-position: -540px 0; } .edui-default .edui-for-webapp .edui-icon { background-position: -601px -40px } .edui-default .edui-for-table .edui-icon { background-position: -580px -20px; } .edui-default .edui-for-edittable .edui-icon { background-position: -420px -40px; } .edui-default .edui-for-template .edui-icon { background-position: -339px -40px; } .edui-default .edui-for-delete .edui-icon { background-position: -360px -40px; } .edui-default .edui-for-attachment .edui-icon { background-position: -620px -40px; } .edui-default .edui-for-edittd .edui-icon { background-position: -700px -40px; } .edui-default .edui-for-snapscreen .edui-icon { background-position: -581px -40px } .edui-default .edui-for-scrawl .edui-icon { background-position: -801px -41px } .edui-default .edui-for-background .edui-icon { background-position: -680px -40px; } .edui-default .edui-for-music .edui-icon { background-position: -18px -40px } .edui-default .edui-for-formula .edui-icon { background-position: -200px -40px } .edui-default .edui-for-aligntd .edui-icon { background-position: -236px -76px; } .edui-default .edui-for-insertparagraphtrue .edui-icon { background-position: -625px -76px; } .edui-default .edui-for-insertparagraph .edui-icon { background-position: -602px -76px; } .edui-default .edui-for-insertcaption .edui-icon { background-position: -336px -76px; } .edui-default .edui-for-deletecaption .edui-icon { background-position: -362px -76px; } .edui-default .edui-for-inserttitle .edui-icon { background-position: -286px -76px; } .edui-default .edui-for-deletetitle .edui-icon { background-position: -311px -76px; } .edui-default .edui-for-aligntable .edui-icon { background-position: -440px 0; } .edui-default .edui-for-tablealignment-left .edui-icon { background-position: -460px 0; } .edui-default .edui-for-tablealignment-center .edui-icon { background-position: -420px 0; } .edui-default .edui-for-tablealignment-right .edui-icon { background-position: -480px 0; } .edui-default .edui-for-drafts .edui-icon { background-position: -560px 0; } .edui-default .edui-for-charts .edui-icon { background: url( ../images/charts.png ) no-repeat 2px 3px!important; } .edui-default .edui-for-inserttitlecol .edui-icon { background-position: -673px -76px; } .edui-default .edui-for-deletetitlecol .edui-icon { background-position: -698px -76px; } .edui-default .edui-for-simpleupload .edui-icon { background-position: -380px 0px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/cellalignpicker.css ================================================ /*自动排版弹出菜单*/ .edui-default .edui-cellalignpicker .edui-cellalignpicker-body { width: 70px; font-size: 12px; cursor: default; } .edui-default .edui-cellalignpicker-body table { border-collapse: separate; border-spacing: 0; } .edui-default .edui-cellalignpicker-body td{ padding: 1px; } .edui-default .edui-cellalignpicker-body .edui-icon{ height: 20px; width: 20px; padding: 1px; background-image: url(../images/table-cell-align.png); } .edui-default .edui-cellalignpicker-body .edui-left{ background-position: 0 0; } .edui-default .edui-cellalignpicker-body .edui-center{ background-position: -25px 0; } .edui-default .edui-cellalignpicker-body .edui-right{ background-position: -51px 0; } .edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{ background-position: -73px 0; } .edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{ background-position: -98px 0; } .edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{ background-position: -124px 0; } .edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { background-position: -146px 0; background-color: #f1f4f5; } .edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { background-position: -245px 0; } .edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { background-position: -271px 0; } ================================================ FILE: static/common/user/uedit/themes/default/_css/colorbutton.css ================================================ /*颜色按钮 */ .edui-default .edui-toolbar .edui-colorbutton .edui-colorlump { position: absolute; overflow: hidden; bottom: 1px; left: 1px; width: 18px; height: 4px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/colorpicker.css ================================================ /* 颜色弹出菜单 */ .edui-default .edui-colorpicker-topbar { height: 27px; width: 200px; /*border-bottom: 1px gray dashed;*/ } .edui-default .edui-colorpicker-preview { height: 20px; border: 1px inset black; margin-left: 1px; width: 128px; float: left; } .edui-default .edui-colorpicker-nocolor { float: right; margin-right: 1px; font-size: 12px; line-height: 14px; height: 14px; border: 1px solid #333; padding: 3px 5px; cursor: pointer; } .edui-default .edui-colorpicker-tablefirstrow { height: 30px; } .edui-default .edui-colorpicker-colorcell { width: 14px; height: 14px; display: block; margin: 0; cursor: pointer; } .edui-default .edui-colorpicker-colorcell:hover { width: 14px; height: 14px; margin: 0; } .edui-default .edui-colorpicker-advbtn{ display: block; text-align: center; cursor: pointer; height:20px; } .arrow_down{ background: white url('../images/arrow_down.png') no-repeat center; } .arrow_up{ background: white url('../images/arrow_up.png') no-repeat center; } /*高级的样式*/ .edui-colorpicker-adv{ position: relative; overflow: hidden; height: 180px; display: none; } .edui-colorpicker-plant, .edui-colorpicker-hue { border: solid 1px #666; } .edui-colorpicker-pad { width: 150px; height: 150px; left: 14px; top: 13px; position: absolute; background: red; overflow: hidden; cursor: crosshair; } .edui-colorpicker-cover{ position: absolute; top: 0; left: 0; width: 150px; height: 150px; background: url("../images/tangram-colorpicker.png") -160px -200px; } .edui-colorpicker-padDot{ position: absolute; top: 0; left: 0; width: 11px; height: 11px; overflow: hidden; background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; z-index: 1000; } .edui-colorpicker-sliderMain { position: absolute; left: 171px; top: 13px; width: 19px; height: 152px; background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; } .edui-colorpicker-slider { width: 100%; height: 100%; cursor: pointer; } .edui-colorpicker-thumb{ position: absolute; top: 0; cursor: pointer; height: 3px; left: -1px; right: -1px; border: 1px solid black; background: white; opacity: .8; } ================================================ FILE: static/common/user/uedit/themes/default/_css/combox.css ================================================ /*不可选中菜单按钮 */ .edui-default .edui-toolbar .edui-combox-body .edui-button-body { width: 60px; font-size: 12px; height: 20px; line-height: 20px; padding-left: 5px; white-space: nowrap; margin: 0 3px 0 0; } .edui-default .edui-toolbar .edui-combox-body .edui-arrow { background: url(../images/icons.png) -741px 0; _background: url(../images/icons.gif) -741px 0; height: 20px; width: 9px; } .edui-default .edui-toolbar .edui-combox .edui-combox-body { border: 1px solid #CCC; background-color: white; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; } .edui-default .edui-toolbar .edui-combox-body .edui-splitborder { display: none; } .edui-default .edui-toolbar .edui-combox-body .edui-arrow { border-left: 1px solid #CCC; } .edui-default .edui-toolbar .edui-state-hover .edui-combox-body { background-color: #fff5d4; border: 1px solid #dcac6c; } .edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { border-left: 1px solid #dcac6c; } .edui-default .edui-toolbar .edui-state-checked .edui-combox-body { background-color: #FFE69F; border: 1px solid #DCAC6C; } .edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { border-left: 1px solid #DCAC6C; } .edui-toolbar .edui-state-disabled .edui-combox-body { background-color: #F0F0EE; opacity: 0.3; filter: alpha(opacity = 30); } .edui-toolbar .edui-state-opened .edui-combox-body { background-color: white; border: 1px solid gray; } ================================================ FILE: static/common/user/uedit/themes/default/_css/contextmenu.css ================================================ /*contextmenu*/ .edui-default .edui-hassubmenu .edui-arrow { height: 20px; width: 20px; float: right; background: url("../images/icons-all.gif") no-repeat 10px -233px; } .edui-default .edui-menu-body .edui-menuitem { padding: 1px; } .edui-default .edui-menuseparator { margin: 2px 0; height: 1px; overflow: hidden; } .edui-default .edui-menuseparator-inner { border-bottom: 1px solid #e2e3e3; margin-left: 29px; margin-right: 1px; } .edui-default .edui-menu-body .edui-state-hover { padding: 0 !important; background-color: #fff5d4; border: 1px solid #dcac6c; } ================================================ FILE: static/common/user/uedit/themes/default/_css/dialog.css ================================================ /* 弹出对话框按钮和对话框大小 */ .edui-default .edui-dialog { z-index: 2000; position: absolute; } .edui-dialog div{ width:auto; } .edui-default .edui-dialog-wrap { margin-right: 6px; margin-bottom: 6px; } .edui-default .edui-dialog-fullscreen-flag { margin-right: 0; margin-bottom: 0; } .edui-default .edui-dialog-body { position: relative; padding:2px 0 0 2px; _zoom: 1; } .edui-default .edui-dialog-fullscreen-flag .edui-dialog-body { padding: 0; } .edui-default .edui-dialog-shadow { position: absolute; z-index: -1; left: 0; top: 0; width: 100%; height: 100%; background-color: #ffffff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); *border-right-width: 2px; *border-bottom-width: 2px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; } .edui-default .edui-dialog-foot { background-color: white; } .edui-default .edui-dialog-titlebar { height: 26px; border-bottom: 1px solid #c6c6c6; background: url(../images/dialog-title-bg.png) repeat-x bottom; position: relative; cursor: move; } .edui-default .edui-dialog-caption { font-weight: bold; font-size: 12px; line-height: 26px; padding-left: 5px; } .edui-default .edui-dialog-draghandle { height: 26px; } .edui-default .edui-dialog-closebutton { position: absolute !important; right: 5px; top: 3px; } .edui-default .edui-dialog-closebutton .edui-button-body { height: 20px; width: 20px; cursor: pointer; background: url("../images/icons-all.gif") no-repeat 0 -59px; } .edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body { background: url("../images/icons-all.gif") no-repeat 0 -89px; } .edui-default .edui-dialog-foot { height: 40px; } .edui-default .edui-dialog-buttons { position: absolute; right: 0; } .edui-default .edui-dialog-buttons .edui-button { margin-right: 10px; } .edui-default .edui-dialog-buttons .edui-button .edui-button-body { background: url("../images/icons-all.gif") no-repeat; height: 24px; width: 96px; font-size: 12px; line-height: 24px; text-align: center; cursor: default; } .edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { background: url("../images/icons-all.gif") no-repeat 0 -30px; } .edui-default .edui-dialog iframe { border: 0; padding: 0; margin: 0; vertical-align: top; } .edui-default .edui-dialog-modalmask { opacity: 0.3; filter: alpha(opacity = 30); background-color: #ccc; position: absolute; /*z-index: 1999;*/ } .edui-default .edui-dialog-dragmask { position: absolute; /*z-index: 2001;*/ background-color: transparent; cursor: move; } .edui-default .edui-dialog-content { position: relative; } .edui-default .dialogcontmask { cursor: move; visibility: hidden; display: block; position: absolute; width: 100%; height: 100%; opacity: 0; filter: alpha(opacity = 0); } /*link-dialog*/ .edui-default .edui-for-link .edui-dialog-content { width: 420px; height: 200px; overflow: hidden; } /*background-dialog*/ .edui-default .edui-for-background .edui-dialog-content { width: 440px; height: 280px; overflow: hidden; } /*template-dialog*/ .edui-default .edui-for-template .edui-dialog-content { width: 630px; height: 390px; overflow: hidden; } /*scrawl-dialog*/ .edui-default .edui-for-scrawl .edui-dialog-content { width: 515px; *width: 506px; height: 360px; } /*spechars-dialog*/ .edui-default .edui-for-spechars .edui-dialog-content { width: 620px; height: 500px; *width: 630px; *height: 570px; } /*image-dialog*/ .edui-default .edui-for-insertimage .edui-dialog-content { width: 650px; height: 400px; overflow: hidden; } /*webapp-dialog*/ .edui-default .edui-for-webapp .edui-dialog-content { width: 560px; _width: 565px; height: 450px; overflow: hidden; } /*image-insertframe*/ .edui-default .edui-for-insertframe .edui-dialog-content { width: 350px; height: 200px; overflow: hidden; } /*wordImage-dialog*/ .edui-default .edui-for-wordimage .edui-dialog-content { width: 620px; height: 380px; overflow: hidden; } /*attachment-dialog*/ .edui-default .edui-for-attachment .edui-dialog-content { width: 650px; height: 400px; overflow: hidden; } /*map-dialog*/ .edui-default .edui-for-map .edui-dialog-content { width: 550px; height: 400px; } /*gmap-dialog*/ .edui-default .edui-for-gmap .edui-dialog-content { width: 550px; height: 400px; } /*video-dialog*/ .edui-default .edui-for-insertvideo .edui-dialog-content { width: 590px; height: 390px; } /*anchor-dialog*/ .edui-default .edui-for-anchor .edui-dialog-content { width: 320px; height: 60px; overflow: hidden; } /*searchreplace-dialog*/ .edui-default .edui-for-searchreplace .edui-dialog-content { width: 400px; height: 220px; } /*help-dialog*/ .edui-default .edui-for-help .edui-dialog-content { width: 400px; height: 420px; } /*edittable-dialog*/ .edui-default .edui-for-edittable .edui-dialog-content { width: 540px; _width:590px; height: 335px; } /*edittip-dialog*/ .edui-default .edui-for-edittip .edui-dialog-content { width: 225px; height: 60px; } /*edittd-dialog*/ .edui-default .edui-for-edittd .edui-dialog-content { width: 240px; height: 50px; } /*snapscreen-dialog*/ .edui-default .edui-for-snapscreen .edui-dialog-content { width: 400px; height: 220px; } /*music-dialog*/ .edui-default .edui-for-music .edui-dialog-content { width: 515px; height: 360px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/editor.css ================================================ /*UI工具栏、编辑区域、底部*/ .edui-default .edui-editor { border: 1px solid #d4d4d4; background-color: white; position: relative; overflow: visible; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .edui-editor div{ width:auto; height:auto; } .edui-default .edui-editor-toolbarbox { position: relative; zoom: 1; -webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); -moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); border-top-left-radius:2px; border-top-right-radius:2px; } .edui-default .edui-editor-toolbarboxouter { border-bottom: 1px solid #d4d4d4; background-color: #fafafa; background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); background-repeat: repeat-x; /*border: 1px solid #d4d4d4;*/ -webkit-border-radius: 4px 4px 0 0; -moz-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); *zoom: 1; -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); } .edui-default .edui-editor-toolbarboxinner { padding: 2px; } .edui-default .edui-editor-iframeholder { position: relative; /*for fix ie6 toolbarmsg under iframe bug. relative -> static */ /*_position: static !important;* } .edui-default .edui-editor-iframeholder textarea { font-family: consolas, "Courier New", "lucida console", monospace; font-size: 12px; line-height: 18px; } .edui-default .edui-editor-bottombar { /*border-top: 1px solid #ccc;*/ /*height: 20px;*/ /*width: 40%;*/ /*float: left;*/ /*overflow: hidden;*/ } .edui-default .edui-editor-bottomContainer { overflow: hidden; } .edui-default .edui-editor-bottomContainer table { width: 100%; height: 0; overflow: hidden; border-spacing: 0; } .edui-default .edui-editor-bottomContainer td { white-space: nowrap; border-top: 1px solid #ccc; line-height: 20px; font-size: 12px; font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; } .edui-default .edui-editor-wordcount { text-align: right; margin-right: 5px; color: #aaa; } .edui-default .edui-editor-scale { width: 12px; } .edui-default .edui-editor-scale .edui-editor-icon { float: right; width: 100%; height: 12px; margin-top: 10px; background: url(../images/scale.png) no-repeat; cursor: se-resize; } .edui-default .edui-editor-breadcrumb { margin: 2px 0 0 3px; } .edui-default .edui-editor-breadcrumb span { cursor: pointer; text-decoration: underline; color: blue; } .edui-default .edui-toolbar .edui-for-fullscreen { float: right; } .edui-default .edui-bubble .edui-popup-content { border: 1px solid #DCAC6C; background-color: #fff6d9; padding: 5px; font-size: 10pt; font-family: "宋体"; } .edui-default .edui-bubble .edui-shadow { /*box-shadow: 1px 1px 3px #818181;*/ /*-webkit-box-shadow: 2px 2px 3px #818181;*/ /*-moz-box-shadow: 2px 2px 3px #818181;*/ /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ } .edui-default .edui-editor-toolbarmsg { background-color: #FFF6D9; border-bottom: 1px solid #ccc; position: absolute; bottom: -25px; left: 0; z-index: 1009; width: 99.9%; } .edui-default .edui-editor-toolbarmsg-upload { font-size: 14px; color: blue; width: 100px; height: 16px; line-height: 16px; cursor: pointer; position: absolute; top: 5px; left: 350px; } .edui-default .edui-editor-toolbarmsg-label { font-size: 12px; line-height: 16px; padding: 4px; } .edui-default .edui-editor-toolbarmsg-close { float: right; width: 20px; height: 16px; line-height: 16px; cursor: pointer; color: red; } ================================================ FILE: static/common/user/uedit/themes/default/_css/menu.css ================================================ /* 可选中按钮弹出菜单*/ .edui-default .edui-menu { z-index: 3000; } .edui-default .edui-menu .edui-popup-content { padding: 3px; } .edui-default .edui-menu-body { _width: 150px; min-width: 170px; background: url("../images/sparator_v.png") repeat-y 25px; } .edui-default .edui-menuitem-body { } .edui-default .edui-menuitem { height: 20px; cursor: default; vertical-align: top; } .edui-default .edui-menuitem .edui-icon { width: 20px !important; height: 20px !important; background: url(../images/icons.png) 0 -4000px; background: url(../images/icons.gif) 0 -4000px\9; } .edui-default .edui-menuitem .edui-label { font-size: 12px; line-height: 20px; height: 20px; padding-left: 10px; } .edui-default .edui-state-checked .edui-menuitem-body { background: url("../images/icons-all.gif") no-repeat 6px -205px; } .edui-default .edui-state-disabled .edui-menuitem-label { color: gray; } ================================================ FILE: static/common/user/uedit/themes/default/_css/menubutton.css ================================================ /*可选中菜单按钮*/ .edui-default .edui-list .edui-bordereraser { display: none; } .edui-default .edui-listitem { padding: 1px; white-space: nowrap; } .edui-default .edui-list .edui-state-hover { position: relative; background-color: #fff5d4; border: 1px solid #dcac6c; padding: 0; } .edui-default .edui-for-fontfamily .edui-listitem-label { min-width: 130px; _width: 120px; font-size: 12px; height: 22px; line-height: 22px; padding-left: 5px; } .edui-default .edui-for-insertcode .edui-listitem-label { min-width: 120px; _width: 120px; font-size: 12px; height: 22px; line-height: 22px; padding-left: 5px; } .edui-default .edui-for-underline .edui-listitem-label { min-width: 120px; _width: 120px; padding: 3px 5px; font-size: 12px; } .edui-default .edui-for-fontsize .edui-listitem-label { min-width: 120px; _width: 120px; padding: 3px 5px; } .edui-default .edui-for-paragraph .edui-listitem-label { min-width: 200px; _width: 200px; padding: 2px 5px; } .edui-default .edui-for-rowspacingtop .edui-listitem-label, .edui-default .edui-for-rowspacingbottom .edui-listitem-label { min-width: 53px; _width: 53px; padding: 2px 5px; } .edui-default .edui-for-lineheight .edui-listitem-label { min-width: 53px; _width: 53px; padding: 2px 5px; } .edui-default .edui-for-customstyle .edui-listitem-label { min-width: 200px; _width: 200px; width: 200px !important; padding: 2px 5px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/message.css ================================================ .edui-default .edui-editor-messageholder { display: block; width: 150px; height: auto; border: 0; margin: 0; padding: 0; position: absolute; top: 28px; right: 3px; } .edui-default .edui-message{ min-height: 10px; text-shadow: 0 1px 0 rgba(255,255,255,0.5); padding: 0; margin-bottom: 3px; position: relative; } .edui-default .edui-message-body{ border-radius: 3px; padding: 8px 15px 8px 8px; color: #c09853; background-color: #fcf8e3; border: 1px solid #fbeed5; } .edui-default .edui-message-type-info{ color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1 } .edui-default .edui-message-type-success{ color: #468847; background-color: #dff0d8; border-color: #d6e9c6 } .edui-default .edui-message-type-danger, .edui-default .edui-message-type-error{ color: #b94a48; background-color: #f2dede; border-color: #eed3d7 } .edui-default .edui-message .edui-message-closer { display: block; width: 16px; height: 16px; line-height: 16px; position: absolute; top: 0; right: 0; padding: 0; cursor: pointer; background: transparent; border: 0; float: right; font-size: 20px; font-weight: bold; color: #999; text-shadow: 0 1px 0 #fff; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; } .edui-default .edui-message .edui-message-content { font-size: 10pt; word-wrap: break-word; word-break: normal; } ================================================ FILE: static/common/user/uedit/themes/default/_css/multiMenu.css ================================================ /*表情按钮及弹出菜单*/ /*去除了表情的下拉箭头*/ .edui-default .edui-for-emotion .edui-icon { background-position: -60px -20px; } .edui-default .edui-for-emotion .edui-popup-content iframe { width: 514px; height: 380px; overflow: hidden; } .edui-default .edui-for-emotion .edui-popup-content { position: relative; z-index: 555 } .edui-default .edui-for-emotion .edui-splitborder { display: none } .edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow { width: 0 } .edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder { border-left: 1px solid transparent; } ================================================ FILE: static/common/user/uedit/themes/default/_css/paragraphpicker.css ================================================ /*段落弹出菜单*/ .edui-default .edui-for-paragraph .edui-listitem-label { font-family: Tahoma, Verdana, Arial, Helvetica; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { font-size: 22px; line-height: 27px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { font-weight: bolder; font-size: 32px; line-height: 36px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { font-weight: bolder; font-size: 27px; line-height: 29px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { font-weight: bolder; font-size: 19px; line-height: 23px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { font-weight: bolder; font-size: 16px; line-height: 19px } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { font-weight: bolder; font-size: 13px; line-height: 16px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { font-weight: bolder; font-size: 12px; line-height: 14px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/pastepicker.css ================================================ /*粘贴弹出菜单*/ .edui-default .edui-wordpastepop .edui-popup-content{ border: none; padding: 0; width: 54px; height: 21px; } .edui-default .edui-pasteicon { width: 100%; height: 100%; background-image: url('../images/wordpaste.png'); background-position: 0 0; } .edui-default .edui-pasteicon.edui-state-opened { background-position: 0 -34px; } .edui-default .edui-pastecontainer { position: relative; visibility: hidden; width: 97px; background: #fff; border: 1px solid #ccc; } .edui-default .edui-pastecontainer .edui-title { font-weight: bold; background: #F8F8FF; height: 25px; line-height: 25px; font-size: 12px; padding-left: 5px; } .edui-default .edui-pastecontainer .edui-button { overflow: hidden; margin: 3px 0; } .edui-default .edui-pastecontainer .edui-button .edui-richtxticon, .edui-default .edui-pastecontainer .edui-button .edui-tagicon, .edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{ float: left; cursor: pointer; width: 29px; height: 29px; margin-left: 5px; background-image: url('../images/wordpaste.png'); background-repeat: no-repeat; } .edui-default .edui-pastecontainer .edui-button .edui-richtxticon { margin-left: 0; background-position: -109px 0; } .edui-default .edui-pastecontainer .edui-button .edui-tagicon { background-position: -148px 1px; } .edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { background-position: -72px 0; } .edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { background-position: -109px -34px; } .edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ background-position: -148px -34px; } .edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ background-position: -72px -34px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/popup.css ================================================ /* 弹出菜单 */ .edui-default .edui-popup { z-index: 3000; background-color: #ffffff; width:auto; height:auto; } .edui-default .edui-popup .edui-shadow { left: 0; top: 0; width: 100%; height: 100%; } .edui-default .edui-popup-content { border:1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); *border-right-width: 2px; *border-bottom-width: 2px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; padding: 5px; background:#ffffff; } .edui-default .edui-popup .edui-bordereraser { background-color: white; height: 3px; } .edui-default .edui-menu .edui-bordereraser { height: 3px; } .edui-default .edui-anchor-topleft .edui-bordereraser { left: 1px; top: -2px; } .edui-default .edui-anchor-topright .edui-bordereraser { right: 1px; top: -2px; } .edui-default .edui-anchor-bottomleft .edui-bordereraser { left: 0; bottom: -6px; height: 7px; border-left: 1px solid gray; border-right: 1px solid gray; } .edui-default .edui-anchor-bottomright .edui-bordereraser { right: 0; bottom: -6px; height: 7px; border-left: 1px solid gray; border-right: 1px solid gray; } .edui-popup div{ width:auto; height:auto; } ================================================ FILE: static/common/user/uedit/themes/default/_css/separtor.css ================================================ /*分隔线*/ .edui-default .edui-toolbar .edui-separator { width: 2px; height: 20px; margin: 2px 4px 2px 3px; background: url(../images/icons.png) -181px 0; background: url(../images/icons.gif) -181px 0 \9; } ================================================ FILE: static/common/user/uedit/themes/default/_css/shortcutmenu.css ================================================ /*弹出菜单*/ .edui-default .edui-shortcutmenu { padding: 2px; width: 190px; height: 50px; background-color: #fff; border: 1px solid #ccc; border-radius: 5px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/splitbutton.css ================================================ /*splitbutton*/ .edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, .edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { background: url(../images/icons.png) -741px 0; _background: url(../images/icons.gif) -741px 0; height: 20px; width: 9px; } .edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { padding: 1px; } .edui-default .edui-toolbar .edui-splitborder { width: 1px; height: 20px; } .edui-default .edui-toolbar .edui-state-hover .edui-splitborder { width: 1px; border-left: 0px solid #dcac6c; } .edui-default .edui-toolbar .edui-state-active .edui-splitborder { width: 0; border-left: 1px solid gray; } .edui-default .edui-toolbar .edui-state-opened .edui-splitborder { width: 1px; border: 0; } .edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { background-color: #fff5d4; border: 1px solid #dcac6c; padding: 0; } .edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { background-color: #FFE69F; border: 1px solid #DCAC6C; padding: 0; } .edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { background-color: #ffffff; border: 1px solid gray; padding: 0; } .edui-default .edui-state-disabled .edui-arrow { opacity: 0.3; _filter: alpha(opacity = 30); } .edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { background-color: white; border: 1px solid gray; padding: 0; } .edui-default .edui-for-insertorderedlist .edui-bordereraser, .edui-default .edui-for-lineheight .edui-bordereraser, .edui-default .edui-for-rowspacingtop .edui-bordereraser, .edui-default .edui-for-rowspacingbottom .edui-bordereraser, .edui-default .edui-for-insertunorderedlist .edui-bordereraser { background-color: white; } /* 解决嵌套导致的图标问题 */ .edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, .edui-default .edui-for-lineheight .edui-popup-body .edui-icon, .edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, .edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon, .edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon { /*background-position: 0 -40px;*/ background-image: none ; } ================================================ FILE: static/common/user/uedit/themes/default/_css/tablepicker.css ================================================ /* 表格弹出菜单 */ .edui-default .edui-for-inserttable .edui-splitborder { display: none } .edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { width: 0 } .edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ border-left: 1px solid transparent; } .edui-default .edui-tablepicker .edui-infoarea { height: 14px; line-height: 14px; font-size: 12px; width: 220px; margin-bottom: 3px; clear: both; } .edui-default .edui-tablepicker .edui-infoarea .edui-label { float: left; } .edui-default .edui-dialog-buttons .edui-label { line-height: 24px; } .edui-default .edui-tablepicker .edui-infoarea .edui-clickable { float: right; } .edui-default .edui-tablepicker .edui-pickarea { background: url("../images/unhighlighted.gif") repeat; height: 220px; width: 220px; } .edui-default .edui-tablepicker .edui-pickarea .edui-overlay { background: url("../images/highlighted.gif") repeat; } ================================================ FILE: static/common/user/uedit/themes/default/_css/toolbar.css ================================================ /* 工具栏 */ .edui-default .edui-toolbar { cursor: default; -webkit-user-select: none; -moz-user-select: none; padding: 1px; overflow: hidden; /*全屏下单独一行不占位*/ zoom: 1; width:auto; height:auto; } .edui-default .edui-toolbar .edui-button, .edui-default .edui-toolbar .edui-splitbutton, .edui-default .edui-toolbar .edui-menubutton, .edui-default .edui-toolbar .edui-combox { margin: 1px; } ================================================ FILE: static/common/user/uedit/themes/default/_css/ueditor.css ================================================ /*根据UI结构重写CSS,仅在相应UI组件创建时,加载对应css,顺序加载 */ /*-------基础UI构建,必须加载-------*/ @import "uibase.css"; @import "toolbar.css"; @import "editor.css"; /*-------可选中菜单按钮,按需加载-------*/ /*可选中菜单按钮--依赖splitbutton*/ @import "menubutton.css"; /*可选中菜单按钮-弹出菜单*/ @import "menu.css"; /*-------不可选中菜单按钮,按需加载-------*/ /*不可选中菜单按钮--依赖splitbutton*/ @import "combox.css"; /*-------按钮类型,按需加载-------*/ /*普通按钮*/ @import "button.css"; /*按钮icon*/ @import "buttonicon.css"; /*弹出菜单按钮-附加按钮*/ @import "splitbutton.css"; /*弹出菜单*/ @import "popup.css"; /*提示消息*/ @import "message.css"; /*-------独立按钮样式,按需加载-------*/ /*弹出对话框样式*/ @import "dialog.css"; /*段落格式弹出菜单*/ @import "paragraphpicker.css"; /*表格弹出菜单*/ @import "tablepicker.css"; /*颜色弹出菜单*/ @import "colorpicker.css"; /*自动排版弹出菜单*/ @import "autotypesetpicker.css"; /*平均分布菜单*/ @import "cellalignpicker.css"; /*分隔线*/ @import "separtor.css"; /*颜色按钮--依赖splitbutton*/ @import "colorbutton.css"; /*表情按钮--依赖splitbutton*/ @import "multiMenu.css"; /*右键菜单*/ @import "contextmenu.css"; /*快捷菜单*/ @import "shortcutmenu.css"; /*粘贴提示*/ @import "pastepicker.css"; ================================================ FILE: static/common/user/uedit/themes/default/_css/uibase.css ================================================ /*基础UI构建 */ /* common layer */ .edui-default .edui-box { border: none; padding: 0; margin: 0; overflow: hidden; } .edui-default a.edui-box { display: block; text-decoration: none; color: black; } .edui-default a.edui-box:hover { text-decoration: none; } .edui-default a.edui-box:active { text-decoration: none; } .edui-default table.edui-box { border-collapse: collapse; } .edui-default ul.edui-box { list-style-type: none; } div.edui-box { position: relative; display: -moz-inline-box !important; display: inline-block !important; vertical-align: top; } .edui-default .edui-clearfix { zoom: 1 } .edui-default .edui-clearfix:after { content: '\20'; display: block; clear: both; } * html div.edui-box { display: inline !important; } *:first-child+html div.edui-box { display: inline !important; } /* control layout */ .edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { position: relative; } .edui-default .edui-popup { position: absolute; -webkit-user-select: none; -moz-user-select: none; } .edui-default .edui-popup .edui-shadow { position: absolute; z-index: -1; } .edui-default .edui-popup .edui-bordereraser { position: absolute; overflow: hidden; } .edui-default .edui-tablepicker .edui-canvas { position: relative; } .edui-default .edui-tablepicker .edui-canvas .edui-overlay { position: absolute; } .edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { position: absolute; left: 0; top: 0; width: 100%; height: 100%; } .edui-default .edui-toolbar { position: relative; } /* * default theme */ .edui-default .edui-label { cursor: default; } .edui-default span.edui-clickable { color: blue; cursor: pointer; text-decoration: underline; } .edui-default span.edui-unclickable { color: gray; cursor: default; } ================================================ FILE: static/common/user/uedit/themes/default/css/ueditor.css ================================================ /*基础UI构建 */ /* common layer */ .edui-default .edui-box { border: none; padding: 0; margin: 0; overflow: hidden; } .edui-default a.edui-box { display: block; text-decoration: none; color: black; } .edui-default a.edui-box:hover { text-decoration: none; } .edui-default a.edui-box:active { text-decoration: none; } .edui-default table.edui-box { border-collapse: collapse; } .edui-default ul.edui-box { list-style-type: none; } div.edui-box { position: relative; display: -moz-inline-box !important; display: inline-block !important; vertical-align: top; } .edui-default .edui-clearfix { zoom: 1 } .edui-default .edui-clearfix:after { content: '\20'; display: block; clear: both; } * html div.edui-box { display: inline !important; } *:first-child+html div.edui-box { display: inline !important; } /* control layout */ .edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { position: relative; } .edui-default .edui-popup { position: absolute; -webkit-user-select: none; -moz-user-select: none; } .edui-default .edui-popup .edui-shadow { position: absolute; z-index: -1; } .edui-default .edui-popup .edui-bordereraser { position: absolute; overflow: hidden; } .edui-default .edui-tablepicker .edui-canvas { position: relative; } .edui-default .edui-tablepicker .edui-canvas .edui-overlay { position: absolute; } .edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { position: absolute; left: 0; top: 0; width: 100%; height: 100%; } .edui-default .edui-toolbar { position: relative; } /* * default theme */ .edui-default .edui-label { cursor: default; } .edui-default span.edui-clickable { color: blue; cursor: pointer; text-decoration: underline; } .edui-default span.edui-unclickable { color: gray; cursor: default; } /* 工具栏 */ .edui-default .edui-toolbar { cursor: default; -webkit-user-select: none; -moz-user-select: none; padding: 1px; overflow: hidden; /*全屏下单独一行不占位*/ zoom: 1; width:auto; height:auto; } .edui-default .edui-toolbar .edui-button, .edui-default .edui-toolbar .edui-splitbutton, .edui-default .edui-toolbar .edui-menubutton, .edui-default .edui-toolbar .edui-combox { margin: 1px; } /*UI工具栏、编辑区域、底部*/ .edui-default .edui-editor { border: 1px solid #d4d4d4; background-color: white; position: relative; overflow: visible; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .edui-editor div{ width:auto; height:auto; } .edui-default .edui-editor-toolbarbox { position: relative; zoom: 1; -webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); -moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); border-top-left-radius:2px; border-top-right-radius:2px; } .edui-default .edui-editor-toolbarboxouter { border-bottom: 1px solid #d4d4d4; background-color: #fafafa; background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); background-repeat: repeat-x; /*border: 1px solid #d4d4d4;*/ -webkit-border-radius: 4px 4px 0 0; -moz-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); *zoom: 1; -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); } .edui-default .edui-editor-toolbarboxinner { padding: 2px; } .edui-default .edui-editor-iframeholder { position: relative; /*for fix ie6 toolbarmsg under iframe bug. relative -> static */ /*_position: static !important;* } .edui-default .edui-editor-iframeholder textarea { font-family: consolas, "Courier New", "lucida console", monospace; font-size: 12px; line-height: 18px; } .edui-default .edui-editor-bottombar { /*border-top: 1px solid #ccc;*/ /*height: 20px;*/ /*width: 40%;*/ /*float: left;*/ /*overflow: hidden;*/ } .edui-default .edui-editor-bottomContainer { overflow: hidden; } .edui-default .edui-editor-bottomContainer table { width: 100%; height: 0; overflow: hidden; border-spacing: 0; } .edui-default .edui-editor-bottomContainer td { white-space: nowrap; border-top: 1px solid #ccc; line-height: 20px; font-size: 12px; font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; } .edui-default .edui-editor-wordcount { text-align: right; margin-right: 5px; color: #aaa; } .edui-default .edui-editor-scale { width: 12px; } .edui-default .edui-editor-scale .edui-editor-icon { float: right; width: 100%; height: 12px; margin-top: 10px; background: url(../images/scale.png) no-repeat; cursor: se-resize; } .edui-default .edui-editor-breadcrumb { margin: 2px 0 0 3px; } .edui-default .edui-editor-breadcrumb span { cursor: pointer; text-decoration: underline; color: blue; } .edui-default .edui-toolbar .edui-for-fullscreen { float: right; } .edui-default .edui-bubble .edui-popup-content { border: 1px solid #DCAC6C; background-color: #fff6d9; padding: 5px; font-size: 10pt; font-family: "宋体"; } .edui-default .edui-bubble .edui-shadow { /*box-shadow: 1px 1px 3px #818181;*/ /*-webkit-box-shadow: 2px 2px 3px #818181;*/ /*-moz-box-shadow: 2px 2px 3px #818181;*/ /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ } .edui-default .edui-editor-toolbarmsg { background-color: #FFF6D9; border-bottom: 1px solid #ccc; position: absolute; bottom: -25px; left: 0; z-index: 1009; width: 99.9%; } .edui-default .edui-editor-toolbarmsg-upload { font-size: 14px; color: blue; width: 100px; height: 16px; line-height: 16px; cursor: pointer; position: absolute; top: 5px; left: 350px; } .edui-default .edui-editor-toolbarmsg-label { font-size: 12px; line-height: 16px; padding: 4px; } .edui-default .edui-editor-toolbarmsg-close { float: right; width: 20px; height: 16px; line-height: 16px; cursor: pointer; color: red; } /*可选中菜单按钮*/ .edui-default .edui-list .edui-bordereraser { display: none; } .edui-default .edui-listitem { padding: 1px; white-space: nowrap; } .edui-default .edui-list .edui-state-hover { position: relative; background-color: #fff5d4; border: 1px solid #dcac6c; padding: 0; } .edui-default .edui-for-fontfamily .edui-listitem-label { min-width: 130px; _width: 120px; font-size: 12px; height: 22px; line-height: 22px; padding-left: 5px; } .edui-default .edui-for-insertcode .edui-listitem-label { min-width: 120px; _width: 120px; font-size: 12px; height: 22px; line-height: 22px; padding-left: 5px; } .edui-default .edui-for-underline .edui-listitem-label { min-width: 120px; _width: 120px; padding: 3px 5px; font-size: 12px; } .edui-default .edui-for-fontsize .edui-listitem-label { min-width: 120px; _width: 120px; padding: 3px 5px; } .edui-default .edui-for-paragraph .edui-listitem-label { min-width: 200px; _width: 200px; padding: 2px 5px; } .edui-default .edui-for-rowspacingtop .edui-listitem-label, .edui-default .edui-for-rowspacingbottom .edui-listitem-label { min-width: 53px; _width: 53px; padding: 2px 5px; } .edui-default .edui-for-lineheight .edui-listitem-label { min-width: 53px; _width: 53px; padding: 2px 5px; } .edui-default .edui-for-customstyle .edui-listitem-label { min-width: 200px; _width: 200px; width: 200px !important; padding: 2px 5px; } /* 可选中按钮弹出菜单*/ .edui-default .edui-menu { z-index: 3000; } .edui-default .edui-menu .edui-popup-content { padding: 3px; } .edui-default .edui-menu-body { _width: 150px; min-width: 170px; background: url("../images/sparator_v.png") repeat-y 25px; } .edui-default .edui-menuitem-body { } .edui-default .edui-menuitem { height: 20px; cursor: default; vertical-align: top; } .edui-default .edui-menuitem .edui-icon { width: 20px !important; height: 20px !important; background: url(../images/icons.png) 0 -4000px; background: url(../images/icons.gif) 0 -4000px\9; } .edui-default .edui-menuitem .edui-label { font-size: 12px; line-height: 20px; height: 20px; padding-left: 10px; } .edui-default .edui-state-checked .edui-menuitem-body { background: url("../images/icons-all.gif") no-repeat 6px -205px; } .edui-default .edui-state-disabled .edui-menuitem-label { color: gray; } /*不可选中菜单按钮 */ .edui-default .edui-toolbar .edui-combox-body .edui-button-body { width: 60px; font-size: 12px; height: 20px; line-height: 20px; padding-left: 5px; white-space: nowrap; margin: 0 3px 0 0; } .edui-default .edui-toolbar .edui-combox-body .edui-arrow { background: url(../images/icons.png) -741px 0; _background: url(../images/icons.gif) -741px 0; height: 20px; width: 9px; } .edui-default .edui-toolbar .edui-combox .edui-combox-body { border: 1px solid #CCC; background-color: white; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; } .edui-default .edui-toolbar .edui-combox-body .edui-splitborder { display: none; } .edui-default .edui-toolbar .edui-combox-body .edui-arrow { border-left: 1px solid #CCC; } .edui-default .edui-toolbar .edui-state-hover .edui-combox-body { background-color: #fff5d4; border: 1px solid #dcac6c; } .edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { border-left: 1px solid #dcac6c; } .edui-default .edui-toolbar .edui-state-checked .edui-combox-body { background-color: #FFE69F; border: 1px solid #DCAC6C; } .edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { border-left: 1px solid #DCAC6C; } .edui-toolbar .edui-state-disabled .edui-combox-body { background-color: #F0F0EE; opacity: 0.3; filter: alpha(opacity = 30); } .edui-toolbar .edui-state-opened .edui-combox-body { background-color: white; border: 1px solid gray; } /*普通按钮样式及状态*/ .edui-default .edui-toolbar .edui-button .edui-icon, .edui-default .edui-toolbar .edui-menubutton .edui-icon, .edui-default .edui-toolbar .edui-splitbutton .edui-icon { height: 20px !important; width: 20px !important; background-image: url(../images/icons.png); background-image: url(../images/icons.gif) \9; } .edui-default .edui-toolbar .edui-button .edui-button-wrap { padding: 1px; position: relative; } .edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { background-color: #fff5d4; padding: 0; border: 1px solid #dcac6c; } .edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { background-color: #ffe69f; padding: 0; border: 1px solid #dcac6c; border-radius: 2px; -webkit-border-radius: 2px; -moz-border-radius: 2px; } .edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { background-color: #ffffff; padding: 0; border: 1px solid gray; } .edui-default .edui-toolbar .edui-state-disabled .edui-label { color: #ccc; } .edui-default .edui-toolbar .edui-state-disabled .edui-icon { opacity: 0.3; filter: alpha(opacity = 30); } /* toolbar icons */ .edui-default .edui-for-undo .edui-icon { background-position: -160px 0; } .edui-default .edui-for-redo .edui-icon { background-position: -100px 0; } .edui-default .edui-for-bold .edui-icon { background-position: 0 0; } .edui-default .edui-for-italic .edui-icon { background-position: -60px 0; } .edui-default .edui-for-fontborder .edui-icon { background-position:-160px -40px; } .edui-default .edui-for-underline .edui-icon { background-position: -140px 0; } .edui-default .edui-for-strikethrough .edui-icon { background-position: -120px 0; } .edui-default .edui-for-subscript .edui-icon { background-position: -600px 0; } .edui-default .edui-for-superscript .edui-icon { background-position: -620px 0; } .edui-default .edui-for-blockquote .edui-icon { background-position: -220px 0; } .edui-default .edui-for-forecolor .edui-icon { background-position: -720px 0; } .edui-default .edui-for-backcolor .edui-icon { background-position: -760px 0; } .edui-default .edui-for-inserttable .edui-icon { background-position: -580px -20px; } .edui-default .edui-for-autotypeset .edui-icon { background-position: -640px -40px; } .edui-default .edui-for-justifyleft .edui-icon { background-position: -460px 0; } .edui-default .edui-for-justifycenter .edui-icon { background-position: -420px 0; } .edui-default .edui-for-justifyright .edui-icon { background-position: -480px 0; } .edui-default .edui-for-justifyjustify .edui-icon { background-position: -440px 0; } .edui-default .edui-for-insertorderedlist .edui-icon { background-position: -80px 0; } .edui-default .edui-for-insertunorderedlist .edui-icon { background-position: -20px 0; } .edui-default .edui-for-lineheight .edui-icon { background-position: -725px -40px; } .edui-default .edui-for-rowspacingbottom .edui-icon { background-position: -745px -40px; } .edui-default .edui-for-rowspacingtop .edui-icon { background-position: -765px -40px; } .edui-default .edui-for-horizontal .edui-icon { background-position: -360px 0; } .edui-default .edui-for-link .edui-icon { background-position: -500px 0; } .edui-default .edui-for-code .edui-icon { background-position: -440px -40px; } .edui-default .edui-for-insertimage .edui-icon { background-position: -726px -77px; } .edui-default .edui-for-insertframe .edui-icon { background-position: -240px -40px; } .edui-default .edui-for-emoticon .edui-icon { background-position: -60px -20px; } .edui-default .edui-for-spechars .edui-icon { background-position: -240px 0; } .edui-default .edui-for-help .edui-icon { background-position: -340px 0; } .edui-default .edui-for-print .edui-icon { background-position: -440px -20px; } .edui-default .edui-for-preview .edui-icon { background-position: -420px -20px; } .edui-default .edui-for-selectall .edui-icon { background-position: -400px -20px; } .edui-default .edui-for-searchreplace .edui-icon { background-position: -520px -20px; } .edui-default .edui-for-map .edui-icon { background-position: -40px -40px; } .edui-default .edui-for-gmap .edui-icon { background-position: -260px -40px; } .edui-default .edui-for-insertvideo .edui-icon { background-position: -320px -20px; } .edui-default .edui-for-time .edui-icon { background-position: -160px -20px; } .edui-default .edui-for-date .edui-icon { background-position: -140px -20px; } .edui-default .edui-for-cut .edui-icon { background-position: -680px 0; } .edui-default .edui-for-copy .edui-icon { background-position: -700px 0; } .edui-default .edui-for-paste .edui-icon { background-position: -560px 0; } .edui-default .edui-for-formatmatch .edui-icon { background-position: -40px 0; } .edui-default .edui-for-pasteplain .edui-icon { background-position: -360px -20px; } .edui-default .edui-for-directionalityltr .edui-icon { background-position: -20px -20px; } .edui-default .edui-for-directionalityrtl .edui-icon { background-position: -40px -20px; } .edui-default .edui-for-source .edui-icon { background-position: -261px -0px; } .edui-default .edui-for-removeformat .edui-icon { background-position: -580px 0; } .edui-default .edui-for-unlink .edui-icon { background-position: -640px 0; } .edui-default .edui-for-touppercase .edui-icon { background-position: -786px 0; } .edui-default .edui-for-tolowercase .edui-icon { background-position: -806px 0; } .edui-default .edui-for-insertrow .edui-icon { background-position: -478px -76px; } .edui-default .edui-for-insertrownext .edui-icon { background-position: -498px -76px; } .edui-default .edui-for-insertcol .edui-icon { background-position: -455px -76px; } .edui-default .edui-for-insertcolnext .edui-icon { background-position: -429px -76px; } .edui-default .edui-for-mergeright .edui-icon { background-position: -60px -40px; } .edui-default .edui-for-mergedown .edui-icon { background-position: -80px -40px; } .edui-default .edui-for-splittorows .edui-icon { background-position: -100px -40px; } .edui-default .edui-for-splittocols .edui-icon { background-position: -120px -40px; } .edui-default .edui-for-insertparagraphbeforetable .edui-icon { background-position: -140px -40px; } .edui-default .edui-for-deleterow .edui-icon { background-position: -660px -20px; } .edui-default .edui-for-deletecol .edui-icon { background-position: -640px -20px; } .edui-default .edui-for-splittocells .edui-icon { background-position: -800px -20px; } .edui-default .edui-for-mergecells .edui-icon { background-position: -760px -20px; } .edui-default .edui-for-deletetable .edui-icon { background-position: -620px -20px; } .edui-default .edui-for-cleardoc .edui-icon { background-position: -520px 0; } .edui-default .edui-for-fullscreen .edui-icon { background-position: -100px -20px; } .edui-default .edui-for-anchor .edui-icon { background-position: -200px 0; } .edui-default .edui-for-pagebreak .edui-icon { background-position: -460px -40px; } .edui-default .edui-for-imagenone .edui-icon { background-position: -480px -40px; } .edui-default .edui-for-imageleft .edui-icon { background-position: -500px -40px; } .edui-default .edui-for-wordimage .edui-icon { background-position: -660px -40px; } .edui-default .edui-for-imageright .edui-icon { background-position: -520px -40px; } .edui-default .edui-for-imagecenter .edui-icon { background-position: -540px -40px; } .edui-default .edui-for-indent .edui-icon { background-position: -400px 0; } .edui-default .edui-for-outdent .edui-icon { background-position: -540px 0; } .edui-default .edui-for-webapp .edui-icon { background-position: -601px -40px } .edui-default .edui-for-table .edui-icon { background-position: -580px -20px; } .edui-default .edui-for-edittable .edui-icon { background-position: -420px -40px; } .edui-default .edui-for-template .edui-icon { background-position: -339px -40px; } .edui-default .edui-for-delete .edui-icon { background-position: -360px -40px; } .edui-default .edui-for-attachment .edui-icon { background-position: -620px -40px; } .edui-default .edui-for-edittd .edui-icon { background-position: -700px -40px; } .edui-default .edui-for-snapscreen .edui-icon { background-position: -581px -40px } .edui-default .edui-for-scrawl .edui-icon { background-position: -801px -41px } .edui-default .edui-for-background .edui-icon { background-position: -680px -40px; } .edui-default .edui-for-music .edui-icon { background-position: -18px -40px } .edui-default .edui-for-formula .edui-icon { background-position: -200px -40px } .edui-default .edui-for-aligntd .edui-icon { background-position: -236px -76px; } .edui-default .edui-for-insertparagraphtrue .edui-icon { background-position: -625px -76px; } .edui-default .edui-for-insertparagraph .edui-icon { background-position: -602px -76px; } .edui-default .edui-for-insertcaption .edui-icon { background-position: -336px -76px; } .edui-default .edui-for-deletecaption .edui-icon { background-position: -362px -76px; } .edui-default .edui-for-inserttitle .edui-icon { background-position: -286px -76px; } .edui-default .edui-for-deletetitle .edui-icon { background-position: -311px -76px; } .edui-default .edui-for-aligntable .edui-icon { background-position: -440px 0; } .edui-default .edui-for-tablealignment-left .edui-icon { background-position: -460px 0; } .edui-default .edui-for-tablealignment-center .edui-icon { background-position: -420px 0; } .edui-default .edui-for-tablealignment-right .edui-icon { background-position: -480px 0; } .edui-default .edui-for-drafts .edui-icon { background-position: -560px 0; } .edui-default .edui-for-charts .edui-icon { background: url( ../images/charts.png ) no-repeat 2px 3px!important; } .edui-default .edui-for-inserttitlecol .edui-icon { background-position: -673px -76px; } .edui-default .edui-for-deletetitlecol .edui-icon { background-position: -698px -76px; } .edui-default .edui-for-simpleupload .edui-icon { background-position: -380px 0px; } /*splitbutton*/ .edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, .edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { background: url(../images/icons.png) -741px 0; _background: url(../images/icons.gif) -741px 0; height: 20px; width: 9px; } .edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { padding: 1px; } .edui-default .edui-toolbar .edui-splitborder { width: 1px; height: 20px; } .edui-default .edui-toolbar .edui-state-hover .edui-splitborder { width: 1px; border-left: 0px solid #dcac6c; } .edui-default .edui-toolbar .edui-state-active .edui-splitborder { width: 0; border-left: 1px solid gray; } .edui-default .edui-toolbar .edui-state-opened .edui-splitborder { width: 1px; border: 0; } .edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { background-color: #fff5d4; border: 1px solid #dcac6c; padding: 0; } .edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { background-color: #FFE69F; border: 1px solid #DCAC6C; padding: 0; } .edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { background-color: #ffffff; border: 1px solid gray; padding: 0; } .edui-default .edui-state-disabled .edui-arrow { opacity: 0.3; _filter: alpha(opacity = 30); } .edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, .edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { background-color: white; border: 1px solid gray; padding: 0; } .edui-default .edui-for-insertorderedlist .edui-bordereraser, .edui-default .edui-for-lineheight .edui-bordereraser, .edui-default .edui-for-rowspacingtop .edui-bordereraser, .edui-default .edui-for-rowspacingbottom .edui-bordereraser, .edui-default .edui-for-insertunorderedlist .edui-bordereraser { background-color: white; } /* 解决嵌套导致的图标问题 */ .edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, .edui-default .edui-for-lineheight .edui-popup-body .edui-icon, .edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, .edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon, .edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon { /*background-position: 0 -40px;*/ background-image: none ; } /* 弹出菜单 */ .edui-default .edui-popup { z-index: 3000; background-color: #ffffff; width:auto; height:auto; } .edui-default .edui-popup .edui-shadow { left: 0; top: 0; width: 100%; height: 100%; } .edui-default .edui-popup-content { border:1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); *border-right-width: 2px; *border-bottom-width: 2px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; padding: 5px; background:#ffffff; } .edui-default .edui-popup .edui-bordereraser { background-color: white; height: 3px; } .edui-default .edui-menu .edui-bordereraser { height: 3px; } .edui-default .edui-anchor-topleft .edui-bordereraser { left: 1px; top: -2px; } .edui-default .edui-anchor-topright .edui-bordereraser { right: 1px; top: -2px; } .edui-default .edui-anchor-bottomleft .edui-bordereraser { left: 0; bottom: -6px; height: 7px; border-left: 1px solid gray; border-right: 1px solid gray; } .edui-default .edui-anchor-bottomright .edui-bordereraser { right: 0; bottom: -6px; height: 7px; border-left: 1px solid gray; border-right: 1px solid gray; } .edui-popup div{ width:auto; height:auto; } .edui-default .edui-editor-messageholder { display: block; width: 150px; height: auto; border: 0; margin: 0; padding: 0; position: absolute; top: 28px; right: 3px; } .edui-default .edui-message{ min-height: 10px; text-shadow: 0 1px 0 rgba(255,255,255,0.5); padding: 0; margin-bottom: 3px; position: relative; } .edui-default .edui-message-body{ border-radius: 3px; padding: 8px 15px 8px 8px; color: #c09853; background-color: #fcf8e3; border: 1px solid #fbeed5; } .edui-default .edui-message-type-info{ color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1 } .edui-default .edui-message-type-success{ color: #468847; background-color: #dff0d8; border-color: #d6e9c6 } .edui-default .edui-message-type-danger, .edui-default .edui-message-type-error{ color: #b94a48; background-color: #f2dede; border-color: #eed3d7 } .edui-default .edui-message .edui-message-closer { display: block; width: 16px; height: 16px; line-height: 16px; position: absolute; top: 0; right: 0; padding: 0; cursor: pointer; background: transparent; border: 0; float: right; font-size: 20px; font-weight: bold; color: #999; text-shadow: 0 1px 0 #fff; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; } .edui-default .edui-message .edui-message-content { font-size: 10pt; word-wrap: break-word; word-break: normal; } /* 弹出对话框按钮和对话框大小 */ .edui-default .edui-dialog { z-index: 2000; position: absolute; } .edui-dialog div{ width:auto; } .edui-default .edui-dialog-wrap { margin-right: 6px; margin-bottom: 6px; } .edui-default .edui-dialog-fullscreen-flag { margin-right: 0; margin-bottom: 0; } .edui-default .edui-dialog-body { position: relative; padding:2px 0 0 2px; _zoom: 1; } .edui-default .edui-dialog-fullscreen-flag .edui-dialog-body { padding: 0; } .edui-default .edui-dialog-shadow { position: absolute; z-index: -1; left: 0; top: 0; width: 100%; height: 100%; background-color: #ffffff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); *border-right-width: 2px; *border-bottom-width: 2px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; } .edui-default .edui-dialog-foot { background-color: white; } .edui-default .edui-dialog-titlebar { height: 26px; border-bottom: 1px solid #c6c6c6; background: url(../images/dialog-title-bg.png) repeat-x bottom; position: relative; cursor: move; } .edui-default .edui-dialog-caption { font-weight: bold; font-size: 12px; line-height: 26px; padding-left: 5px; } .edui-default .edui-dialog-draghandle { height: 26px; } .edui-default .edui-dialog-closebutton { position: absolute !important; right: 5px; top: 3px; } .edui-default .edui-dialog-closebutton .edui-button-body { height: 20px; width: 20px; cursor: pointer; background: url("../images/icons-all.gif") no-repeat 0 -59px; } .edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body { background: url("../images/icons-all.gif") no-repeat 0 -89px; } .edui-default .edui-dialog-foot { height: 40px; } .edui-default .edui-dialog-buttons { position: absolute; right: 0; } .edui-default .edui-dialog-buttons .edui-button { margin-right: 10px; } .edui-default .edui-dialog-buttons .edui-button .edui-button-body { background: url("../images/icons-all.gif") no-repeat; height: 24px; width: 96px; font-size: 12px; line-height: 24px; text-align: center; cursor: default; } .edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { background: url("../images/icons-all.gif") no-repeat 0 -30px; } .edui-default .edui-dialog iframe { border: 0; padding: 0; margin: 0; vertical-align: top; } .edui-default .edui-dialog-modalmask { opacity: 0.3; filter: alpha(opacity = 30); background-color: #ccc; position: absolute; /*z-index: 1999;*/ } .edui-default .edui-dialog-dragmask { position: absolute; /*z-index: 2001;*/ background-color: transparent; cursor: move; } .edui-default .edui-dialog-content { position: relative; } .edui-default .dialogcontmask { cursor: move; visibility: hidden; display: block; position: absolute; width: 100%; height: 100%; opacity: 0; filter: alpha(opacity = 0); } /*link-dialog*/ .edui-default .edui-for-link .edui-dialog-content { width: 420px; height: 200px; overflow: hidden; } /*background-dialog*/ .edui-default .edui-for-background .edui-dialog-content { width: 440px; height: 280px; overflow: hidden; } /*template-dialog*/ .edui-default .edui-for-template .edui-dialog-content { width: 630px; height: 390px; overflow: hidden; } /*scrawl-dialog*/ .edui-default .edui-for-scrawl .edui-dialog-content { width: 515px; *width: 506px; height: 360px; } /*spechars-dialog*/ .edui-default .edui-for-spechars .edui-dialog-content { width: 620px; height: 500px; *width: 630px; *height: 570px; } /*image-dialog*/ .edui-default .edui-for-insertimage .edui-dialog-content { width: 650px; height: 400px; overflow: hidden; } /*webapp-dialog*/ .edui-default .edui-for-webapp .edui-dialog-content { width: 560px; _width: 565px; height: 450px; overflow: hidden; } /*image-insertframe*/ .edui-default .edui-for-insertframe .edui-dialog-content { width: 350px; height: 200px; overflow: hidden; } /*wordImage-dialog*/ .edui-default .edui-for-wordimage .edui-dialog-content { width: 620px; height: 380px; overflow: hidden; } /*attachment-dialog*/ .edui-default .edui-for-attachment .edui-dialog-content { width: 650px; height: 400px; overflow: hidden; } /*map-dialog*/ .edui-default .edui-for-map .edui-dialog-content { width: 550px; height: 400px; } /*gmap-dialog*/ .edui-default .edui-for-gmap .edui-dialog-content { width: 550px; height: 400px; } /*video-dialog*/ .edui-default .edui-for-insertvideo .edui-dialog-content { width: 590px; height: 390px; } /*anchor-dialog*/ .edui-default .edui-for-anchor .edui-dialog-content { width: 320px; height: 60px; overflow: hidden; } /*searchreplace-dialog*/ .edui-default .edui-for-searchreplace .edui-dialog-content { width: 400px; height: 220px; } /*help-dialog*/ .edui-default .edui-for-help .edui-dialog-content { width: 400px; height: 420px; } /*edittable-dialog*/ .edui-default .edui-for-edittable .edui-dialog-content { width: 540px; _width:590px; height: 335px; } /*edittip-dialog*/ .edui-default .edui-for-edittip .edui-dialog-content { width: 225px; height: 60px; } /*edittd-dialog*/ .edui-default .edui-for-edittd .edui-dialog-content { width: 240px; height: 50px; } /*snapscreen-dialog*/ .edui-default .edui-for-snapscreen .edui-dialog-content { width: 400px; height: 220px; } /*music-dialog*/ .edui-default .edui-for-music .edui-dialog-content { width: 515px; height: 360px; } /*段落弹出菜单*/ .edui-default .edui-for-paragraph .edui-listitem-label { font-family: Tahoma, Verdana, Arial, Helvetica; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { font-size: 22px; line-height: 27px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { font-weight: bolder; font-size: 32px; line-height: 36px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { font-weight: bolder; font-size: 27px; line-height: 29px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { font-weight: bolder; font-size: 19px; line-height: 23px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { font-weight: bolder; font-size: 16px; line-height: 19px } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { font-weight: bolder; font-size: 13px; line-height: 16px; } .edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { font-weight: bolder; font-size: 12px; line-height: 14px; } /* 表格弹出菜单 */ .edui-default .edui-for-inserttable .edui-splitborder { display: none } .edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { width: 0 } .edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ border-left: 1px solid transparent; } .edui-default .edui-tablepicker .edui-infoarea { height: 14px; line-height: 14px; font-size: 12px; width: 220px; margin-bottom: 3px; clear: both; } .edui-default .edui-tablepicker .edui-infoarea .edui-label { float: left; } .edui-default .edui-dialog-buttons .edui-label { line-height: 24px; } .edui-default .edui-tablepicker .edui-infoarea .edui-clickable { float: right; } .edui-default .edui-tablepicker .edui-pickarea { background: url("../images/unhighlighted.gif") repeat; height: 220px; width: 220px; } .edui-default .edui-tablepicker .edui-pickarea .edui-overlay { background: url("../images/highlighted.gif") repeat; } /* 颜色弹出菜单 */ .edui-default .edui-colorpicker-topbar { height: 27px; width: 200px; /*border-bottom: 1px gray dashed;*/ } .edui-default .edui-colorpicker-preview { height: 20px; border: 1px inset black; margin-left: 1px; width: 128px; float: left; } .edui-default .edui-colorpicker-nocolor { float: right; margin-right: 1px; font-size: 12px; line-height: 14px; height: 14px; border: 1px solid #333; padding: 3px 5px; cursor: pointer; } .edui-default .edui-colorpicker-tablefirstrow { height: 30px; } .edui-default .edui-colorpicker-colorcell { width: 14px; height: 14px; display: block; margin: 0; cursor: pointer; } .edui-default .edui-colorpicker-colorcell:hover { width: 14px; height: 14px; margin: 0; } .edui-default .edui-colorpicker-advbtn{ display: block; text-align: center; cursor: pointer; height:20px; } .arrow_down{ background: white url('../images/arrow_down.png') no-repeat center; } .arrow_up{ background: white url('../images/arrow_up.png') no-repeat center; } /*高级的样式*/ .edui-colorpicker-adv{ position: relative; overflow: hidden; height: 180px; display: none; } .edui-colorpicker-plant, .edui-colorpicker-hue { border: solid 1px #666; } .edui-colorpicker-pad { width: 150px; height: 150px; left: 14px; top: 13px; position: absolute; background: red; overflow: hidden; cursor: crosshair; } .edui-colorpicker-cover{ position: absolute; top: 0; left: 0; width: 150px; height: 150px; background: url("../images/tangram-colorpicker.png") -160px -200px; } .edui-colorpicker-padDot{ position: absolute; top: 0; left: 0; width: 11px; height: 11px; overflow: hidden; background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; z-index: 1000; } .edui-colorpicker-sliderMain { position: absolute; left: 171px; top: 13px; width: 19px; height: 152px; background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; } .edui-colorpicker-slider { width: 100%; height: 100%; cursor: pointer; } .edui-colorpicker-thumb{ position: absolute; top: 0; cursor: pointer; height: 3px; left: -1px; right: -1px; border: 1px solid black; background: white; opacity: .8; } /*自动排版弹出菜单*/ .edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body { font-size: 12px; margin-bottom: 3px; clear: both; } .edui-default .edui-autotypesetpicker-body table { border-collapse: separate; border-spacing: 2px; } .edui-default .edui-autotypesetpicker-body td { font-size: 12px; word-wrap:break-word; } .edui-default .edui-autotypesetpicker-body td input { margin: 3px 3px 3px 4px; *margin: 1px 0 0 0; } /*自动排版弹出菜单*/ .edui-default .edui-cellalignpicker .edui-cellalignpicker-body { width: 70px; font-size: 12px; cursor: default; } .edui-default .edui-cellalignpicker-body table { border-collapse: separate; border-spacing: 0; } .edui-default .edui-cellalignpicker-body td{ padding: 1px; } .edui-default .edui-cellalignpicker-body .edui-icon{ height: 20px; width: 20px; padding: 1px; background-image: url(../images/table-cell-align.png); } .edui-default .edui-cellalignpicker-body .edui-left{ background-position: 0 0; } .edui-default .edui-cellalignpicker-body .edui-center{ background-position: -25px 0; } .edui-default .edui-cellalignpicker-body .edui-right{ background-position: -51px 0; } .edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{ background-position: -73px 0; } .edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{ background-position: -98px 0; } .edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{ background-position: -124px 0; } .edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { background-position: -146px 0; background-color: #f1f4f5; } .edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { background-position: -245px 0; } .edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { background-position: -271px 0; } /*分隔线*/ .edui-default .edui-toolbar .edui-separator { width: 2px; height: 20px; margin: 2px 4px 2px 3px; background: url(../images/icons.png) -181px 0; background: url(../images/icons.gif) -181px 0 \9; } /*颜色按钮 */ .edui-default .edui-toolbar .edui-colorbutton .edui-colorlump { position: absolute; overflow: hidden; bottom: 1px; left: 1px; width: 18px; height: 4px; } /*表情按钮及弹出菜单*/ /*去除了表情的下拉箭头*/ .edui-default .edui-for-emotion .edui-icon { background-position: -60px -20px; } .edui-default .edui-for-emotion .edui-popup-content iframe { width: 514px; height: 380px; overflow: hidden; } .edui-default .edui-for-emotion .edui-popup-content { position: relative; z-index: 555 } .edui-default .edui-for-emotion .edui-splitborder { display: none } .edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow { width: 0 } .edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder { border-left: 1px solid transparent; } /*contextmenu*/ .edui-default .edui-hassubmenu .edui-arrow { height: 20px; width: 20px; float: right; background: url("../images/icons-all.gif") no-repeat 10px -233px; } .edui-default .edui-menu-body .edui-menuitem { padding: 1px; } .edui-default .edui-menuseparator { margin: 2px 0; height: 1px; overflow: hidden; } .edui-default .edui-menuseparator-inner { border-bottom: 1px solid #e2e3e3; margin-left: 29px; margin-right: 1px; } .edui-default .edui-menu-body .edui-state-hover { padding: 0 !important; background-color: #fff5d4; border: 1px solid #dcac6c; } /*弹出菜单*/ .edui-default .edui-shortcutmenu { padding: 2px; width: 190px; height: 50px; background-color: #fff; border: 1px solid #ccc; border-radius: 5px; } /*粘贴弹出菜单*/ .edui-default .edui-wordpastepop .edui-popup-content{ border: none; padding: 0; width: 54px; height: 21px; } .edui-default .edui-pasteicon { width: 100%; height: 100%; background-image: url('../images/wordpaste.png'); background-position: 0 0; } .edui-default .edui-pasteicon.edui-state-opened { background-position: 0 -34px; } .edui-default .edui-pastecontainer { position: relative; visibility: hidden; width: 97px; background: #fff; border: 1px solid #ccc; } .edui-default .edui-pastecontainer .edui-title { font-weight: bold; background: #F8F8FF; height: 25px; line-height: 25px; font-size: 12px; padding-left: 5px; } .edui-default .edui-pastecontainer .edui-button { overflow: hidden; margin: 3px 0; } .edui-default .edui-pastecontainer .edui-button .edui-richtxticon, .edui-default .edui-pastecontainer .edui-button .edui-tagicon, .edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{ float: left; cursor: pointer; width: 29px; height: 29px; margin-left: 5px; background-image: url('../images/wordpaste.png'); background-repeat: no-repeat; } .edui-default .edui-pastecontainer .edui-button .edui-richtxticon { margin-left: 0; background-position: -109px 0; } .edui-default .edui-pastecontainer .edui-button .edui-tagicon { background-position: -148px 1px; } .edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { background-position: -72px 0; } .edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { background-position: -109px -34px; } .edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ background-position: -148px -34px; } .edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ background-position: -72px -34px; } ================================================ FILE: static/common/user/uedit/themes/default/dialogbase.css ================================================ /*弹出对话框页面样式组件 */ /*reset */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; outline: 0; font-size: 100%; } body { line-height: 1; } ol, ul { list-style: none; } blockquote, q { quotes: none; } ins { text-decoration: none; } del { text-decoration: line-through; } table { border-collapse: collapse; border-spacing: 0; } /*module */ body { background-color: #fff; font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA; color: #646464; } /*tab*/ .tabhead { position: relative; z-index: 10; } .tabhead span { display: inline-block; padding: 0 5px; height: 30px; border: 1px solid #ccc; background: url("images/dialog-title-bg.png") repeat-x; text-align: center; line-height: 30px; cursor: pointer; *margin-right: 5px; } .tabhead span.focus { height: 31px; border-bottom: none; background: #fff; } .tabbody { position: relative; top: -1px; margin: 0 auto; border: 1px solid #ccc; } /*button*/ a.button { display: block; text-align: center; line-height: 24px; text-decoration: none; height: 24px; width: 95px; border: 0; color: #838383; background: url(../../themes/default/images/icons-all.gif) no-repeat; } a.button:hover { background-position: 0 -30px; } ================================================ FILE: static/common/user/uedit/themes/iframe.css ================================================ /*可以在这里添加你自己的css*/ ================================================ FILE: static/common/user/uedit/third-party/SyntaxHighlighter/shCore.js ================================================ // XRegExp 1.5.1 // (c) 2007-2012 Steven Levithan // MIT License // // Provides an augmented, extensible, cross-browser implementation of regular expressions, // including support for additional syntax, flags, and methods var XRegExp; if (XRegExp) { // Avoid running twice, since that would break references to native globals throw Error("can't load XRegExp twice in the same frame"); } // Run within an anonymous function to protect variables and avoid new globals (function (undefined) { //--------------------------------- // Constructor //--------------------------------- // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native // regular expression in that additional syntax and flags are supported and cross-browser // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and // converts to type XRegExp XRegExp = function (pattern, flags) { var output = [], currScope = XRegExp.OUTSIDE_CLASS, pos = 0, context, tokenResult, match, chr, regex; if (XRegExp.isRegExp(pattern)) { if (flags !== undefined) throw TypeError("can't supply flags when constructing one RegExp from another"); return clone(pattern); } // Tokens become part of the regex construction process, so protect against infinite // recursion when an XRegExp is constructed within a token handler or trigger if (isInsideConstructor) throw Error("can't call the XRegExp constructor within token definition functions"); flags = flags || ""; context = { // `this` object for custom tokens hasNamedCapture: false, captureNames: [], hasFlag: function (flag) {return flags.indexOf(flag) > -1;}, setFlag: function (flag) {flags += flag;} }; while (pos < pattern.length) { // Check for custom tokens at the current position tokenResult = runTokens(pattern, pos, currScope, context); if (tokenResult) { output.push(tokenResult.output); pos += (tokenResult.match[0].length || 1); } else { // Check for native multicharacter metasequences (excluding character classes) at // the current position if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { output.push(match[0]); pos += match[0].length; } else { chr = pattern.charAt(pos); if (chr === "[") currScope = XRegExp.INSIDE_CLASS; else if (chr === "]") currScope = XRegExp.OUTSIDE_CLASS; // Advance position one character output.push(chr); pos++; } } } regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); regex._xregexp = { source: pattern, captureNames: context.hasNamedCapture ? context.captureNames : null }; return regex; }; //--------------------------------- // Public properties //--------------------------------- XRegExp.version = "1.5.1"; // Token scope bitflags XRegExp.INSIDE_CLASS = 1; XRegExp.OUTSIDE_CLASS = 2; //--------------------------------- // Private variables //--------------------------------- var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, isInsideConstructor = false, tokens = [], // Copy native globals for reference ("native" is an ES3 reserved keyword) nativ = { exec: RegExp.prototype.exec, test: RegExp.prototype.test, match: String.prototype.match, replace: String.prototype.replace, split: String.prototype.split }, compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups compliantLastIndexIncrement = function () { var x = /^/g; nativ.test.call(x, ""); return !x.lastIndex; }(), hasNativeY = RegExp.prototype.sticky !== undefined, nativeTokens = {}; // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, // excluding character classes) nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; //--------------------------------- // Public methods //--------------------------------- // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by // the XRegExp library and can be used to create XRegExp plugins. This function is intended for // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can // be disabled by `XRegExp.freezeTokens` XRegExp.addToken = function (regex, handler, scope, trigger) { tokens.push({ pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), handler: handler, scope: scope || XRegExp.OUTSIDE_CLASS, trigger: trigger || null }); }; // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag // combination has previously been cached, the cached copy is returned; otherwise the newly // created regex is cached XRegExp.cache = function (pattern, flags) { var key = pattern + "/" + (flags || ""); return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); }; // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve // special properties required for named capture XRegExp.copyAsGlobal = function (regex) { return clone(regex, "g"); }; // Accepts a string; returns the string with regex metacharacters escaped. The returned string // can safely be used at any point within a regex to match the provided literal string. Escaped // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace XRegExp.escape = function (str) { return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); }; // Accepts a string to search, regex to search with, position to start the search within the // string (default: 0), and an optional Boolean indicating whether matches must start at-or- // after the position or at the specified position only. This function ignores the `lastIndex` // of the provided regex in its own handling, but updates the property for compatibility XRegExp.execAt = function (str, regex, pos, anchored) { var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), match; r2.lastIndex = pos = pos || 0; match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) if (anchored && match && match.index !== pos) match = null; if (regex.global) regex.lastIndex = match ? r2.lastIndex : 0; return match; }; // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing // syntax and flag changes. Should be run after XRegExp and any plugins are loaded XRegExp.freezeTokens = function () { XRegExp.addToken = function () { throw Error("can't run addToken after freezeTokens"); }; }; // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. // Note that this is also `true` for regex literals and regexes created by the `XRegExp` // constructor. This works correctly for variables created in another frame, when `instanceof` // and `constructor` checks would fail to work as intended XRegExp.isRegExp = function (o) { return Object.prototype.toString.call(o) === "[object RegExp]"; }; // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to // iterate over regex matches compared to the traditional approaches of subverting // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop XRegExp.iterate = function (str, regex, callback, context) { var r2 = clone(regex, "g"), i = -1, match; while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) if (regex.global) regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` callback.call(context, match, ++i, str, regex); if (r2.lastIndex === match.index) r2.lastIndex++; } if (regex.global) regex.lastIndex = 0; }; // Accepts a string and an array of regexes; returns the result of using each successive regex // to search within the matches of the previous regex. The array of regexes can also contain // objects with `regex` and `backref` properties, in which case the named or numbered back- // references specified are passed forward to the next regex or returned. E.g.: // var xregexpImgFileNames = XRegExp.matchChain(html, [ // {regex: /]+)>/i, backref: 1}, // tag attributes // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths // /[^\/]+$/ // filenames (strip directory paths) // ]); XRegExp.matchChain = function (str, chain) { return function recurseChain (values, level) { var item = chain[level].regex ? chain[level] : {regex: chain[level]}, regex = clone(item.regex, "g"), matches = [], i; for (i = 0; i < values.length; i++) { XRegExp.iterate(values[i], regex, function (match) { matches.push(item.backref ? (match[item.backref] || "") : match[0]); }); } return ((level === chain.length - 1) || !matches.length) ? matches : recurseChain(matches, level + 1); }([str], 0); }; //--------------------------------- // New RegExp prototype methods //--------------------------------- // Accepts a context object and arguments array; returns the result of calling `exec` with the // first value in the arguments array. the context is ignored but is accepted for congruity // with `Function.prototype.apply` RegExp.prototype.apply = function (context, args) { return this.exec(args[0]); }; // Accepts a context object and string; returns the result of calling `exec` with the provided // string. the context is ignored but is accepted for congruity with `Function.prototype.call` RegExp.prototype.call = function (context, str) { return this.exec(str); }; //--------------------------------- // Overriden native methods //--------------------------------- // Adds named capture support (with backreferences returned as `result.name`), and fixes two // cross-browser issues per ES3: // - Captured values for nonparticipating capturing groups should be returned as `undefined`, // rather than the empty string. // - `lastIndex` should not be incremented after zero-length matches. RegExp.prototype.exec = function (str) { var match, name, r2, origLastIndex; if (!this.global) origLastIndex = this.lastIndex; match = nativ.exec.apply(this, arguments); if (match) { // Fix browsers whose `exec` methods don't consistently return `undefined` for // nonparticipating capturing groups if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed // matching due to characters outside the match nativ.replace.call((str + "").slice(match.index), r2, function () { for (var i = 1; i < arguments.length - 2; i++) { if (arguments[i] === undefined) match[i] = undefined; } }); } // Attach named capture properties if (this._xregexp && this._xregexp.captureNames) { for (var i = 1; i < match.length; i++) { name = this._xregexp.captureNames[i - 1]; if (name) match[name] = match[i]; } } // Fix browsers that increment `lastIndex` after zero-length matches if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) this.lastIndex--; } if (!this.global) this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) return match; }; // Fix browser bugs in native method RegExp.prototype.test = function (str) { // Use the native `exec` to skip some processing overhead, even though the altered // `exec` would take care of the `lastIndex` fixes var match, origLastIndex; if (!this.global) origLastIndex = this.lastIndex; match = nativ.exec.call(this, str); // Fix browsers that increment `lastIndex` after zero-length matches if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) this.lastIndex--; if (!this.global) this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) return !!match; }; // Adds named capture support and fixes browser bugs in native method String.prototype.match = function (regex) { if (!XRegExp.isRegExp(regex)) regex = RegExp(regex); // Native `RegExp` if (regex.global) { var result = nativ.match.apply(this, arguments); regex.lastIndex = 0; // Fix IE bug return result; } return regex.exec(this); // Run the altered `exec` }; // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, // and provides named backreferences to replacement functions as `arguments[0].name`. Also // fixes cross-browser differences in replacement text syntax when performing a replacement // using a nonregex search value, and the value of replacement regexes' `lastIndex` property // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary // third (`flags`) parameter String.prototype.replace = function (search, replacement) { var isRegex = XRegExp.isRegExp(search), captureNames, result, str, origLastIndex; // There are too many combinations of search/replacement types/values and browser bugs that // preclude passing to native `replace`, so don't try //if (...) // return nativ.replace.apply(this, arguments); if (isRegex) { if (search._xregexp) captureNames = search._xregexp.captureNames; // Array or `null` if (!search.global) origLastIndex = search.lastIndex; } else { search = search + ""; // Type conversion } if (Object.prototype.toString.call(replacement) === "[object Function]") { result = nativ.replace.call(this + "", search, function () { if (captureNames) { // Change the `arguments[0]` string primitive to a String object which can store properties arguments[0] = new String(arguments[0]); // Store named backreferences on `arguments[0]` for (var i = 0; i < captureNames.length; i++) { if (captureNames[i]) arguments[0][captureNames[i]] = arguments[i + 1]; } } // Update `lastIndex` before calling `replacement` (fix browsers) if (isRegex && search.global) search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; return replacement.apply(null, arguments); }); } else { str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) result = nativ.replace.call(str, search, function () { var args = arguments; // Keep this function's `arguments` available through closure return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { // Numbered backreference (without delimiters) or special variable if ($1) { switch ($1) { case "$": return "$"; case "&": return args[0]; case "`": return args[args.length - 1].slice(0, args[args.length - 2]); case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length); // Numbered backreference default: // What does "$10" mean? // - Backreference 10, if 10 or more capturing groups exist // - Backreference 1 followed by "0", if 1-9 capturing groups exist // - Otherwise, it's the string "$10" // Also note: // - Backreferences cannot be more than two digits (enforced by `replacementToken`) // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" // - There is no "$0" token ("$&" is the entire match) var literalNumbers = ""; $1 = +$1; // Type conversion; drop leading zero if (!$1) // `$1` was "0" or "00" return $0; while ($1 > args.length - 3) { literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; $1 = Math.floor($1 / 10); // Drop the last digit } return ($1 ? args[$1] || "" : "$") + literalNumbers; } // Named backreference or delimited numbered backreference } else { // What does "${n}" mean? // - Backreference to numbered capture n. Two differences from "$n": // - n can be more than two digits // - Backreference 0 is allowed, and is the entire match // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture // - Otherwise, it's the string "${n}" var n = +$2; // Type conversion; drop leading zeros if (n <= args.length - 3) return args[n]; n = captureNames ? indexOf(captureNames, $2) : -1; return n > -1 ? args[n + 1] : $0; } }); }); } if (isRegex) { if (search.global) search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) else search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) } return result; }; // A consistent cross-browser, ES3 compliant `split` String.prototype.split = function (s /* separator */, limit) { // If separator `s` is not a regex, use the native `split` if (!XRegExp.isRegExp(s)) return nativ.split.apply(this, arguments); var str = this + "", // Type conversion output = [], lastLastIndex = 0, match, lastLength; // Behavior for `limit`: if it's... // - `undefined`: No limit // - `NaN` or zero: Return an empty array // - A positive number: Use `Math.floor(limit)` // - A negative number: No limit // - Other: Type-convert, then use the above rules if (limit === undefined || +limit < 0) { limit = Infinity; } else { limit = Math.floor(+limit); if (!limit) return []; } // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero // and restore it to its original value when we're done using the regex s = XRegExp.copyAsGlobal(s); while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) if (s.lastIndex > lastLastIndex) { output.push(str.slice(lastLastIndex, match.index)); if (match.length > 1 && match.index < str.length) Array.prototype.push.apply(output, match.slice(1)); lastLength = match[0].length; lastLastIndex = s.lastIndex; if (output.length >= limit) break; } if (s.lastIndex === match.index) s.lastIndex++; } if (lastLastIndex === str.length) { if (!nativ.test.call(s, "") || lastLength) output.push(""); } else { output.push(str.slice(lastLastIndex)); } return output.length > limit ? output.slice(0, limit) : output; }; //--------------------------------- // Private helper functions //--------------------------------- // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` // instance with a fresh `lastIndex` (set to zero), preserving properties required for named // capture. Also allows adding new flags in the process of copying the regex function clone (regex, additionalFlags) { if (!XRegExp.isRegExp(regex)) throw TypeError("type RegExp expected"); var x = regex._xregexp; regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); if (x) { regex._xregexp = { source: x.source, captureNames: x.captureNames ? x.captureNames.slice(0) : null }; } return regex; } function getNativeFlags (regex) { return (regex.global ? "g" : "") + (regex.ignoreCase ? "i" : "") + (regex.multiline ? "m" : "") + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 (regex.sticky ? "y" : ""); } function runTokens (pattern, index, scope, context) { var i = tokens.length, result, match, t; // Protect against constructing XRegExps within token handler and trigger functions isInsideConstructor = true; // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws try { while (i--) { // Run in reverse order t = tokens[i]; if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { t.pattern.lastIndex = index; match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. if (match && match.index === index) { result = { output: t.handler.call(context, match, scope), match: match }; break; } } } } catch (err) { throw err; } finally { isInsideConstructor = false; } return result; } function indexOf (array, item, from) { if (Array.prototype.indexOf) // Use the native array method if available return array.indexOf(item, from); for (var i = from || 0; i < array.length; i++) { if (array[i] === item) return i; } return -1; } //--------------------------------- // Built-in tokens //--------------------------------- // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` // Comment pattern: (?# ) XRegExp.addToken( /\(\?#[^)]*\)/, function (match) { // Keep tokens separated unless the following token is a quantifier return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; } ); // Capturing group (match the opening parenthesis only). // Required for support of named capturing groups XRegExp.addToken( /\((?!\?)/, function () { this.captureNames.push(null); return "("; } ); // Named capturing group (match the opening delimiter only): (? XRegExp.addToken( /\(\?<([$\w]+)>/, function (match) { this.captureNames.push(match[1]); this.hasNamedCapture = true; return "("; } ); // Named backreference: \k XRegExp.addToken( /\\k<([\w$]+)>/, function (match) { var index = indexOf(this.captureNames, match[1]); // Keep backreferences separate from subsequent literal numbers. Preserve back- // references to named groups that are undefined at this point as literal strings return index > -1 ? "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : match[0]; } ); // Empty character class: [] or [^] XRegExp.addToken( /\[\^?]/, function (match) { // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. // (?!) should work like \b\B, but is unreliable in Firefox return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; } ); // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. XRegExp.addToken( /^\(\?([imsx]+)\)/, function (match) { this.setFlag(match[1]); return ""; } ); // Whitespace and comments, in free-spacing (aka extended) mode only XRegExp.addToken( /(?:\s+|#.*)+/, function (match) { // Keep tokens separated unless the following token is a quantifier return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; }, XRegExp.OUTSIDE_CLASS, function () {return this.hasFlag("x");} ); // Dot, in dotall (aka singleline) mode only XRegExp.addToken( /\./, function () {return "[\\s\\S]";}, XRegExp.OUTSIDE_CLASS, function () {return this.hasFlag("s");} ); //--------------------------------- // Backward compatibility //--------------------------------- // Uncomment the following block for compatibility with XRegExp 1.0-1.2: /* XRegExp.matchWithinChain = XRegExp.matchChain; RegExp.prototype.addFlags = function (s) {return clone(this, s);}; RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; */ })(); // // Begin anonymous function. This is used to contain local scope variables without polutting global scope. // if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() { // CommonJS if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') { XRegExp = require('XRegExp').XRegExp; } // Shortcut object which will be assigned to the SyntaxHighlighter variable. // This is a shorthand for local reference in order to avoid long namespace // references to SyntaxHighlighter.whatever... var sh = { defaults : { /** Additional CSS class names to be added to highlighter elements. */ 'class-name' : '', /** First line number. */ 'first-line' : 1, /** * Pads line numbers. Possible values are: * * false - don't pad line numbers. * true - automaticaly pad numbers with minimum required number of leading zeroes. * [int] - length up to which pad line numbers. */ 'pad-line-numbers' : false, /** Lines to highlight. */ 'highlight' : false, /** Title to be displayed above the code block. */ 'title' : null, /** Enables or disables smart tabs. */ 'smart-tabs' : true, /** Gets or sets tab size. */ 'tab-size' : 4, /** Enables or disables gutter. */ 'gutter' : true, /** Enables or disables toolbar. */ 'toolbar' : true, /** Enables quick code copy and paste from double click. */ 'quick-code' : true, /** Forces code view to be collapsed. */ 'collapse' : false, /** Enables or disables automatic links. */ 'auto-links' : false, /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ 'light' : false, 'unindent' : true, 'html-script' : false }, config : { space : ' ', /** Enables use of * * ``` */ findParent:function (node, filterFn, includeSelf) { if (node && !domUtils.isBody(node)) { node = includeSelf ? node : node.parentNode; while (node) { if (!filterFn || filterFn(node) || domUtils.isBody(node)) { return filterFn && !filterFn(node) && domUtils.isBody(node) ? null : node; } node = node.parentNode; } } return null; }, /** * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 * @method findParentByTagName * @param { Node } node 需要查找的节点对象 * @param { Array } tagNames 需要查找的父节点的名称数组 * @warning 查找的终点是到body节点为止 * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL * @example * ```javascript * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); * //output: BODY * console.log( node.tagName ); * ``` */ /** * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, * 否则, 起点是node的父节点。 * @method findParentByTagName * @param { Node } node 需要查找的节点对象 * @param { Array } tagNames 需要查找的父节点的名称数组 * @param { Boolean } includeSelf 查找过程是否包含node节点自身 * @warning 查找的终点是到body节点为止 * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL * @example * ```javascript * var queryTarget = document.getElementsByTagName("div")[0]; * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); * //output: true * console.log( queryTarget === node ); * ``` */ findParentByTagName:function (node, tagNames, includeSelf, excludeFn) { tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); return domUtils.findParent(node, function (node) { return tagNames[node.tagName] && !(excludeFn && excludeFn(node)); }, includeSelf); }, /** * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 * @method findParents * @param { Node } node 需要查找的节点对象 * @return { Array } 给定节点的祖先节点数组 * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 */ /** * 查找节点node的祖先节点集合, 如果includeSelf的值为true, * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 * @method findParents * @param { Node } node 需要查找的节点对象 * @param { Boolean } includeSelf 查找的结果中是否允许包含当前查找的节点对象 * @return { Array } 给定节点的祖先节点数组 */ findParents:function (node, includeSelf, filterFn, closerFirst) { var parents = includeSelf && ( filterFn && filterFn(node) || !filterFn ) ? [node] : []; while (node = domUtils.findParent(node, filterFn)) { parents.push(node); } return closerFirst ? parents : parents.reverse(); }, /** * 在节点node后面插入新节点newNode * @method insertAfter * @param { Node } node 目标节点 * @param { Node } newNode 新插入的节点, 该节点将置于目标节点之后 * @return { Node } 新插入的节点 */ insertAfter:function (node, newNode) { return node.nextSibling ? node.parentNode.insertBefore(newNode, node.nextSibling): node.parentNode.appendChild(newNode); }, /** * 删除节点node及其下属的所有节点 * @method remove * @param { Node } node 需要删除的节点对象 * @return { Node } 返回刚删除的节点对象 * @example * ```html *
            *
            你好
            *
            * * ``` */ /** * 删除节点node,并根据keepChildren的值决定是否保留子节点 * @method remove * @param { Node } node 需要删除的节点对象 * @param { Boolean } keepChildren 是否需要保留子节点 * @return { Node } 返回刚删除的节点对象 * @example * ```html *
            *
            你好
            *
            * * ``` */ remove:function (node, keepChildren) { var parent = node.parentNode, child; if (parent) { if (keepChildren && node.hasChildNodes()) { while (child = node.firstChild) { parent.insertBefore(child, node); } } parent.removeChild(node); } return node; }, /** * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 * @method getNextDomNode * @param { Node } node 需要获取其后的兄弟节点的节点对象 * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL * @example * ```html * *
            * *
            * xxx * * * ``` * @example * ```html * *
            * * xxx *
            * xxx * * * ``` */ /** * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, * 则执行getNextDomNode(Node node)的查找过程。 * @method getNextDomNode * @param { Node } node 需要获取其后的兄弟节点的节点对象 * @param { Boolean } startFromChild 查找过程是否从其子节点开始 * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL * @see UE.dom.domUtils.getNextDomNode(Node) */ getNextDomNode:function (node, startFromChild, filterFn, guard) { return getDomNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard); }, getPreDomNode:function (node, startFromChild, filterFn, guard) { return getDomNode(node, 'lastChild', 'previousSibling', startFromChild, filterFn, guard); }, /** * 检测节点node是否属是UEditor定义的bookmark节点 * @method isBookmarkNode * @private * @param { Node } node 需要检测的节点对象 * @return { Boolean } 是否是bookmark节点 * @example * ```html * * * ``` */ isBookmarkNode:function (node) { return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); }, /** * 获取节点node所属的window对象 * @method getWindow * @param { Node } node 节点对象 * @return { Window } 当前节点所属的window对象 * @example * ```javascript * //output: true * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); * ``` */ getWindow:function (node) { var doc = node.ownerDocument || node; return doc.defaultView || doc.parentWindow; }, /** * 获取离nodeA与nodeB最近的公共的祖先节点 * @method getCommonAncestor * @param { Node } nodeA 第一个节点 * @param { Node } nodeB 第二个节点 * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 * @example * ```javascript * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); * //output: true * console.log( commonAncestor.tagName.toLowerCase() === 'body' ); * ``` */ getCommonAncestor:function (nodeA, nodeB) { if (nodeA === nodeB) return nodeA; var parentsA = [nodeA] , parentsB = [nodeB], parent = nodeA, i = -1; while (parent = parent.parentNode) { if (parent === nodeB) { return parent; } parentsA.push(parent); } parent = nodeB; while (parent = parent.parentNode) { if (parent === nodeA) return parent; parentsB.push(parent); } parentsA.reverse(); parentsB.reverse(); while (i++, parentsA[i] === parentsB[i]) { } return i == 0 ? null : parentsA[i - 1]; }, /** * 清除node节点左右连续为空的兄弟inline节点 * @method clearEmptySibling * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, * 则这些兄弟节点将被删除 * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 * @example * ```html * *
            * * * * xxx * * * * ``` */ /** * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, * 则忽略对右边兄弟节点的操作。 * @method clearEmptySibling * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 * 则这些兄弟节点将被删除 * @see UE.dom.domUtils.clearEmptySibling(Node) */ /** * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 * @method clearEmptySibling * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 * 则这些兄弟节点将被删除 * @see UE.dom.domUtils.clearEmptySibling(Node) */ clearEmptySibling:function (node, ignoreNext, ignorePre) { function clear(next, dir) { var tmpNode; while (next && !domUtils.isBookmarkNode(next) && (domUtils.isEmptyInlineElement(next) //这里不能把空格算进来会吧空格干掉,出现文字间的空格丢掉了 || !new RegExp('[^\t\n\r' + domUtils.fillChar + ']').test(next.nodeValue) )) { tmpNode = next[dir]; domUtils.remove(next); next = tmpNode; } } !ignoreNext && clear(node.nextSibling, 'nextSibling'); !ignorePre && clear(node.previousSibling, 'previousSibling'); }, /** * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 * @method split * @param { Node } textNode 需要拆分的文本节点对象 * @param { int } offset 需要拆分的位置, 位置计算从0开始 * @return { Node } 拆分后形成的新节点 * @example * ```html *
            abcdef
            * * ``` */ split:function (node, offset) { var doc = node.ownerDocument; if (browser.ie && offset == node.nodeValue.length) { var next = doc.createTextNode(''); return domUtils.insertAfter(node, next); } var retval = node.splitText(offset); //ie8下splitText不会跟新childNodes,我们手动触发他的更新 if (browser.ie8) { var tmpNode = doc.createTextNode(''); domUtils.insertAfter(retval, tmpNode); domUtils.remove(tmpNode); } return retval; }, /** * 检测文本节点textNode是否为空节点(包括空格、换行、占位符等字符) * @method isWhitespace * @param { Node } node 需要检测的节点对象 * @return { Boolean } 检测的节点是否为空 * @example * ```html *
            * *
            * * ``` */ isWhitespace:function (node) { return !new RegExp('[^ \t\n\r' + domUtils.fillChar + ']').test(node.nodeValue); }, /** * 获取元素element相对于viewport的位置坐标 * @method getXY * @param { Node } element 需要计算位置的节点对象 * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, * y代表垂直偏移距离。 * * @example * ```javascript * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); * //output: test的坐标为: 12, 24 * console.log( 'test的坐标为: ', location.x, ',', location.y ); * ``` */ getXY:function (element) { var x = 0, y = 0; while (element.offsetParent) { y += element.offsetTop; x += element.offsetLeft; element = element.offsetParent; } return { 'x':x, 'y':y}; }, /** * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 * @method on * @param { Node } element 需要绑定事件的节点对象 * @param { String } type 绑定的事件类型 * @param { Function } handler 事件处理器 * @example * ```javascript * UE.dom.domUtils.on(document.body,"click",function(e){ * //e为事件对象,this为被点击元素对戏那个 * }); * ``` */ /** * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 * @method on * @param { Node } element 需要绑定事件的节点对象 * @param { Array } type 绑定的事件类型数组 * @param { Function } handler 事件处理器 * @example * ```javascript * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ * //evt为事件对象,this为被点击元素对象 * }); * ``` */ on:function (element, type, handler) { var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), k = types.length; if (k) while (k--) { type = types[k]; if (element.addEventListener) { element.addEventListener(type, handler, false); } else { if (!handler._d) { handler._d = { els : [] }; } var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); if (!handler._d[key] || index == -1) { if(index == -1){ handler._d.els.push(element); } if(!handler._d[key]){ handler._d[key] = function (evt) { return handler.call(evt.srcElement, evt || window.event); }; } element.attachEvent('on' + type, handler._d[key]); } } } element = null; }, /** * 解除DOM事件绑定 * @method un * @param { Node } element 需要解除事件绑定的节点对象 * @param { String } type 需要接触绑定的事件类型 * @param { Function } handler 对应的事件处理器 * @example * ```javascript * UE.dom.domUtils.un(document.body,"click",function(evt){ * //evt为事件对象,this为被点击元素对象 * }); * ``` */ /** * 解除DOM事件绑定 * @method un * @param { Node } element 需要解除事件绑定的节点对象 * @param { Array } type 需要接触绑定的事件类型数组 * @param { Function } handler 对应的事件处理器 * @example * ```javascript * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ * //evt为事件对象,this为被点击元素对象 * }); * ``` */ un:function (element, type, handler) { var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), k = types.length; if (k) while (k--) { type = types[k]; if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else { var key = type + handler.toString(); try{ element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); }catch(e){} if (handler._d && handler._d[key]) { var index = utils.indexOf(handler._d.els,element); if(index!=-1){ handler._d.els.splice(index,1); } handler._d.els.length == 0 && delete handler._d[key]; } } } }, /** * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 * @method isSameElement * @param { Node } nodeA 需要比较的节点 * @param { Node } nodeB 需要比较的节点 * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 * @example * ```html * ssss * bbbbb * ssss * bbbbb * * * ``` */ isSameElement:function (nodeA, nodeB) { if (nodeA.tagName != nodeB.tagName) { return false; } var thisAttrs = nodeA.attributes, otherAttrs = nodeB.attributes; if (!ie && thisAttrs.length != otherAttrs.length) { return false; } var attrA, attrB, al = 0, bl = 0; for (var i = 0; attrA = thisAttrs[i++];) { if (attrA.nodeName == 'style') { if (attrA.specified) { al++; } if (domUtils.isSameStyle(nodeA, nodeB)) { continue; } else { return false; } } if (ie) { if (attrA.specified) { al++; attrB = otherAttrs.getNamedItem(attrA.nodeName); } else { continue; } } else { attrB = nodeB.attributes[attrA.nodeName]; } if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { return false; } } // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 if (ie) { for (i = 0; attrB = otherAttrs[i++];) { if (attrB.specified) { bl++; } } if (al != bl) { return false; } } return true; }, /** * 判断节点nodeA与节点nodeB的元素的style属性是否一致 * @method isSameStyle * @param { Node } nodeA 需要比较的节点 * @param { Node } nodeB 需要比较的节点 * @return { Boolean } 两个节点是否具有相同的style属性值 * @example * ```html * ssss * bbbbb * ssss * bbbbb * * * ``` */ isSameStyle:function (nodeA, nodeB) { var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'), styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'); if (browser.opera) { styleA = nodeA.style; styleB = nodeB.style; if (styleA.length != styleB.length) return false; for (var p in styleA) { if (/^(\d+|csstext)$/i.test(p)) { continue; } if (styleA[p] != styleB[p]) { return false; } } return true; } if (!styleA || !styleB) { return styleA == styleB; } styleA = styleA.split(';'); styleB = styleB.split(';'); if (styleA.length != styleB.length) { return false; } for (var i = 0, ci; ci = styleA[i++];) { if (utils.indexOf(styleB, ci) == -1) { return false; } } return true; }, /** * 检查节点node是否为block元素 * @method isBlockElm * @param { Node } node 需要检测的节点对象 * @return { Boolean } 是否是block元素节点 * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 * @example * ```html * * *
            * * * ``` */ isBlockElm:function (node) { return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, 'display')]) && !dtd.$nonChild[node.tagName]; }, /** * 检测node节点是否为body节点 * @method isBody * @param { Element } node 需要检测的dom元素 * @return { Boolean } 给定的元素是否是body元素 * @example * ```javascript * //output: true * console.log( UE.dom.domUtils.isBody( document.body ) ); * ``` */ isBody:function (node) { return node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body'; }, /** * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, * 拆分形成的两个节点之间是node节点 * @method breakParent * @param { Node } node 作为分界的节点对象 * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 * @return { Node } 给定的node分界节点 * @example * ```javascript * * var node = document.createElement("span"), * wrapNode = document.createElement( "div" ), * parent = document.createElement("p"); * * parent.appendChild( node ); * wrapNode.appendChild( parent ); * * //拆分前 * //output:

            * console.log( wrapNode.innerHTML ); * * * UE.dom.domUtils.breakParent( node, parent ); * //拆分后 * //output:

            * console.log( wrapNode.innerHTML ); * * ``` */ breakParent:function (node, parent) { var tmpNode, parentClone = node, clone = node, leftNodes, rightNodes; do { parentClone = parentClone.parentNode; if (leftNodes) { tmpNode = parentClone.cloneNode(false); tmpNode.appendChild(leftNodes); leftNodes = tmpNode; tmpNode = parentClone.cloneNode(false); tmpNode.appendChild(rightNodes); rightNodes = tmpNode; } else { leftNodes = parentClone.cloneNode(false); rightNodes = leftNodes.cloneNode(false); } while (tmpNode = clone.previousSibling) { leftNodes.insertBefore(tmpNode, leftNodes.firstChild); } while (tmpNode = clone.nextSibling) { rightNodes.appendChild(tmpNode); } clone = parentClone; } while (parent !== parentClone); tmpNode = parent.parentNode; tmpNode.insertBefore(leftNodes, parent); tmpNode.insertBefore(rightNodes, parent); tmpNode.insertBefore(node, rightNodes); domUtils.remove(parent); return node; }, /** * 检查节点node是否是空inline节点 * @method isEmptyInlineElement * @param { Node } node 需要检测的节点对象 * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 * @example * ```html * => 1 * => 1 * => 1 * xx => 0 * ``` */ isEmptyInlineElement:function (node) { if (node.nodeType != 1 || !dtd.$removeEmpty[ node.tagName ]) { return 0; } node = node.firstChild; while (node) { //如果是创建的bookmark就跳过 if (domUtils.isBookmarkNode(node)) { return 0; } if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) || node.nodeType == 3 && !domUtils.isWhitespace(node) ) { return 0; } node = node.nextSibling; } return 1; }, /** * 删除node节点下首尾两端的空白文本子节点 * @method trimWhiteTextNode * @param { Element } node 需要执行删除操作的元素对象 * @example * ```javascript * var node = document.createElement("div"); * * node.appendChild( document.createTextNode( "" ) ); * * node.appendChild( document.createElement("div") ); * * node.appendChild( document.createTextNode( "" ) ); * * //3 * console.log( node.childNodes.length ); * * UE.dom.domUtils.trimWhiteTextNode( node ); * * //1 * console.log( node.childNodes.length ); * ``` */ trimWhiteTextNode:function (node) { function remove(dir) { var child; while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) { node.removeChild(child); } } remove('firstChild'); remove('lastChild'); }, /** * 合并node节点下相同的子节点 * @name mergeChild * @desc * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 * @example *

            xxaaxx

            * ==> UE.dom.domUtils.mergeChild(node,'span') *

            xxaaxx

            */ mergeChild:function (node, tagName, attrs) { var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); for (var i = 0, ci; ci = list[i++];) { if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { continue; } //span单独处理 if (ci.tagName.toLowerCase() == 'span') { if (node === ci.parentNode) { domUtils.trimWhiteTextNode(node); if (node.childNodes.length == 1) { node.style.cssText = ci.style.cssText + ";" + node.style.cssText; domUtils.remove(ci, true); continue; } } ci.style.cssText = node.style.cssText + ';' + ci.style.cssText; if (attrs) { var style = attrs.style; if (style) { style = style.split(';'); for (var j = 0, s; s = style[j++];) { ci.style[utils.cssStyleToDomStyle(s.split(':')[0])] = s.split(':')[1]; } } } if (domUtils.isSameStyle(ci, node)) { domUtils.remove(ci, true); } continue; } if (domUtils.isSameElement(node, ci)) { domUtils.remove(ci, true); } } }, /** * 原生方法getElementsByTagName的封装 * @method getElementsByTagName * @param { Node } node 目标节点对象 * @param { String } tagName 需要查找的节点的tagName, 多个tagName以空格分割 * @return { Array } 符合条件的节点集合 */ getElementsByTagName:function (node, name,filter) { if(filter && utils.isString(filter)){ var className = filter; filter = function(node){return domUtils.hasClass(node,className)} } name = utils.trim(name).replace(/[ ]{2,}/g,' ').split(' '); var arr = []; for(var n = 0,ni;ni=name[n++];){ var list = node.getElementsByTagName(ni); for (var i = 0, ci; ci = list[i++];) { if(!filter || filter(ci)) arr.push(ci); } } return arr; }, /** * 将节点node提取到父节点上 * @method mergeToParent * @param { Element } node 需要提取的元素对象 * @example * ```html *
            *
            * *
            *
            * * * ``` */ mergeToParent:function (node) { var parent = node.parentNode; while (parent && dtd.$removeEmpty[parent.tagName]) { if (parent.tagName == node.tagName || parent.tagName == 'A') {//针对a标签单独处理 domUtils.trimWhiteTextNode(parent); //span需要特殊处理 不处理这样的情况 xxxxxxxxx if (parent.tagName == 'SPAN' && !domUtils.isSameStyle(parent, node) || (parent.tagName == 'A' && node.tagName == 'SPAN')) { if (parent.childNodes.length > 1 || parent !== node.parentNode) { node.style.cssText = parent.style.cssText + ";" + node.style.cssText; parent = parent.parentNode; continue; } else { parent.style.cssText += ";" + node.style.cssText; //trace:952 a标签要保持下划线 if (parent.tagName == 'A') { parent.style.textDecoration = 'underline'; } } } if (parent.tagName != 'A') { parent === node.parentNode && domUtils.remove(node, true); break; } } parent = parent.parentNode; } }, /** * 合并节点node的左右兄弟节点 * @method mergeSibling * @param { Element } node 需要合并的目标节点 * @example * ```html * xxxxoooxxxx * * * ``` */ /** * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 * @method mergeSibling * @param { Element } node 需要合并的目标节点 * @param { Boolean } ignorePre 是否忽略合并左节点 * @example * ```html * xxxxoooxxxx * * * ``` */ /** * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 * @method mergeSibling * @param { Element } node 需要合并的目标节点 * @param { Boolean } ignorePre 是否忽略合并左节点 * @param { Boolean } ignoreNext 是否忽略合并右节点 * @remind 如果同时忽略左右节点, 则该操作什么也不会做 * @example * ```html * xxxxoooxxxx * * * ``` */ mergeSibling:function (node, ignorePre, ignoreNext) { function merge(rtl, start, node) { var next; if ((next = node[rtl]) && !domUtils.isBookmarkNode(next) && next.nodeType == 1 && domUtils.isSameElement(node, next)) { while (next.firstChild) { if (start == 'firstChild') { node.insertBefore(next.lastChild, node.firstChild); } else { node.appendChild(next.firstChild); } } domUtils.remove(next); } } !ignorePre && merge('previousSibling', 'firstChild', node); !ignoreNext && merge('nextSibling', 'lastChild', node); }, /** * 设置节点node及其子节点不会被选中 * @method unSelectable * @param { Element } node 需要执行操作的dom元素 * @remind 执行该操作后的节点, 将不能被鼠标选中 * @example * ```javascript * UE.dom.domUtils.unSelectable( document.body ); * ``` */ unSelectable:ie && browser.ie9below || browser.opera ? function (node) { //for ie9 node.onselectstart = function () { return false; }; node.onclick = node.onkeyup = node.onkeydown = function () { return false; }; node.unselectable = 'on'; node.setAttribute("unselectable", "on"); for (var i = 0, ci; ci = node.all[i++];) { switch (ci.tagName.toLowerCase()) { case 'iframe' : case 'textarea' : case 'input' : case 'select' : break; default : ci.unselectable = 'on'; node.setAttribute("unselectable", "on"); } } } : function (node) { node.style.MozUserSelect = node.style.webkitUserSelect = node.style.msUserSelect = node.style.KhtmlUserSelect = 'none'; }, /** * 删除节点node上的指定属性名称的属性 * @method removeAttributes * @param { Node } node 需要删除属性的节点对象 * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 * @example * ```html *
            * xxxxx *
            * * * ``` */ /** * 删除节点node上的指定属性名称的属性 * @method removeAttributes * @param { Node } node 需要删除属性的节点对象 * @param { Array } attrNames 需要删除的属性名数组 * @example * ```html *
            * xxxxx *
            * * * ``` */ removeAttributes:function (node, attrNames) { attrNames = utils.isArray(attrNames) ? attrNames : utils.trim(attrNames).replace(/[ ]{2,}/g,' ').split(' '); for (var i = 0, ci; ci = attrNames[i++];) { ci = attrFix[ci] || ci; switch (ci) { case 'className': node[ci] = ''; break; case 'style': node.style.cssText = ''; var val = node.getAttributeNode('style'); !browser.ie && val && node.removeAttributeNode(val); } node.removeAttribute(ci); } }, /** * 在doc下创建一个标签名为tag,属性为attrs的元素 * @method createElement * @param { DomDocument } doc 新创建的元素属于该document节点创建 * @param { String } tagName 需要创建的元素的标签名 * @param { Object } attrs 新创建的元素的属性key-value集合 * @return { Element } 新创建的元素对象 * @example * ```javascript * var ele = UE.dom.domUtils.createElement( document, 'div', { * id: 'test' * } ); * * //output: DIV * console.log( ele.tagName ); * * //output: test * console.log( ele.id ); * * ``` */ createElement:function (doc, tag, attrs) { return domUtils.setAttributes(doc.createElement(tag), attrs) }, /** * 为节点node添加属性attrs,attrs为属性键值对 * @method setAttributes * @param { Element } node 需要设置属性的元素对象 * @param { Object } attrs 需要设置的属性名-值对 * @return { Element } 设置属性的元素对象 * @example * ```html * * * * */ setAttributes:function (node, attrs) { for (var attr in attrs) { if(attrs.hasOwnProperty(attr)){ var value = attrs[attr]; switch (attr) { case 'class': //ie下要这样赋值,setAttribute不起作用 node.className = value; break; case 'style' : node.style.cssText = node.style.cssText + ";" + value; break; case 'innerHTML': node[attr] = value; break; case 'value': node.value = value; break; default: node.setAttribute(attrFix[attr] || attr, value); } } } return node; }, /** * 获取元素element经过计算后的样式值 * @method getComputedStyle * @param { Element } element 需要获取样式的元素对象 * @param { String } styleName 需要获取的样式名 * @return { String } 获取到的样式值 * @example * ```html * * * * * * ``` */ getComputedStyle:function (element, styleName) { //一下的属性单独处理 var pros = 'width height top left'; if(pros.indexOf(styleName) > -1){ return element['offset' + styleName.replace(/^\w/,function(s){return s.toUpperCase()})] + 'px'; } //忽略文本节点 if (element.nodeType == 3) { element = element.parentNode; } //ie下font-size若body下定义了font-size,则从currentStyle里会取到这个font-size. 取不到实际值,故此修改. if (browser.ie && browser.version < 9 && styleName == 'font-size' && !element.style.fontSize && !dtd.$empty[element.tagName] && !dtd.$nonChild[element.tagName]) { var span = element.ownerDocument.createElement('span'); span.style.cssText = 'padding:0;border:0;font-family:simsun;'; span.innerHTML = '.'; element.appendChild(span); var result = span.offsetHeight; element.removeChild(span); span = null; return result + 'px'; } try { var value = domUtils.getStyle(element, styleName) || (window.getComputedStyle ? domUtils.getWindow(element).getComputedStyle(element, '').getPropertyValue(styleName) : ( element.currentStyle || element.style )[utils.cssStyleToDomStyle(styleName)]); } catch (e) { return ""; } return utils.transUnitToPx(utils.fixColor(styleName, value)); }, /** * 删除元素element指定的className * @method removeClasses * @param { Element } ele 需要删除class的元素节点 * @param { String } classNames 需要删除的className, 多个className之间以空格分开 * @example * ```html * xxx * * * ``` */ /** * 删除元素element指定的className * @method removeClasses * @param { Element } ele 需要删除class的元素节点 * @param { Array } classNames 需要删除的className数组 * @example * ```html * xxx * * * ``` */ removeClasses:function (elm, classNames) { classNames = utils.isArray(classNames) ? classNames : utils.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') } cls = utils.trim(cls).replace(/[ ]{2,}/g,' '); if(cls){ elm.className = cls; }else{ domUtils.removeAttributes(elm,['class']); } }, /** * 给元素element添加className * @method addClass * @param { Node } ele 需要增加className的元素 * @param { String } classNames 需要添加的className, 多个className之间以空格分割 * @remind 相同的类名不会被重复添加 * @example * ```html * * * * ``` */ /** * 判断元素element是否包含给定的样式类名className * @method hasClass * @param { Node } ele 需要检测的元素 * @param { Array } classNames 需要检测的className数组 * @return { Boolean } 元素是否包含所有给定的className * @example * ```html * * * * ``` */ hasClass:function (element, className) { if(utils.isRegExp(className)){ return className.test(element.className) } className = utils.trim(className).replace(/[ ]{2,}/g,' ').split(' '); for(var i = 0,ci,cls = element.className;ci=className[i++];){ if(!new RegExp('\\b' + ci + '\\b','i').test(cls)){ return false; } } return i - 1 == className.length; }, /** * 阻止事件默认行为 * @method preventDefault * @param { Event } evt 需要阻止默认行为的事件对象 * @example * ```javascript * UE.dom.domUtils.preventDefault( evt ); * ``` */ preventDefault:function (evt) { evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); }, /** * 删除元素element指定的样式 * @method removeStyle * @param { Element } element 需要删除样式的元素 * @param { String } styleName 需要删除的样式名 * @example * ```html * * * * ``` */ removeStyle:function (element, name) { if(browser.ie ){ //针对color先单独处理一下 if(name == 'color'){ name = '(^|;)' + name; } element.style.cssText = element.style.cssText.replace(new RegExp(name + '[^:]*:[^;]+;?','ig'),'') }else{ if (element.style.removeProperty) { element.style.removeProperty (name); }else { element.style.removeAttribute (utils.cssStyleToDomStyle(name)); } } if (!element.style.cssText) { domUtils.removeAttributes(element, ['style']); } }, /** * 获取元素element的style属性的指定值 * @method getStyle * @param { Element } element 需要获取属性值的元素 * @param { String } styleName 需要获取的style的名称 * @warning 该方法仅获取元素style属性中所标明的值 * @return { String } 该元素包含指定的style属性值 * @example * ```html *
            * * * ``` */ getStyle:function (element, name) { var value = element.style[ utils.cssStyleToDomStyle(name) ]; return utils.fixColor(name, value); }, /** * 为元素element设置样式属性值 * @method setStyle * @param { Element } element 需要设置样式的元素 * @param { String } styleName 样式名 * @param { String } styleValue 样式值 * @example * ```html *
            * * * ``` */ setStyle:function (element, name, value) { element.style[utils.cssStyleToDomStyle(name)] = value; if(!utils.trim(element.style.cssText)){ this.removeAttributes(element,'style') } }, /** * 为元素element设置多个样式属性值 * @method setStyles * @param { Element } element 需要设置样式的元素 * @param { Object } styles 样式名值对 * @example * ```html *
            * * * ``` */ setStyles:function (element, styles) { for (var name in styles) { if (styles.hasOwnProperty(name)) { domUtils.setStyle(element, name, styles[name]); } } }, /** * 删除_moz_dirty属性 * @private * @method removeDirtyAttr */ removeDirtyAttr:function (node) { for (var i = 0, ci, nodes = node.getElementsByTagName('*'); ci = nodes[i++];) { ci.removeAttribute('_moz_dirty'); } node.removeAttribute('_moz_dirty'); }, /** * 获取子节点的数量 * @method getChildCount * @param { Element } node 需要检测的元素 * @return { Number } 给定的node元素的子节点数量 * @example * ```html *
            * *
            * * * ``` */ /** * 根据给定的过滤规则, 获取符合条件的子节点的数量 * @method getChildCount * @param { Element } node 需要检测的元素 * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false * @return { Number } 符合过滤条件的node元素的子节点数量 * @example * ```html *
            * *
            * * * ``` */ getChildCount:function (node, fn) { var count = 0, first = node.firstChild; fn = fn || function () { return 1; }; while (first) { if (fn(first)) { count++; } first = first.nextSibling; } return count; }, /** * 判断给定节点是否为空节点 * @method isEmptyNode * @param { Node } node 需要检测的节点对象 * @return { Boolean } 节点是否为空 * @example * ```javascript * UE.dom.domUtils.isEmptyNode( document.body ); * ``` */ isEmptyNode:function (node) { return !node.firstChild || domUtils.getChildCount(node, function (node) { return !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node) }) == 0 }, clearSelectedArr:function (nodes) { var node; while (node = nodes.pop()) { domUtils.removeAttributes(node, ['class']); } }, /** * 将显示区域滚动到指定节点的位置 * @method scrollToView * @param {Node} node 节点 * @param {window} win window对象 * @param {Number} offsetTop 距离上方的偏移量 */ scrollToView:function (node, win, offsetTop) { var getViewPaneSize = function () { var doc = win.document, mode = doc.compatMode == 'CSS1Compat'; return { width:( mode ? doc.documentElement.clientWidth : doc.body.clientWidth ) || 0, height:( mode ? doc.documentElement.clientHeight : doc.body.clientHeight ) || 0 }; }, getScrollPosition = function (win) { if ('pageXOffset' in win) { return { x:win.pageXOffset || 0, y:win.pageYOffset || 0 }; } else { var doc = win.document; return { x:doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, y:doc.documentElement.scrollTop || doc.body.scrollTop || 0 }; } }; var winHeight = getViewPaneSize().height, offset = winHeight * -1 + offsetTop; offset += (node.offsetHeight || 0); var elementPosition = domUtils.getXY(node); offset += elementPosition.y; var currentScroll = getScrollPosition(win).y; // offset += 50; if (offset > currentScroll || offset < currentScroll - winHeight) { win.scrollTo(0, offset + (offset < 0 ? -20 : 20)); } }, /** * 判断给定节点是否为br * @method isBr * @param { Node } node 需要判断的节点对象 * @return { Boolean } 给定的节点是否是br节点 */ isBr:function (node) { return node.nodeType == 1 && node.tagName == 'BR'; }, /** * 判断给定的节点是否是一个“填充”节点 * @private * @method isFillChar * @param { Node } node 需要判断的节点 * @param { Boolean } isInStart 是否从节点内容的开始位置匹配 * @returns { Boolean } 节点是否是填充节点 */ isFillChar:function (node,isInStart) { if(node.nodeType != 3) return false; var text = node.nodeValue; if(isInStart){ return new RegExp('^' + domUtils.fillChar).test(text) } return !text.replace(new RegExp(domUtils.fillChar,'g'), '').length }, isStartInblock:function (range) { var tmpRange = range.cloneRange(), flag = 0, start = tmpRange.startContainer, tmp; if(start.nodeType == 1 && start.childNodes[tmpRange.startOffset]){ start = start.childNodes[tmpRange.startOffset]; var pre = start.previousSibling; while(pre && domUtils.isFillChar(pre)){ start = pre; pre = pre.previousSibling; } } if(this.isFillChar(start,true) && tmpRange.startOffset == 1){ tmpRange.setStartBefore(start); start = tmpRange.startContainer; } while (start && domUtils.isFillChar(start)) { tmp = start; start = start.previousSibling } if (tmp) { tmpRange.setStartBefore(tmp); start = tmpRange.startContainer; } if (start.nodeType == 1 && domUtils.isEmptyNode(start) && tmpRange.startOffset == 1) { tmpRange.setStart(start, 0).collapse(true); } while (!tmpRange.startOffset) { start = tmpRange.startContainer; if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { flag = 1; break; } var pre = tmpRange.startContainer.previousSibling, tmpNode; if (!pre) { tmpRange.setStartBefore(tmpRange.startContainer); } else { while (pre && domUtils.isFillChar(pre)) { tmpNode = pre; pre = pre.previousSibling; } if (tmpNode) { tmpRange.setStartBefore(tmpNode); } else { tmpRange.setStartBefore(tmpRange.startContainer); } } } return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; }, /** * 判断给定的元素是否是一个空元素 * @method isEmptyBlock * @param { Element } node 需要判断的元素 * @return { Boolean } 是否是空元素 * @example * ```html *
            * * * ``` */ /** * 根据指定的判断规则判断给定的元素是否是一个空元素 * @method isEmptyBlock * @param { Element } node 需要判断的元素 * @param { RegExp } reg 对内容执行判断的正则表达式对象 * @return { Boolean } 是否是空元素 */ isEmptyBlock:function (node,reg) { if(node.nodeType != 1) return 0; reg = reg || new RegExp('[ \xa0\t\r\n' + domUtils.fillChar + ']', 'g'); if (node[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').length > 0) { return 0; } for (var n in dtd.$isNotEmpty) { if (node.getElementsByTagName(n).length) { return 0; } } return 1; }, /** * 移动元素使得该元素的位置移动指定的偏移量的距离 * @method setViewportOffset * @param { Element } element 需要设置偏移量的元素 * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 * offset.top的距离 * @example * ```html *
            * * * ``` */ setViewportOffset:function (element, offset) { var left = parseInt(element.style.left) | 0; var top = parseInt(element.style.top) | 0; var rect = element.getBoundingClientRect(); var offsetLeft = offset.left - rect.left; var offsetTop = offset.top - rect.top; if (offsetLeft) { element.style.left = left + offsetLeft + 'px'; } if (offsetTop) { element.style.top = top + offsetTop + 'px'; } }, /** * 用“填充字符”填充节点 * @method fillNode * @private * @param { DomDocument } doc 填充的节点所在的docment对象 * @param { Node } node 需要填充的节点对象 * @example * ```html *
            * * * ``` */ fillNode:function (doc, node) { var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement('br'); node.innerHTML = ''; node.appendChild(tmpNode); }, /** * 把节点src的所有子节点追加到另一个节点tag上去 * @method moveChild * @param { Node } src 源节点, 该节点下的所有子节点将被移除 * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 * @example * ```html *
            * *
            *
            *
            *
            * * * ``` */ /** * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” * @method moveChild * @param { Node } src 源节点, 该节点下的所有子节点将被移除 * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 * @example * ```html *
            * *
            *
            *
            *
            * * * ``` */ moveChild:function (src, tag, dir) { while (src.firstChild) { if (dir && tag.firstChild) { tag.insertBefore(src.lastChild, tag.firstChild); } else { tag.appendChild(src.firstChild); } } }, /** * 判断节点的标签上是否不存在任何属性 * @method hasNoAttributes * @private * @param { Node } node 需要检测的节点对象 * @return { Boolean } 节点是否不包含任何属性 * @example * ```html *
            xxxx
            * * * ``` */ hasNoAttributes:function (node) { return browser.ie ? /^<\w+\s*?>/.test(node.outerHTML) : node.attributes.length == 0; }, /** * 检测节点是否是UEditor所使用的辅助节点 * @method isCustomeNode * @private * @param { Node } node 需要检测的节点 * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 * @return { Boolean } 给定的节点是否是一个辅助节点 */ isCustomeNode:function (node) { return node.nodeType == 1 && node.getAttribute('_ue_custom_node_'); }, /** * 检测节点的标签是否是给定的标签 * @method isTagNode * @param { Node } node 需要检测的节点对象 * @param { String } tagName 标签 * @return { Boolean } 节点的标签是否是给定的标签 * @example * ```html *
            * * * ``` */ isTagNode:function (node, tagNames) { return node.nodeType == 1 && new RegExp('\\b' + node.tagName + '\\b','i').test(tagNames) }, /** * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 * @method filterNodeList * @param { Array } nodeList 需要过滤的节点数组 * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL * @example * ```javascript * var divNodes = document.getElementsByTagName("div"); * divNodes = [].slice.call( divNodes, 0 ); * * //output: null * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { * return node.tagName.toLowerCase() !== 'div'; * } ) ); * ``` */ /** * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 * @method filterNodeList * @param { Array } nodeList 需要过滤的节点数组 * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL * @example * ```javascript * var divNodes = document.getElementsByTagName("div"); * divNodes = [].slice.call( divNodes, 0 ); * * //output: null * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); * ``` */ /** * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 * @method filterNodeList * @param { Array } nodeList 需要过滤的节点数组 * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 * 过滤条件的节点数组或第一个节点, 否则返回NULL * @example * ```javascript * var divNodes = document.getElementsByTagName("div"); * divNodes = [].slice.call( divNodes, 0 ); * * //output: 3(假定有3个div) * console.log( divNodes.length ); * * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { * return node.tagName.toLowerCase() === 'div'; * }, true ); * * //output: 3 * console.log( nodes.length ); * * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { * return node.tagName.toLowerCase() === 'div'; * }, false ); * * //output: div * console.log( node.nodeName ); * ``` */ filterNodeList : function(nodelist,filter,forAll){ var results = []; if(!utils .isFunction(filter)){ var str = filter; filter = function(n){ return utils.indexOf(utils.isArray(str) ? str:str.split(' '), n.tagName.toLowerCase()) != -1 }; } utils.each(nodelist,function(n){ filter(n) && results.push(n) }); return results.length == 0 ? null : results.length == 1 || !forAll ? results[0] : results }, /** * 查询给定的range选区是否在给定的node节点内,且在该节点的最末尾 * @method isInNodeEndBoundary * @param { UE.dom.Range } rng 需要判断的range对象, 该对象的startContainer不能为NULL * @param node 需要检测的节点对象 * @return { Number } 如果给定的选取range对象是在node内部的最末端, 则返回1, 否则返回0 */ isInNodeEndBoundary : function (rng,node){ var start = rng.startContainer; if(start.nodeType == 3 && rng.startOffset != start.nodeValue.length){ return 0; } if(start.nodeType == 1 && rng.startOffset != start.childNodes.length){ return 0; } while(start !== node){ if(start.nextSibling){ return 0 }; start = start.parentNode; } return 1; }, isBoundaryNode : function (node,dir){ var tmp; while(!domUtils.isBody(node)){ tmp = node; node = node.parentNode; if(tmp !== node[dir]){ return false; } } return true; }, fillHtml : browser.ie11below ? ' ' : '
            ' }; var fillCharReg = new RegExp(domUtils.fillChar, 'g'); // core/Range.js /** * Range封装 * @file * @module UE.dom * @class Range * @since 1.2.6.1 */ /** * dom操作封装 * @unfile * @module UE.dom */ /** * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 * @unfile * @module UE.dom * @class Range */ (function () { var guid = 0, fillChar = domUtils.fillChar, fillData; /** * 更新range的collapse状态 * @param {Range} range range对象 */ function updateCollapse(range) { range.collapsed = range.startContainer && range.endContainer && range.startContainer === range.endContainer && range.startOffset == range.endOffset; } function selectOneNode(rng){ return !rng.collapsed && rng.startContainer.nodeType == 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset == 1 } function setEndPoint(toStart, node, offset, range) { //如果node是自闭合标签要处理 if (node.nodeType == 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) { offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); node = node.parentNode; } if (toStart) { range.startContainer = node; range.startOffset = offset; if (!range.endContainer) { range.collapse(true); } } else { range.endContainer = node; range.endOffset = offset; if (!range.startContainer) { range.collapse(false); } } updateCollapse(range); return range; } function execContentsAction(range, action) { //调整边界 //range.includeBookmark(); var start = range.startContainer, end = range.endContainer, startOffset = range.startOffset, endOffset = range.endOffset, doc = range.document, frag = doc.createDocumentFragment(), tmpStart, tmpEnd; if (start.nodeType == 1) { start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode(''))); } if (end.nodeType == 1) { end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode(''))); } if (start === end && start.nodeType == 3) { frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset))); //is not clone if (action) { start.deleteData(startOffset, endOffset - startOffset); range.collapse(true); } return frag; } var current, currentLevel, clone = frag, startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true); for (var i = 0; startParents[i] == endParents[i];) { i++; } for (var j = i, si; si = startParents[j]; j++) { current = si.nextSibling; if (si == start) { if (!tmpStart) { if (range.startContainer.nodeType == 3) { clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset))); //is not clone if (action) { start.deleteData(startOffset, start.nodeValue.length - startOffset); } } else { clone.appendChild(!action ? start.cloneNode(true) : start); } } } else { currentLevel = si.cloneNode(false); clone.appendChild(currentLevel); } while (current) { if (current === end || current === endParents[j]) { break; } si = current.nextSibling; clone.appendChild(!action ? current.cloneNode(true) : current); current = si; } clone = currentLevel; } clone = frag; if (!startParents[i]) { clone.appendChild(startParents[i - 1].cloneNode(false)); clone = clone.firstChild; } for (var j = i, ei; ei = endParents[j]; j++) { current = ei.previousSibling; if (ei == end) { if (!tmpEnd && range.endContainer.nodeType == 3) { clone.appendChild(doc.createTextNode(end.substringData(0, endOffset))); //is not clone if (action) { end.deleteData(0, endOffset); } } } else { currentLevel = ei.cloneNode(false); clone.appendChild(currentLevel); } //如果两端同级,右边第一次已经被开始做了 if (j != i || !startParents[i]) { while (current) { if (current === start) { break; } ei = current.previousSibling; clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild); current = ei; } } clone = currentLevel; } if (action) { range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true); } tmpStart && domUtils.remove(tmpStart); tmpEnd && domUtils.remove(tmpEnd); return frag; } /** * 创建一个跟document绑定的空的Range实例 * @constructor * @param { Document } document 新建的选区所属的文档对象 */ /** * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点 */ /** * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点, * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 */ /** * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点 */ /** * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点, * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 */ /** * @property { Boolean } collapsed 当前Range是否闭合 * @default true * @remind Range是闭合的时候, startContainer === endContainer && startOffset === endOffset */ /** * @property { Document } document 当前Range所属的Document对象 * @remind 不同range的的document属性可以是不同的 */ var Range = dom.Range = function (document) { var me = this; me.startContainer = me.startOffset = me.endContainer = me.endOffset = null; me.document = document; me.collapsed = true; }; /** * 删除fillData * @param doc * @param excludeNode */ function removeFillData(doc, excludeNode) { try { if (fillData && domUtils.inDoc(fillData, doc)) { if (!fillData.nodeValue.replace(fillCharReg, '').length) { var tmpNode = fillData.parentNode; domUtils.remove(fillData); while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) && //safari的contains有bug (browser.safari ? !(domUtils.getPosition(tmpNode,excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode)) ) { fillData = tmpNode.parentNode; domUtils.remove(tmpNode); tmpNode = fillData; } } else { fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ''); } } } catch (e) { } } /** * @param node * @param dir */ function mergeSibling(node, dir) { var tmpNode; node = node[dir]; while (node && domUtils.isFillChar(node)) { tmpNode = node[dir]; domUtils.remove(node); node = tmpNode; } } Range.prototype = { /** * 克隆选区的内容到一个DocumentFragment里 * @method cloneContents * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 * @example * ```html * * * xx[xxx]x * * * * ``` */ cloneContents:function () { return this.collapsed ? null : execContentsAction(this, 0); }, /** * 删除当前选区范围中的所有内容 * @method deleteContents * @remind 执行完该操作后, 当前Range对象变成了闭合状态 * @return { UE.dom.Range } 当前操作的Range对象 * @example * ```html * * * xx[xxx]x * * * * ``` */ deleteContents:function () { var txt; if (!this.collapsed) { execContentsAction(this, 1); } if (browser.webkit) { txt = this.startContainer; if (txt.nodeType == 3 && !txt.nodeValue.length) { this.setStartBefore(txt).collapse(true); domUtils.remove(txt); } } return this; }, /** * 将当前选区的内容提取到一个DocumentFragment里 * @method extractContents * @remind 执行该操作后, 选区将变成闭合状态 * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 * @example * ```html * * * xx[xxx]x * * * */ extractContents:function () { return this.collapsed ? null : execContentsAction(this, 2); }, /** * 设置Range的开始容器节点和偏移量 * @method setStart * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 * 中的索引 * @param { Node } node 将被设为当前选区开始边界容器的节点对象 * @param { int } offset 选区的开始位置偏移量 * @return { UE.dom.Range } 当前range对象 * @example * ```html * * xxxxxxxxxxxxx[xxx] * * * ``` * @example * ```html * * xxx[xx]x * * * ``` */ setStart:function (node, offset) { return setEndPoint(true, node, offset, this); }, /** * 设置Range的结束容器和偏移量 * @method setEnd * @param { Node } node 作为当前选区结束边界容器的节点对象 * @param { int } offset 结束边界的偏移量 * @see UE.dom.Range:setStart(Node,int) * @return { UE.dom.Range } 当前range对象 */ setEnd:function (node, offset) { return setEndPoint(false, node, offset, this); }, /** * 将Range开始位置设置到node节点之后 * @method setStartAfter * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 * @param { Node } node 选区的开始边界将紧接着该节点之后 * @return { UE.dom.Range } 当前range对象 * @example * ```html * * xxxxxxx[xxxx] * * * ``` */ setStartAfter:function (node) { return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); }, /** * 将Range开始位置设置到node节点之前 * @method setStartBefore * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 * @param { Node } node 新的选区开始位置在该节点之前 * @see UE.dom.Range:setStartAfter(Node) * @return { UE.dom.Range } 当前range对象 */ setStartBefore:function (node) { return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); }, /** * 将Range结束位置设置到node节点之后 * @method setEndAfter * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 * @param { Node } node 目标节点 * @see UE.dom.Range:setStartAfter(Node) * @return { UE.dom.Range } 当前range对象 * @example * ```html * * [xxxxxxx]xxxx * * * ``` */ setEndAfter:function (node) { return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); }, /** * 将Range结束位置设置到node节点之前 * @method setEndBefore * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 * @param { Node } node 目标节点 * @see UE.dom.Range:setEndAfter(Node) * @return { UE.dom.Range } 当前range对象 */ setEndBefore:function (node) { return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); }, /** * 设置Range的开始位置到node节点内的第一个子节点之前 * @method setStartAtFirst * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 * @param { Node } node 目标节点 * @see UE.dom.Range:setStartBefore(Node) * @return { UE.dom.Range } 当前range对象 * @example * ```html * * xxxxx[xx]xxxx * * * ``` */ setStartAtFirst:function (node) { return this.setStart(node, 0); }, /** * 设置Range的开始位置到node节点内的最后一个节点之后 * @method setStartAtLast * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 * @param { Node } node 目标节点 * @see UE.dom.Range:setStartAtFirst(Node) * @return { UE.dom.Range } 当前range对象 */ setStartAtLast:function (node) { return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); }, /** * 设置Range的结束位置到node节点内的第一个节点之前 * @method setEndAtFirst * @param { Node } node 目标节点 * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 * @see UE.dom.Range:setStartAtFirst(Node) * @return { UE.dom.Range } 当前range对象 */ setEndAtFirst:function (node) { return this.setEnd(node, 0); }, /** * 设置Range的结束位置到node节点内的最后一个节点之后 * @method setEndAtLast * @param { Node } node 目标节点 * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 * @see UE.dom.Range:setStartAtFirst(Node) * @return { UE.dom.Range } 当前range对象 */ setEndAtLast:function (node) { return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); }, /** * 选中给定节点 * @method selectNode * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, * 而endOffset为startOffset+1 * @param { Node } node 需要选中的节点 * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 * @example * ```html * * xxxxx[xx]xxxx * * * ``` */ selectNode:function (node) { return this.setStartBefore(node).setEndAfter(node); }, /** * 选中给定节点内部的所有节点 * @method selectNodeContents * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, * 而endOffset是该节点的子节点数。 * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 * @example * ```html * * xxxxx[xx]xxxx * * * ``` */ selectNodeContents:function (node) { return this.setStart(node, 0).setEndAtLast(node); }, /** * clone当前Range对象 * @method cloneRange * @remind 返回的range是一个全新的range对象, 其内部所有属性与当前被clone的range相同。 * @return { UE.dom.Range } 当前range对象的一个副本 */ cloneRange:function () { var me = this; return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset); }, /** * 向当前选区的结束处闭合选区 * @method collapse * @return { UE.dom.Range } 当前range对象 * @example * ```html * * xxxxx[xx]xxxx * * * ``` */ /** * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 * @method collapse * @param { Boolean } toStart 是否向选区开始处闭合 * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 * @see UE.dom.Range:collapse() * @example * ```html * * xxxxx[xx]xxxx * * * ``` */ collapse:function (toStart) { var me = this; if (toStart) { me.endContainer = me.startContainer; me.endOffset = me.startOffset; } else { me.startContainer = me.endContainer; me.startOffset = me.endOffset; } me.collapsed = true; return me; }, /** * 调整range的开始位置和结束位置,使其"收缩"到最小的位置 * @method shrinkBoundary * @return { UE.dom.Range } 当前range对象 * @example * ```html * xxxx[xxxxx] => xxxx[xxxxx] * ``` * * @example * ```html * * x[xx]xxx * * * ``` * * @example * ```html * [xxxxxxxxxxx] => [xxxxxxxxxxx] * ``` */ /** * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, * 如果ignoreEnd的值为true,则忽略对结束位置的调整 * @method shrinkBoundary * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 * @return { UE.dom.Range } 当前range对象 * @see UE.dom.domUtils.Range:shrinkBoundary() */ shrinkBoundary:function (ignoreEnd) { var me = this, child, collapsed = me.collapsed; function check(node){ return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName] } while (me.startContainer.nodeType == 1 //是element && (child = me.startContainer.childNodes[me.startOffset]) //子节点也是element && check(child)) { me.setStart(child, 0); } if (collapsed) { return me.collapse(true); } if (!ignoreEnd) { while (me.endContainer.nodeType == 1//是element && me.endOffset > 0 //如果是空元素就退出 endOffset=0那么endOffst-1为负值,childNodes[endOffset]报错 && (child = me.endContainer.childNodes[me.endOffset - 1]) //子节点也是element && check(child)) { me.setEnd(child, child.childNodes.length); } } return me; }, /** * 获取离当前选区内包含的所有节点最近的公共祖先节点, * @method getCommonAncestor * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 * @return { Node } 当前range对象内所有节点的公共祖先节点 * @example * ```html * //选区示例 * xxxx[xxx]xxxxxx * * ``` */ /** * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 * @method getCommonAncestor * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 * @return { Node } 当前range对象内所有节点的公共祖先节点 * @see UE.dom.Range:getCommonAncestor() * @example * ```html * * * * xxxxxxxxx[xxx]xxxxxxxx * * * * * ``` */ /** * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 * @method getCommonAncestor * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 * @return { Node } 当前range对象内所有节点的公共祖先节点 * @see UE.dom.Range:getCommonAncestor() * @see UE.dom.Range:getCommonAncestor(Boolean) * @example * ```html * * * * xxxxxxxx[x]xxxxxxxxxxx * * * * * ``` */ getCommonAncestor:function (includeSelf, ignoreTextNode) { var me = this, start = me.startContainer, end = me.endContainer; if (start === end) { if (includeSelf && selectOneNode(this)) { start = start.childNodes[me.startOffset]; if(start.nodeType == 1) return start; } //只有在上来就相等的情况下才会出现是文本的情况 return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start; } return domUtils.getCommonAncestor(start, end); }, /** * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上 * @method trimBoundary * @remind 该操作有可能会引起文本节点被切开 * @return { UE.dom.Range } 当前range对象 * @example * ```html * * //选区示例 * xxx[xxxxx]xxx * * * ``` */ /** * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 * @method trimBoundary * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 * @return { UE.dom.Range } 当前range对象 * @example * ```html * * //选区示例 * xxx[xxxxx]xxx * * * ``` */ trimBoundary:function (ignoreEnd) { this.txtToElmBoundary(); var start = this.startContainer, offset = this.startOffset, collapsed = this.collapsed, end = this.endContainer; if (start.nodeType == 3) { if (offset == 0) { this.setStartBefore(start); } else { if (offset >= start.nodeValue.length) { this.setStartAfter(start); } else { var textNode = domUtils.split(start, offset); //跟新结束边界 if (start === end) { this.setEnd(textNode, this.endOffset - offset); } else if (start.parentNode === end) { this.endOffset += 1; } this.setStartBefore(textNode); } } if (collapsed) { return this.collapse(true); } } if (!ignoreEnd) { offset = this.endOffset; end = this.endContainer; if (end.nodeType == 3) { if (offset == 0) { this.setEndBefore(end); } else { offset < end.nodeValue.length && domUtils.split(end, offset); this.setEndAfter(end); } } } return this; }, /** * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则什么也不做 * @method txtToElmBoundary * @remind 该操作不会修改dom节点 * @return { UE.dom.Range } 当前range对象 */ /** * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则根据参数项 * ignoreCollapsed 的值决定是否执行该调整 * @method txtToElmBoundary * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 * @return { UE.dom.Range } 当前range对象 */ txtToElmBoundary:function (ignoreCollapsed) { function adjust(r, c) { var container = r[c + 'Container'], offset = r[c + 'Offset']; if (container.nodeType == 3) { if (!offset) { r['set' + c.replace(/(\w)/, function (a) { return a.toUpperCase(); }) + 'Before'](container); } else if (offset >= container.nodeValue.length) { r['set' + c.replace(/(\w)/, function (a) { return a.toUpperCase(); }) + 'After' ](container); } } } if (ignoreCollapsed || !this.collapsed) { adjust(this, 'start'); adjust(this, 'end'); } return this; }, /** * 在当前选区的开始位置前插入节点,新插入的节点会被该range包含 * @method insertNode * @param { Node } node 需要插入的节点 * @remind 插入的节点可以是一个DocumentFragment依次插入多个节点 * @return { UE.dom.Range } 当前range对象 */ insertNode:function (node) { var first = node, length = 1; if (node.nodeType == 11) { first = node.firstChild; length = node.childNodes.length; } this.trimBoundary(true); var start = this.startContainer, offset = this.startOffset; var nextNode = start.childNodes[ offset ]; if (nextNode) { start.insertBefore(node, nextNode); } else { start.appendChild(node); } if (first.parentNode === this.endContainer) { this.endOffset = this.endOffset + length; } return this.setStartBefore(first); }, /** * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 * @method setCursor * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:collapse() */ /** * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 * @method setCursor * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, * 反之,则向开始容器方向闭合 * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:collapse(Boolean) */ setCursor:function (toEnd, noFillData) { return this.collapse(!toEnd).select(noFillData); }, /** * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 * @method createBookmark * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 * 返回标记位置的ID, 反之则返回标记位置节点的引用 * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, * end => 结束标记的ID或引用, id => 当前标记的类型, 如果为true,则表示 * 返回的记录的类型为ID, 反之则为引用 */ createBookmark:function (serialize, same) { var endNode, startNode = this.document.createElement('span'); startNode.style.cssText = 'display:none;line-height:0px;'; startNode.appendChild(this.document.createTextNode('\u200D')); startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++); if (!this.collapsed) { endNode = startNode.cloneNode(true); endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++); } this.insertNode(startNode); if (endNode) { this.collapse().insertNode(endNode).setEndBefore(endNode); } this.setStartAfter(startNode); return { start:serialize ? startNode.id : startNode, end:endNode ? serialize ? endNode.id : endNode : null, id:serialize } }, /** * 调整当前range的边界到书签位置,并删除该书签对象所标记的位置内的节点 * @method moveToBookmark * @param { BookMark } bookmark createBookmark所创建的标签对象 * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:createBookmark(Boolean) */ moveToBookmark:function (bookmark) { var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start, end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end; this.setStartBefore(start); domUtils.remove(start); if (end) { this.setEndBefore(end); domUtils.remove(end); } else { this.collapse(true); } return this; }, /** * 调整range的边界,使其"放大"到最近的父节点 * @method enlarge * @remind 会引起选区的变化 * @return { UE.dom.Range } 当前range对象 */ /** * 调整range的边界,使其"放大"到最近的父节点,根据参数 toBlock 的取值, 可以 * 要求扩大之后的父节点是block节点 * @method enlarge * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点 * @return { UE.dom.Range } 当前range对象 */ enlarge:function (toBlock, stopFn) { var isBody = domUtils.isBody, pre, node, tmp = this.document.createTextNode(''); if (toBlock) { node = this.startContainer; if (node.nodeType == 1) { if (node.childNodes[this.startOffset]) { pre = node = node.childNodes[this.startOffset] } else { node.appendChild(tmp); pre = node = tmp; } } else { pre = node; } while (1) { if (domUtils.isBlockElm(node)) { node = pre; while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { node = pre; } this.setStartBefore(node); break; } pre = node; node = node.parentNode; } node = this.endContainer; if (node.nodeType == 1) { if (pre = node.childNodes[this.endOffset]) { node.insertBefore(tmp, pre); } else { node.appendChild(tmp); } pre = node = tmp; } else { pre = node; } while (1) { if (domUtils.isBlockElm(node)) { node = pre; while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { node = pre; } this.setEndAfter(node); break; } pre = node; node = node.parentNode; } if (tmp.parentNode === this.endContainer) { this.endOffset--; } domUtils.remove(tmp); } // 扩展边界到最大 if (!this.collapsed) { while (this.startOffset == 0) { if (stopFn && stopFn(this.startContainer)) { break; } if (isBody(this.startContainer)) { break; } this.setStartBefore(this.startContainer); } while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) { if (stopFn && stopFn(this.endContainer)) { break; } if (isBody(this.endContainer)) { break; } this.setEndAfter(this.endContainer); } } return this; }, enlargeToBlockElm:function(ignoreEnd){ while(!domUtils.isBlockElm(this.startContainer)){ this.setStartBefore(this.startContainer); } if(!ignoreEnd){ while(!domUtils.isBlockElm(this.endContainer)){ this.setEndAfter(this.endContainer); } } return this; }, /** * 调整Range的边界,使其"缩小"到最合适的位置 * @method adjustmentBoundary * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:shrinkBoundary() */ adjustmentBoundary:function () { if (!this.collapsed) { while (!domUtils.isBody(this.startContainer) && this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length && this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length ) { this.setStartAfter(this.startContainer); } while (!domUtils.isBody(this.endContainer) && !this.endOffset && this.endContainer[this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length ) { this.setEndBefore(this.endContainer); } } return this; }, /** * 给range选区中的内容添加给定的inline标签 * @method applyInlineStyle * @param { String } tagName 需要添加的标签名 * @example * ```html *

            xxxx[xxxx]x

            ==> range.applyInlineStyle("strong") ==>

            xxxx[xxxx]x

            * ``` */ /** * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 * @method applyInlineStyle * @param { String } tagName 需要添加的标签名 * @param { Object } attrs 跟随新添加的标签的属性 * @return { UE.dom.Range } 当前选区 * @example * ```html *

            xxxx[xxxx]x

            * * ==> * * * range.applyInlineStyle("strong",{"style":"font-size:12px"}) * * ==> * *

            xxxx[xxxx]x

            * ``` */ applyInlineStyle:function (tagName, attrs, list) { if (this.collapsed)return this; this.trimBoundary().enlarge(false, function (node) { return node.nodeType == 1 && domUtils.isBlockElm(node) }).adjustmentBoundary(); var bookmark = this.createBookmark(), end = bookmark.end, filterFn = function (node) { return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); }, current = domUtils.getNextDomNode(bookmark.start, false, filterFn), node, pre, range = this.cloneRange(); while (current && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { if (current.nodeType == 3 || dtd[tagName][current.tagName]) { range.setStartBefore(current); node = current; while (node && (node.nodeType == 3 || dtd[tagName][node.tagName]) && node !== end) { pre = node; node = domUtils.getNextDomNode(node, node.nodeType == 1, null, function (parent) { return dtd[tagName][parent.tagName]; }); } var frag = range.setEndAfter(pre).extractContents(), elm; if (list && list.length > 0) { var level, top; top = level = list[0].cloneNode(false); for (var i = 1, ci; ci = list[i++];) { level.appendChild(ci.cloneNode(false)); level = level.firstChild; } elm = level; } else { elm = range.document.createElement(tagName); } if (attrs) { domUtils.setAttributes(elm, attrs); } elm.appendChild(frag); range.insertNode(list ? top : elm); //处理下滑线在a上的情况 var aNode; if (tagName == 'span' && attrs.style && /text\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, 'a', true))) { domUtils.setAttributes(aNode, attrs); domUtils.remove(elm, true); elm = aNode; } else { domUtils.mergeSibling(elm); domUtils.clearEmptySibling(elm); } //去除子节点相同的 domUtils.mergeChild(elm, attrs); current = domUtils.getNextDomNode(elm, false, filterFn); domUtils.mergeToParent(elm); if (node === end) { break; } } else { current = domUtils.getNextDomNode(current, true, filterFn); } } return this.moveToBookmark(bookmark); }, /** * 移除当前选区内指定的inline标签,但保留其中的内容 * @method removeInlineStyle * @param { String } tagName 需要移除的标签名 * @return { UE.dom.Range } 当前的range对象 * @example * ```html * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z * ``` */ /** * 移除当前选区内指定的一组inline标签,但保留其中的内容 * @method removeInlineStyle * @param { Array } tagNameArr 需要移除的标签名的数组 * @return { UE.dom.Range } 当前的range对象 * @see UE.dom.Range:removeInlineStyle(String) */ removeInlineStyle:function (tagNames) { if (this.collapsed)return this; tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; this.shrinkBoundary().adjustmentBoundary(); var start = this.startContainer, end = this.endContainer; while (1) { if (start.nodeType == 1) { if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { break; } if (start.tagName.toLowerCase() == 'body') { start = null; break; } } start = start.parentNode; } while (1) { if (end.nodeType == 1) { if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { break; } if (end.tagName.toLowerCase() == 'body') { end = null; break; } } end = end.parentNode; } var bookmark = this.createBookmark(), frag, tmpRange; if (start) { tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start); frag = tmpRange.extractContents(); tmpRange.insertNode(frag); domUtils.clearEmptySibling(start, true); start.parentNode.insertBefore(bookmark.start, start); } if (end) { tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end); frag = tmpRange.extractContents(); tmpRange.insertNode(frag); domUtils.clearEmptySibling(end, false, true); end.parentNode.insertBefore(bookmark.end, end.nextSibling); } var current = domUtils.getNextDomNode(bookmark.start, false, function (node) { return node.nodeType == 1; }), next; while (current && current !== bookmark.end) { next = domUtils.getNextDomNode(current, true, function (node) { return node.nodeType == 1; }); if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { domUtils.remove(current, true); } current = next; } return this.moveToBookmark(bookmark); }, /** * 获取当前选中的自闭合的节点 * @method getClosedNode * @return { Node | NULL } 如果当前选中的是自闭合节点, 则返回该节点, 否则返回NULL */ getClosedNode:function () { var node; if (!this.collapsed) { var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); if (selectOneNode(range)) { var child = range.startContainer.childNodes[range.startOffset]; if (child && child.nodeType == 1 && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])) { node = child; } } } return node; }, /** * 在页面上高亮range所表示的选区 * @method select * @return { UE.dom.Range } 返回当前Range对象 */ //这里不区分ie9以上,trace:3824 select:browser.ie ? function (noFillData, textRange) { var nativeRange; if (!this.collapsed) this.shrinkBoundary(); var node = this.getClosedNode(); if (node && !textRange) { try { nativeRange = this.document.body.createControlRange(); nativeRange.addElement(node); nativeRange.select(); } catch (e) {} return this; } var bookmark = this.createBookmark(), start = bookmark.start, end; nativeRange = this.document.body.createTextRange(); nativeRange.moveToElementText(start); nativeRange.moveStart('character', 1); if (!this.collapsed) { var nativeRangeEnd = this.document.body.createTextRange(); end = bookmark.end; nativeRangeEnd.moveToElementText(end); nativeRange.setEndPoint('EndToEnd', nativeRangeEnd); } else { if (!noFillData && this.startContainer.nodeType != 3) { //使用|x固定住光标 var tmpText = this.document.createTextNode(fillChar), tmp = this.document.createElement('span'); tmp.appendChild(this.document.createTextNode(fillChar)); start.parentNode.insertBefore(tmp, start); start.parentNode.insertBefore(tmpText, start); //当点b,i,u时,不能清除i上边的b removeFillData(this.document, tmpText); fillData = tmpText; mergeSibling(tmp, 'previousSibling'); mergeSibling(start, 'nextSibling'); nativeRange.moveStart('character', -1); nativeRange.collapse(true); } } this.moveToBookmark(bookmark); tmp && domUtils.remove(tmp); //IE在隐藏状态下不支持range操作,catch一下 try { nativeRange.select(); } catch (e) { } return this; } : function (notInsertFillData) { function checkOffset(rng){ function check(node,offset,dir){ if(node.nodeType == 3 && node.nodeValue.length < offset){ rng[dir + 'Offset'] = node.nodeValue.length } } check(rng.startContainer,rng.startOffset,'start'); check(rng.endContainer,rng.endOffset,'end'); } var win = domUtils.getWindow(this.document), sel = win.getSelection(), txtNode; //FF下关闭自动长高时滚动条在关闭dialog时会跳 //ff下如果不body.focus将不能定位闭合光标到编辑器内 browser.gecko ? this.document.body.focus() : win.focus(); if (sel) { sel.removeAllRanges(); // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断 // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR' if (this.collapsed && !notInsertFillData) { // //opear如果没有节点接着,原生的不能够定位,不能在body的第一级插入空白节点 // if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) { // var tmp = this.document.createTextNode(''); // this.insertNode(tmp).setStart(tmp, 0).collapse(true); // } // //处理光标落在文本节点的情况 //处理以下的情况 //|xxxx //xxxx|xxxx //xxxx| var start = this.startContainer,child = start; if(start.nodeType == 1){ child = start.childNodes[this.startOffset]; } if( !(start.nodeType == 3 && this.startOffset) && (child ? (!child.previousSibling || child.previousSibling.nodeType != 3) : (!start.lastChild || start.lastChild.nodeType != 3) ) ){ txtNode = this.document.createTextNode(fillChar); //跟着前边走 this.insertNode(txtNode); removeFillData(this.document, txtNode); mergeSibling(txtNode, 'previousSibling'); mergeSibling(txtNode, 'nextSibling'); fillData = txtNode; this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true); } } var nativeRange = this.document.createRange(); if(this.collapsed && browser.opera && this.startContainer.nodeType == 1){ var child = this.startContainer.childNodes[this.startOffset]; if(!child){ //往前靠拢 child = this.startContainer.lastChild; if( child && domUtils.isBr(child)){ this.setStartBefore(child).collapse(true); } }else{ //向后靠拢 while(child && domUtils.isBlockElm(child)){ if(child.nodeType == 1 && child.childNodes[0]){ child = child.childNodes[0] }else{ break; } } child && this.setStartBefore(child).collapse(true) } } //是createAddress最后一位算的不准,现在这里进行微调 checkOffset(this); nativeRange.setStart(this.startContainer, this.startOffset); nativeRange.setEnd(this.endContainer, this.endOffset); sel.addRange(nativeRange); } return this; }, /** * 滚动到当前range开始的位置 * @method scrollToView * @param { Window } win 当前range对象所属的window对象 * @return { UE.dom.Range } 当前Range对象 */ /** * 滚动到距离当前range开始位置 offset 的位置处 * @method scrollToView * @param { Window } win 当前range对象所属的window对象 * @param { Number } offset 距离range开始位置处的偏移量, 如果为正数, 则向下偏移, 反之, 则向上偏移 * @return { UE.dom.Range } 当前Range对象 */ scrollToView:function (win, offset) { win = win ? window : domUtils.getWindow(this.document); var me = this, span = me.document.createElement('span'); //trace:717 span.innerHTML = ' '; me.cloneRange().insertNode(span); domUtils.scrollToView(span, win, offset); domUtils.remove(span); return me; }, /** * 判断当前选区内容是否占位符 * @private * @method inFillChar * @return { Boolean } 如果是占位符返回true,否则返回false */ inFillChar : function(){ var start = this.startContainer; if(this.collapsed && start.nodeType == 3 && start.nodeValue.replace(new RegExp('^' + domUtils.fillChar),'').length + 1 == start.nodeValue.length ){ return true; } return false; }, /** * 保存 * @method createAddress * @private * @return { Boolean } 返回开始和结束的位置 * @example * ```html * *

            * aaaa * * * bbbb * * *

            * * * * ``` */ createAddress : function(ignoreEnd,ignoreTxt){ var addr = {},me = this; function getAddress(isStart){ var node = isStart ? me.startContainer : me.endContainer; var parents = domUtils.findParents(node,true,function(node){return !domUtils.isBody(node)}), addrs = []; for(var i = 0,ci;ci = parents[i++];){ addrs.push(domUtils.getNodeIndex(ci,ignoreTxt)); } var firstIndex = 0; if(ignoreTxt){ if(node.nodeType == 3){ var tmpNode = node.previousSibling; while(tmpNode && tmpNode.nodeType == 3){ firstIndex += tmpNode.nodeValue.replace(fillCharReg,'').length; tmpNode = tmpNode.previousSibling; } firstIndex += (isStart ? me.startOffset : me.endOffset)// - (fillCharReg.test(node.nodeValue) ? 1 : 0 ) }else{ node = node.childNodes[ isStart ? me.startOffset : me.endOffset]; if(node){ firstIndex = domUtils.getNodeIndex(node,ignoreTxt); }else{ node = isStart ? me.startContainer : me.endContainer; var first = node.firstChild; while(first){ if(domUtils.isFillChar(first)){ first = first.nextSibling; continue; } firstIndex++; if(first.nodeType == 3){ while( first && first.nodeType == 3){ first = first.nextSibling; } }else{ first = first.nextSibling; } } } } }else{ firstIndex = isStart ? domUtils.isFillChar(node) ? 0 : me.startOffset : me.endOffset } if(firstIndex < 0){ firstIndex = 0; } addrs.push(firstIndex); return addrs; } addr.startAddress = getAddress(true); if(!ignoreEnd){ addr.endAddress = me.collapsed ? [].concat(addr.startAddress) : getAddress(); } return addr; }, /** * 保存 * @method createAddress * @private * @return { Boolean } 返回开始和结束的位置 * @example * ```html * *

            * aaaa * * * bbbb * * *

            * * * * ``` */ moveToAddress : function(addr,ignoreEnd){ var me = this; function getNode(address,isStart){ var tmpNode = me.document.body, parentNode,offset; for(var i= 0,ci,l=address.length;i * * * * * * * * * ``` */ /** * 遍历range内的节点。 * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 * 作为其参数。 * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 * 发doFn函数的执行 * @method traversal * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 * 会触发doFn。 * @return { UE.dom.Range } 当前range对象 * @see UE.dom.Range:traversal(Function) * @example * ```html * * * * * * * * * * * ``` */ traversal:function(doFn,filterFn){ if (this.collapsed) return this; var bookmark = this.createBookmark(), end = bookmark.end, current = domUtils.getNextDomNode(bookmark.start, false, filterFn); while (current && current !== end && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { var tmpNode = domUtils.getNextDomNode(current,false,filterFn); doFn(current); current = tmpNode; } return this.moveToBookmark(bookmark); } }; })(); // core/Selection.js /** * 选集 * @file * @module UE.dom * @class Selection * @since 1.2.6.1 */ /** * 选区集合 * @unfile * @module UE.dom * @class Selection */ (function () { function getBoundaryInformation( range, start ) { var getIndex = domUtils.getNodeIndex; range = range.duplicate(); range.collapse( start ); var parent = range.parentElement(); //如果节点里没有子节点,直接退出 if ( !parent.hasChildNodes() ) { return {container:parent, offset:0}; } var siblings = parent.children, child, testRange = range.duplicate(), startIndex = 0, endIndex = siblings.length - 1, index = -1, distance; while ( startIndex <= endIndex ) { index = Math.floor( (startIndex + endIndex) / 2 ); child = siblings[index]; testRange.moveToElementText( child ); var position = testRange.compareEndPoints( 'StartToStart', range ); if ( position > 0 ) { endIndex = index - 1; } else if ( position < 0 ) { startIndex = index + 1; } else { //trace:1043 return {container:parent, offset:getIndex( child )}; } } if ( index == -1 ) { testRange.moveToElementText( parent ); testRange.setEndPoint( 'StartToStart', range ); distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; siblings = parent.childNodes; if ( !distance ) { child = siblings[siblings.length - 1]; return {container:child, offset:child.nodeValue.length}; } var i = siblings.length; while ( distance > 0 ){ distance -= siblings[ --i ].nodeValue.length; } return {container:siblings[i], offset:-distance}; } testRange.collapse( position > 0 ); testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range ); distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; if ( !distance ) { return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ? {container:parent, offset:getIndex( child ) + (position > 0 ? 0 : 1)} : {container:child, offset:position > 0 ? 0 : child.childNodes.length} } while ( distance > 0 ) { try { var pre = child; child = child[position > 0 ? 'previousSibling' : 'nextSibling']; distance -= child.nodeValue.length; } catch ( e ) { return {container:parent, offset:getIndex( pre )}; } } return {container:child, offset:position > 0 ? -distance : child.nodeValue.length + distance} } /** * 将ieRange转换为Range对象 * @param {Range} ieRange ieRange对象 * @param {Range} range Range对象 * @return {Range} range 返回转换后的Range对象 */ function transformIERangeToRange( ieRange, range ) { if ( ieRange.item ) { range.selectNode( ieRange.item( 0 ) ); } else { var bi = getBoundaryInformation( ieRange, true ); range.setStart( bi.container, bi.offset ); if ( ieRange.compareEndPoints( 'StartToEnd', ieRange ) != 0 ) { bi = getBoundaryInformation( ieRange, false ); range.setEnd( bi.container, bi.offset ); } } return range; } /** * 获得ieRange * @param {Selection} sel Selection对象 * @return {ieRange} 得到ieRange */ function _getIERange( sel ) { var ieRange; //ie下有可能报错 try { ieRange = sel.getNative().createRange(); } catch ( e ) { return null; } var el = ieRange.item ? ieRange.item( 0 ) : ieRange.parentElement(); if ( ( el.ownerDocument || el ) === sel.document ) { return ieRange; } return null; } var Selection = dom.Selection = function ( doc ) { var me = this, iframe; me.document = doc; if ( browser.ie9below ) { iframe = domUtils.getWindow( doc ).frameElement; domUtils.on( iframe, 'beforedeactivate', function () { me._bakIERange = me.getIERange(); } ); domUtils.on( iframe, 'activate', function () { try { if ( !_getIERange( me ) && me._bakIERange ) { me._bakIERange.select(); } } catch ( ex ) { } me._bakIERange = null; } ); } iframe = doc = null; }; Selection.prototype = { rangeInBody : function(rng,txtRange){ var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer; return node === this.document.body || domUtils.inDoc(node,this.document); }, /** * 获取原生seleciton对象 * @method getNative * @return { Object } 获得selection对象 * @example * ```javascript * editor.selection.getNative(); * ``` */ getNative:function () { var doc = this.document; try { return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow( doc ).getSelection(); } catch ( e ) { return null; } }, /** * 获得ieRange * @method getIERange * @return { Object } 返回ie原生的Range * @example * ```javascript * editor.selection.getIERange(); * ``` */ getIERange:function () { var ieRange = _getIERange( this ); if ( !ieRange ) { if ( this._bakIERange ) { return this._bakIERange; } } return ieRange; }, /** * 缓存当前选区的range和选区的开始节点 * @method cache */ cache:function () { this.clear(); this._cachedRange = this.getRange(); this._cachedStartElement = this.getStart(); this._cachedStartElementPath = this.getStartElementPath(); }, /** * 获取选区开始位置的父节点到body * @method getStartElementPath * @return { Array } 返回父节点集合 * @example * ```javascript * editor.selection.getStartElementPath(); * ``` */ getStartElementPath:function () { if ( this._cachedStartElementPath ) { return this._cachedStartElementPath; } var start = this.getStart(); if ( start ) { return domUtils.findParents( start, true, null, true ) } return []; }, /** * 清空缓存 * @method clear */ clear:function () { this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; }, /** * 编辑器是否得到了选区 * @method isFocus */ isFocus:function () { try { if(browser.ie9below){ var nativeRange = _getIERange(this); return !!(nativeRange && this.rangeInBody(nativeRange)); }else{ return !!this.getNative().rangeCount; } } catch ( e ) { return false; } }, /** * 获取选区对应的Range * @method getRange * @return { Object } 得到Range对象 * @example * ```javascript * editor.selection.getRange(); * ``` */ getRange:function () { var me = this; function optimze( range ) { var child = me.document.body.firstChild, collapsed = range.collapsed; while ( child && child.firstChild ) { range.setStart( child, 0 ); child = child.firstChild; } if ( !range.startContainer ) { range.setStart( me.document.body, 0 ) } if ( collapsed ) { range.collapse( true ); } } if ( me._cachedRange != null ) { return this._cachedRange; } var range = new baidu.editor.dom.Range( me.document ); if ( browser.ie9below ) { var nativeRange = me.getIERange(); if ( nativeRange ) { //备份的_bakIERange可能已经实效了,dom树发生了变化比如从源码模式切回来,所以try一下,实效就放到body开始位置 try{ transformIERangeToRange( nativeRange, range ); }catch(e){ optimze( range ); } } else { optimze( range ); } } else { var sel = me.getNative(); if ( sel && sel.rangeCount ) { var firstRange = sel.getRangeAt( 0 ); var lastRange = sel.getRangeAt( sel.rangeCount - 1 ); range.setStart( firstRange.startContainer, firstRange.startOffset ).setEnd( lastRange.endContainer, lastRange.endOffset ); if ( range.collapsed && domUtils.isBody( range.startContainer ) && !range.startOffset ) { optimze( range ); } } else { //trace:1734 有可能已经不在dom树上了,标识的节点 if ( this._bakRange && domUtils.inDoc( this._bakRange.startContainer, this.document ) ){ return this._bakRange; } optimze( range ); } } return this._bakRange = range; }, /** * 获取开始元素,用于状态反射 * @method getStart * @return { Element } 获得开始元素 * @example * ```javascript * editor.selection.getStart(); * ``` */ getStart:function () { if ( this._cachedStartElement ) { return this._cachedStartElement; } var range = browser.ie9below ? this.getIERange() : this.getRange(), tmpRange, start, tmp, parent; if ( browser.ie9below ) { if ( !range ) { //todo 给第一个值可能会有问题 return this.document.body.firstChild; } //control元素 if ( range.item ){ return range.item( 0 ); } tmpRange = range.duplicate(); //修正ie下x[xx] 闭合后 x|xx tmpRange.text.length > 0 && tmpRange.moveStart( 'character', 1 ); tmpRange.collapse( 1 ); start = tmpRange.parentElement(); parent = tmp = range.parentElement(); while ( tmp = tmp.parentNode ) { if ( tmp == start ) { start = parent; break; } } } else { range.shrinkBoundary(); start = range.startContainer; if ( start.nodeType == 1 && start.hasChildNodes() ){ start = start.childNodes[Math.min( start.childNodes.length - 1, range.startOffset )]; } if ( start.nodeType == 3 ){ return start.parentNode; } } return start; }, /** * 得到选区中的文本 * @method getText * @return { String } 选区中包含的文本 * @example * ```javascript * editor.selection.getText(); * ``` */ getText:function () { var nativeSel, nativeRange; if ( this.isFocus() && (nativeSel = this.getNative()) ) { nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt( 0 ); return browser.ie9below ? nativeRange.text : nativeRange.toString(); } return ''; }, /** * 清除选区 * @method clearRange * @example * ```javascript * editor.selection.clearRange(); * ``` */ clearRange : function(){ this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); } }; })(); // core/Editor.js /** * 编辑器主类,包含编辑器提供的大部分公用接口 * @file * @module UE * @class Editor * @since 1.2.6.1 */ /** * UEditor公用空间,UEditor所有的功能都挂载在该空间下 * @unfile * @module UE */ /** * UEditor的核心类,为用户提供与编辑器交互的接口。 * @unfile * @module UE * @class Editor */ (function () { var uid = 0, _selectionChangeTimer; /** * 获取编辑器的html内容,赋值到编辑器所在表单的textarea文本域里面 * @private * @method setValue * @param { UE.Editor } editor 编辑器事例 */ function setValue(form, editor) { var textarea; if (editor.textarea) { if (utils.isString(editor.textarea)) { for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, 'textarea'); ti = tis[i++];) { if (ti.id == 'ueditor_textarea_' + editor.options.textarea) { textarea = ti; break; } } } else { textarea = editor.textarea; } } if (!textarea) { form.appendChild(textarea = domUtils.createElement(document, 'textarea', { 'name': editor.options.textarea, 'id': 'ueditor_textarea_' + editor.options.textarea, 'style': "display:none" })); //不要产生多个textarea editor.textarea = textarea; } !textarea.getAttribute('name') && textarea.setAttribute('name', editor.options.textarea ); textarea.value = editor.hasContents() ? (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) : '' } function loadPlugins(me){ //初始化插件 for (var pi in UE.plugins) { UE.plugins[pi].call(me); } } function checkCurLang(I18N){ for(var lang in I18N){ return lang } } function langReadied(me){ me.langIsReady = true; me.fireEvent("langReady"); } /** * 编辑器准备就绪后会触发该事件 * @module UE * @class Editor * @event ready * @remind render方法执行完成之后,会触发该事件 * @remind * @example * ```javascript * editor.addListener( 'ready', function( editor ) { * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 * } ); * ``` */ /** * 执行destroy方法,会触发该事件 * @module UE * @class Editor * @event destroy * @see UE.Editor:destroy() */ /** * 执行reset方法,会触发该事件 * @module UE * @class Editor * @event reset * @see UE.Editor:reset() */ /** * 执行focus方法,会触发该事件 * @module UE * @class Editor * @event focus * @see UE.Editor:focus(Boolean) */ /** * 语言加载完成会触发该事件 * @module UE * @class Editor * @event langReady */ /** * 运行命令之后会触发该命令 * @module UE * @class Editor * @event beforeExecCommand */ /** * 运行命令之后会触发该命令 * @module UE * @class Editor * @event afterExecCommand */ /** * 运行命令之前会触发该命令 * @module UE * @class Editor * @event firstBeforeExecCommand */ /** * 在getContent方法执行之前会触发该事件 * @module UE * @class Editor * @event beforeGetContent * @see UE.Editor:getContent() */ /** * 在getContent方法执行之后会触发该事件 * @module UE * @class Editor * @event afterGetContent * @see UE.Editor:getContent() */ /** * 在getAllHtml方法执行时会触发该事件 * @module UE * @class Editor * @event getAllHtml * @see UE.Editor:getAllHtml() */ /** * 在setContent方法执行之前会触发该事件 * @module UE * @class Editor * @event beforeSetContent * @see UE.Editor:setContent(String) */ /** * 在setContent方法执行之后会触发该事件 * @module UE * @class Editor * @event afterSetContent * @see UE.Editor:setContent(String) */ /** * 每当编辑器内部选区发生改变时,将触发该事件 * @event selectionchange * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 * @example * ```javascript * editor.addListener( 'selectionchange', function( editor ) { * console.log('选区发生改变'); * } */ /** * 在所有selectionchange的监听函数执行之前,会触发该事件 * @module UE * @class Editor * @event beforeSelectionChange * @see UE.Editor:selectionchange */ /** * 在所有selectionchange的监听函数执行完之后,会触发该事件 * @module UE * @class Editor * @event afterSelectionChange * @see UE.Editor:selectionchange */ /** * 编辑器内容发生改变时会触发该事件 * @module UE * @class Editor * @event contentChange */ /** * 以默认参数构建一个编辑器实例 * @constructor * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 * @example * ```javascript * var editor = new UE.Editor(); * editor.execCommand('blod'); * ``` * @see UE.Config */ /** * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 * @constructor * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 * @param { Object } setting 创建编辑器的参数 * @example * ```javascript * var editor = new UE.Editor(); * editor.execCommand('blod'); * ``` * @see UE.Config */ var Editor = UE.Editor = function (options) { var me = this; me.uid = uid++; EventBase.call(me); me.commands = {}; me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); me.shortcutkeys = {}; me.inputRules = []; me.outputRules = []; //设置默认的常用属性 me.setOpt(Editor.defaultOptions(me)); /* 尝试异步加载后台配置 */ me.loadServerConfig(); if(!utils.isEmptyObject(UE.I18N)){ //修改默认的语言类型 me.options.lang = checkCurLang(UE.I18N); UE.plugin.load(me); langReadied(me); }else{ utils.loadFile(document, { src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js", tag: "script", type: "text/javascript", defer: "defer" }, function () { UE.plugin.load(me); langReadied(me); }); } UE.instants['ueditorInstant' + me.uid] = me; }; Editor.prototype = { registerCommand : function(name,obj){ this.commands[name] = obj; }, /** * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 * @method ready * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 * 立即触发该回调。 * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 * @example * ```javascript * editor.ready( function( editor ) { * editor.setContent('初始化完毕'); * } ); * ``` * @see UE.Editor.event:ready */ ready: function (fn) { var me = this; if (fn) { me.isReady ? fn.apply(me) : me.addListener('ready', fn); } }, /** * 该方法是提供给插件里面使用,设置配置项默认值 * @method setOpt * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 * @param { String } key 编辑器的可接受的选项名称 * @param { * } val 该选项可接受的值 * @example * ```javascript * editor.setOpt( 'initContent', '欢迎使用编辑器' ); * ``` */ /** * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 * @method setOpt * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 * @param { Object } options 将要设置的选项的键值对对象 * @example * ```javascript * editor.setOpt( { * 'initContent': '欢迎使用编辑器' * } ); * ``` */ setOpt: function (key, val) { var obj = {}; if (utils.isString(key)) { obj[key] = val } else { obj = key; } utils.extend(this.options, obj, true); }, getOpt:function(key){ return this.options[key] }, /** * 销毁编辑器实例,使用textarea代替 * @method destroy * @example * ```javascript * editor.destroy(); * ``` */ destroy: function () { var me = this; me.fireEvent('destroy'); var container = me.container.parentNode; var textarea = me.textarea; if (!textarea) { textarea = document.createElement('textarea'); container.parentNode.insertBefore(textarea, container); } else { textarea.style.display = '' } textarea.style.width = me.iframe.offsetWidth + 'px'; textarea.style.height = me.iframe.offsetHeight + 'px'; textarea.value = me.getContent(); textarea.id = me.key; container.innerHTML = ''; domUtils.remove(container); var key = me.key; //trace:2004 for (var p in me) { if (me.hasOwnProperty(p)) { delete this[p]; } } UE.delEditor(key); }, /** * 渲染编辑器的DOM到指定容器 * @method render * @param { String } containerId 指定一个容器ID * @remind 执行该方法,会触发ready事件 * @warning 必须且只能调用一次 */ /** * 渲染编辑器的DOM到指定容器 * @method render * @param { Element } containerDom 直接指定容器对象 * @remind 执行该方法,会触发ready事件 * @warning 必须且只能调用一次 */ render: function (container) { var me = this, options = me.options, getStyleValue=function(attr){ return parseInt(domUtils.getComputedStyle(container,attr)); }; if (utils.isString(container)) { container = document.getElementById(container); } if (container) { if(options.initialFrameWidth){ options.minFrameWidth = options.initialFrameWidth }else{ options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; } if(options.initialFrameHeight){ options.minFrameHeight = options.initialFrameHeight }else{ options.initialFrameHeight = options.minFrameHeight = container.offsetHeight; } container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth- getStyleValue("padding-left")- getStyleValue("padding-right") +'px'; container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight - getStyleValue("padding-top")- getStyleValue("padding-bottom") +'px'; container.style.zIndex = options.zIndex; var html = ( ie && browser.version < 9 ? '' : '') + '' + '' + ( options.iframeCssUrl ? '' : '' ) + (options.initialStyle ? '' : '') + '' + ''; container.appendChild(domUtils.createElement(document, 'iframe', { id: 'ueditor_' + me.uid, width: "100%", height: "100%", frameborder: "0", //先注释掉了,加的原因忘记了,但开启会直接导致全屏模式下内容多时不会出现滚动条 // scrolling :'no', src: 'javascript:void(function(){document.open();' + (options.customDomain && document.domain != location.hostname ? 'document.domain="' + document.domain + '";' : '') + 'document.write("' + html + '");document.close();}())' })); container.style.overflow = 'hidden'; //解决如果是给定的百分比,会导致高度算不对的问题 setTimeout(function(){ if( /%$/.test(options.initialFrameWidth)){ options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; //如果这里给定宽度,会导致ie在拖动窗口大小时,编辑区域不随着变化 // container.style.width = options.initialFrameWidth + 'px'; } if(/%$/.test(options.initialFrameHeight)){ options.minFrameHeight = options.initialFrameHeight = container.offsetHeight; container.style.height = options.initialFrameHeight + 'px'; } }) } }, /** * 编辑器初始化 * @method _setup * @private * @param { Element } doc 编辑器Iframe中的文档对象 */ _setup: function (doc) { var me = this, options = me.options; if (ie) { doc.body.disabled = true; doc.body.contentEditable = true; doc.body.disabled = false; } else { doc.body.contentEditable = true; } doc.body.spellcheck = false; me.document = doc; me.window = doc.defaultView || doc.parentWindow; me.iframe = me.window.frameElement; me.body = doc.body; me.selection = new dom.Selection(doc); //gecko初始化就能得到range,无法判断isFocus了 var geckoSel; if (browser.gecko && (geckoSel = this.selection.getNative())) { geckoSel.removeAllRanges(); } this._initEvents(); //为form提交提供一个隐藏的textarea for (var form = this.iframe.parentNode; !domUtils.isBody(form); form = form.parentNode) { if (form.tagName == 'FORM') { me.form = form; if(me.options.autoSyncData){ domUtils.on(me.window,'blur',function(){ setValue(form,me); }); }else{ domUtils.on(form, 'submit', function () { setValue(this, me); }); } break; } } if (options.initialContent) { if (options.autoClearinitialContent) { var oldExecCommand = me.execCommand; me.execCommand = function () { me.fireEvent('firstBeforeExecCommand'); return oldExecCommand.apply(me, arguments); }; this._setDefaultContent(options.initialContent); } else this.setContent(options.initialContent, false, true); } //编辑器不能为空内容 if (domUtils.isEmptyNode(me.body)) { me.body.innerHTML = '

            ' + (browser.ie ? '' : '
            ') + '

            '; } //如果要求focus, 就把光标定位到内容开始 if (options.focus) { setTimeout(function () { me.focus(me.options.focusInEnd); //如果自动清除开着,就不需要做selectionchange; !me.options.autoClearinitialContent && me._selectionChange(); }, 0); } if (!me.container) { me.container = this.iframe.parentNode; } if (options.fullscreen && me.ui) { me.ui.setFullScreen(true); } try { me.document.execCommand('2D-position', false, false); } catch (e) { } try { me.document.execCommand('enableInlineTableEditing', false, false); } catch (e) { } try { me.document.execCommand('enableObjectResizing', false, false); } catch (e) { } //挂接快捷键 me._bindshortcutKeys(); me.isReady = 1; me.fireEvent('ready'); options.onready && options.onready.call(me); if (!browser.ie9below) { domUtils.on(me.window, ['blur', 'focus'], function (e) { //chrome下会出现alt+tab切换时,导致选区位置不对 if (e.type == 'blur') { me._bakRange = me.selection.getRange(); try { me._bakNativeRange = me.selection.getNative().getRangeAt(0); me.selection.getNative().removeAllRanges(); } catch (e) { me._bakNativeRange = null; } } else { try { me._bakRange && me._bakRange.select(); } catch (e) { } } }); } //trace:1518 ff3.6body不够寛,会导致点击空白处无法获得焦点 if (browser.gecko && browser.version <= 10902) { //修复ff3.6初始化进来,不能点击获得焦点 me.body.contentEditable = false; setTimeout(function () { me.body.contentEditable = true; }, 100); setInterval(function () { me.body.style.height = me.iframe.offsetHeight - 20 + 'px' }, 100) } !options.isShow && me.setHide(); options.readonly && me.setDisabled(); }, /** * 同步数据到编辑器所在的form * 从编辑器的容器节点向上查找form元素,若找到,就同步编辑内容到找到的form里,为提交数据做准备,主要用于是手动提交的情况 * 后台取得数据的键值,使用你容器上的name属性,如果没有就使用参数里的textarea项 * @method sync * @example * ```javascript * editor.sync(); * form.sumbit(); //form变量已经指向了form元素 * ``` */ /** * 根据传入的formId,在页面上查找要同步数据的表单,若找到,就同步编辑内容到找到的form里,为提交数据做准备 * 后台取得数据的键值,该键值默认使用给定的编辑器容器的name属性,如果没有name属性则使用参数项里给定的“textarea”项 * @method sync * @param { String } formID 指定一个要同步数据的form的id,编辑器的数据会同步到你指定form下 */ sync: function (formId) { var me = this, form = formId ? document.getElementById(formId) : domUtils.findParent(me.iframe.parentNode, function (node) { return node.tagName == 'FORM' }, true); form && setValue(form, me); }, /** * 设置编辑器高度 * @method setHeight * @remind 当配置项autoHeightEnabled为真时,该方法无效 * @param { Number } number 设置的高度值,纯数值,不带单位 * @example * ```javascript * editor.setHeight(number); * ``` */ setHeight: function (height,notSetHeight) { if (height !== parseInt(this.iframe.parentNode.style.height)) { this.iframe.parentNode.style.height = height + 'px'; } !notSetHeight && (this.options.minFrameHeight = this.options.initialFrameHeight = height); this.body.style.height = height + 'px'; !notSetHeight && this.trigger('setHeight') }, /** * 为编辑器的编辑命令提供快捷键 * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 * @method addshortcutkey * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 * @example * ```javascript * editor.addshortcutkey({ * "Bold" : "ctrl+66",//^B * "Italic" : "ctrl+73", //^I * }); * ``` */ /** * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 * @method addshortcutkey * @param { String } cmd 触发快捷键时,响应的命令 * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 * @example * ```javascript * editor.addshortcutkey("Underline", "ctrl+85"); //^U * ``` */ addshortcutkey: function (cmd, keys) { var obj = {}; if (keys) { obj[cmd] = keys } else { obj = cmd; } utils.extend(this.shortcutkeys, obj) }, /** * 对编辑器设置keydown事件监听,绑定快捷键和命令,当快捷键组合触发成功,会响应对应的命令 * @method _bindshortcutKeys * @private */ _bindshortcutKeys: function () { var me = this, shortcutkeys = this.shortcutkeys; me.addListener('keydown', function (type, e) { var keyCode = e.keyCode || e.which; for (var i in shortcutkeys) { var tmp = shortcutkeys[i].split(','); for (var t = 0, ti; ti = tmp[t++];) { ti = ti.split(':'); var key = ti[0], param = ti[1]; if (/^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || /^(\d+)$/.test(key)) { if (( (RegExp.$1 == 'ctrl' ? (e.ctrlKey || e.metaKey) : 0) && (RegExp.$2 != "" ? e[RegExp.$2.slice(1) + "Key"] : 1) && keyCode == RegExp.$3 ) || keyCode == RegExp.$1 ) { if (me.queryCommandState(i,param) != -1) me.execCommand(i, param); domUtils.preventDefault(e); } } } } }); }, /** * 获取编辑器的内容 * @method getContent * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 * @example * ```javascript * //编辑器html内容:

            123456

            * var content = editor.getContent(); //返回值:

            123456

            * ``` */ /** * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 * @method getContent * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, * 代表当前编辑器的内容是否空, * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 * 经过内置过滤规则处理后的内容。 * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 * @return { String } 编辑器的内容字符串 * @example * ```javascript * // editor 是一个编辑器的实例 * var content = editor.getContent( function ( editor ) { * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 * } ); * ``` */ getContent: function (cmd, fn,notSetCursor,ignoreBlank,formatter) { var me = this; if (cmd && utils.isFunction(cmd)) { fn = cmd; cmd = ''; } if (fn ? !fn() : !this.hasContents()) { return ''; } me.fireEvent('beforegetcontent'); var root = UE.htmlparser(me.body.innerHTML,ignoreBlank); me.filterOutputRule(root); me.fireEvent('aftergetcontent', cmd,root); return root.toHtml(formatter); }, /** * 取得完整的html代码,可以直接显示成完整的html文档 * @method getAllHtml * @return { String } 编辑器的内容html文档字符串 * @eaxmple * ```javascript * editor.getAllHtml(); //返回格式大致是: ...... * ``` */ getAllHtml: function () { var me = this, headHtml = [], html = ''; me.fireEvent('getAllHtml', headHtml); if (browser.ie && browser.version > 8) { var headHtmlForIE9 = ''; utils.each(me.document.styleSheets, function (si) { headHtmlForIE9 += ( si.href ? '' : ''); }); utils.each(me.document.getElementsByTagName('script'), function (si) { headHtmlForIE9 += si.outerHTML; }); } return '' + (me.options.charset ? '' : '') + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '' + '' + me.getContent(null, null, true) + ''; }, /** * 得到编辑器的纯文本内容,但会保留段落格式 * @method getPlainTxt * @return { String } 编辑器带段落格式的纯文本内容字符串 * @example * ```javascript * //编辑器html内容:

            1

            2

            * console.log(editor.getPlainTxt()); //输出:"1\n2\n * ``` */ getPlainTxt: function () { var reg = new RegExp(domUtils.fillChar, 'g'), html = this.body.innerHTML.replace(/[\n\r]/g, '');//ie要先去了\n在处理 html = html.replace(/<(p|div)[^>]*>(| )<\/\1>/gi, '\n') .replace(//gi, '\n') .replace(/<[^>/]+>/g, '') .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) { return dtd.$block[c] ? '\n' : b ? b : ''; }); //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 return html.replace(reg, '').replace(/\u00a0/g, ' ').replace(/ /g, ' '); }, /** * 获取编辑器中的纯文本内容,没有段落格式 * @method getContentTxt * @return { String } 编辑器不带段落格式的纯文本内容字符串 * @example * ```javascript * //编辑器html内容:

            1

            2

            * console.log(editor.getPlainTxt()); //输出:"12 * ``` */ getContentTxt: function () { var reg = new RegExp(domUtils.fillChar, 'g'); //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 return this.body[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').replace(/\u00a0/g, ' '); }, /** * 设置编辑器的内容,可修改编辑器当前的html内容 * @method setContent * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 * @warning 该方法会触发selectionchange事件 * @param { String } html 要插入的html内容 * @example * ```javascript * editor.getContent('

            test

            '); * ``` */ /** * 设置编辑器的内容,可修改编辑器当前的html内容 * @method setContent * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 * @warning 该方法会触发selectionchange事件 * @param { String } html 要插入的html内容 * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 * @example * ```javascript * //假设设置前的编辑器内容是

            old text

            * editor.setContent('

            new text

            ', true); //插入的结果是

            old text

            new text

            * ``` */ setContent: function (html, isAppendTo, notFireSelectionchange) { var me = this; me.fireEvent('beforesetcontent', html); var root = UE.htmlparser(html); me.filterInputRule(root); html = root.toHtml(); me.body.innerHTML = (isAppendTo ? me.body.innerHTML : '') + html; function isCdataDiv(node){ return node.tagName == 'DIV' && node.getAttribute('cdata_tag'); } //给文本或者inline节点套p标签 if (me.options.enterTag == 'p') { var child = this.body.firstChild, tmpNode; if (!child || child.nodeType == 1 && (dtd.$cdata[child.tagName] || isCdataDiv(child) || domUtils.isCustomeNode(child) ) && child === this.body.lastChild) { this.body.innerHTML = '

            ' + (browser.ie ? ' ' : '
            ') + '

            ' + this.body.innerHTML; } else { var p = me.document.createElement('p'); while (child) { while (child && (child.nodeType == 3 || child.nodeType == 1 && dtd.p[child.tagName] && !dtd.$cdata[child.tagName])) { tmpNode = child.nextSibling; p.appendChild(child); child = tmpNode; } if (p.firstChild) { if (!child) { me.body.appendChild(p); break; } else { child.parentNode.insertBefore(p, child); p = me.document.createElement('p'); } } child = child.nextSibling; } } } me.fireEvent('aftersetcontent'); me.fireEvent('contentchange'); !notFireSelectionchange && me._selectionChange(); //清除保存的选区 me._bakRange = me._bakIERange = me._bakNativeRange = null; //trace:1742 setContent后gecko能得到焦点问题 var geckoSel; if (browser.gecko && (geckoSel = this.selection.getNative())) { geckoSel.removeAllRanges(); } if(me.options.autoSyncData){ me.form && setValue(me.form,me); } }, /** * 让编辑器获得焦点,默认focus到编辑器头部 * @method focus * @example * ```javascript * editor.focus() * ``` */ /** * 让编辑器获得焦点,toEnd确定focus位置 * @method focus * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 * @example * ```javascript * editor.focus(true) * ``` */ focus: function (toEnd) { try { var me = this, rng = me.selection.getRange(); if (toEnd) { var node = me.body.lastChild; if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ if(domUtils.isEmptyBlock(node)){ rng.setStartAtFirst(node) }else{ rng.setStartAtLast(node) } rng.collapse(true); } rng.setCursor(true); } else { if(!rng.collapsed && domUtils.isBody(rng.startContainer) && rng.startOffset == 0){ var node = me.body.firstChild; if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ rng.setStartAtFirst(node).collapse(true); } } rng.select(true); } this.fireEvent('focus selectionchange'); } catch (e) { } }, isFocus:function(){ return this.selection.isFocus(); }, blur:function(){ var sel = this.selection.getNative(); if(sel.empty && browser.ie){ var nativeRng = document.body.createTextRange(); nativeRng.moveToElementText(document.body); nativeRng.collapse(true); nativeRng.select(); sel.empty() }else{ sel.removeAllRanges() } //this.fireEvent('blur selectionchange'); }, /** * 初始化UE事件及部分事件代理 * @method _initEvents * @private */ _initEvents: function () { var me = this, doc = me.document, win = me.window; me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); domUtils.on(doc, ['click', 'contextmenu', 'mousedown', 'keydown', 'keyup', 'keypress', 'mouseup', 'mouseover', 'mouseout', 'selectstart'], me._proxyDomEvent); domUtils.on(win, ['focus', 'blur'], me._proxyDomEvent); domUtils.on(me.body,'drop',function(e){ //阻止ff下默认的弹出新页面打开图片 if(browser.gecko && e.stopPropagation) { e.stopPropagation(); } me.fireEvent('contentchange') }); domUtils.on(doc, ['mouseup', 'keydown'], function (evt) { //特殊键不触发selectionchange if (evt.type == 'keydown' && (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey)) { return; } if (evt.button == 2)return; me._selectionChange(250, evt); }); }, /** * 触发事件代理 * @method _proxyDomEvent * @private * @return { * } fireEvent的返回值 * @see UE.EventBase:fireEvent(String) */ _proxyDomEvent: function (evt) { if(this.fireEvent('before' + evt.type.replace(/^on/, '').toLowerCase()) === false){ return false; } if(this.fireEvent(evt.type.replace(/^on/, ''), evt) === false){ return false; } return this.fireEvent('after' + evt.type.replace(/^on/, '').toLowerCase()) }, /** * 变化选区 * @method _selectionChange * @private */ _selectionChange: function (delay, evt) { var me = this; //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题(source命令notNeedUndo=1) // if ( !me.selection.isFocus() ){ // return; // } var hackForMouseUp = false; var mouseX, mouseY; if (browser.ie && browser.version < 9 && evt && evt.type == 'mouseup') { var range = this.selection.getRange(); if (!range.collapsed) { hackForMouseUp = true; mouseX = evt.clientX; mouseY = evt.clientY; } } clearTimeout(_selectionChangeTimer); _selectionChangeTimer = setTimeout(function () { if (!me.selection || !me.selection.getNative()) { return; } //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时,可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值. //IE下如果用户是拖拽一段已选择文本,则不会触发mouseup事件,所以这里的特殊处理不会对其有影响 var ieRange; if (hackForMouseUp && me.selection.getNative().type == 'None') { ieRange = me.document.body.createTextRange(); try { ieRange.moveToPoint(mouseX, mouseY); } catch (ex) { ieRange = null; } } var bakGetIERange; if (ieRange) { bakGetIERange = me.selection.getIERange; me.selection.getIERange = function () { return ieRange; }; } me.selection.cache(); if (bakGetIERange) { me.selection.getIERange = bakGetIERange; } if (me.selection._cachedRange && me.selection._cachedStartElement) { me.fireEvent('beforeselectionchange'); // 第二个参数causeByUi为true代表由用户交互造成的selectionchange. me.fireEvent('selectionchange', !!evt); me.fireEvent('afterselectionchange'); me.selection.clear(); } }, delay || 50); }, /** * 执行编辑命令 * @method _callCmdFn * @private * @param { String } fnName 函数名称 * @param { * } args 传给命令函数的参数 * @return { * } 返回命令函数运行的返回值 */ _callCmdFn: function (fnName, args) { var cmdName = args[0].toLowerCase(), cmd, cmdFn; cmd = this.commands[cmdName] || UE.commands[cmdName]; cmdFn = cmd && cmd[fnName]; //没有querycommandstate或者没有command的都默认返回0 if ((!cmd || !cmdFn) && fnName == 'queryCommandState') { return 0; } else if (cmdFn) { return cmdFn.apply(this, args); } }, /** * 执行编辑命令cmdName,完成富文本编辑效果 * @method execCommand * @param { String } cmdName 需要执行的命令 * @remind 具体命令的使用请参考命令列表 * @return { * } 返回命令函数运行的返回值 * @example * ```javascript * editor.execCommand(cmdName); * ``` */ execCommand: function (cmdName) { cmdName = cmdName.toLowerCase(); var me = this, result, cmd = me.commands[cmdName] || UE.commands[cmdName]; if (!cmd || !cmd.execCommand) { return null; } if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { me.__hasEnterExecCommand = true; if (me.queryCommandState.apply(me,arguments) != -1) { me.fireEvent('saveScene'); me.fireEvent.apply(me, ['beforeexeccommand', cmdName].concat(arguments)); result = this._callCmdFn('execCommand', arguments); //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 // (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); me.fireEvent.apply(me, ['afterexeccommand', cmdName].concat(arguments)); me.fireEvent('saveScene'); } me.__hasEnterExecCommand = false; } else { result = this._callCmdFn('execCommand', arguments); (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange') } (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me._selectionChange(); return result; }, /** * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态 * @method queryCommandState * @param { String } cmdName 需要查询的命令名称 * @remind 具体命令的使用请参考命令列表 * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) * @example * ```javascript * editor.queryCommandState(cmdName) => (-1|0|1) * ``` * @see COMMAND.LIST */ queryCommandState: function (cmdName) { return this._callCmdFn('queryCommandState', arguments); }, /** * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 * @method queryCommandValue * @param { String } cmdName 需要查询的命令名称 * @remind 具体命令的使用请参考命令列表 * @remind 只有部分插件有此方法 * @return { * } 返回每个命令特定的当前状态值 * @grammar editor.queryCommandValue(cmdName) => {*} * @see COMMAND.LIST */ queryCommandValue: function (cmdName) { return this._callCmdFn('queryCommandValue', arguments); }, /** * 检查编辑区域中是否有内容 * @method hasContents * @remind 默认有文本内容,或者有以下节点都不认为是空 * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param * @return { Boolean } 检查有内容返回true,否则返回false * @example * ```javascript * editor.hasContents() * ``` */ /** * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true * @method hasContents * @param { Array } tags 传入数组判断时用到的节点类型 * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false * @example * ```javascript * editor.hasContents(['span']); * ``` */ hasContents: function (tags) { if (tags) { for (var i = 0, ci; ci = tags[i++];) { if (this.document.getElementsByTagName(ci).length > 0) { return true; } } } if (!domUtils.isEmptyBlock(this.body)) { return true } //随时添加,定义的特殊标签如果存在,不能认为是空 tags = ['div']; for (i = 0; ci = tags[i++];) { var nodes = domUtils.getElementsByTagName(this.document, ci); for (var n = 0, cn; cn = nodes[n++];) { if (domUtils.isCustomeNode(cn)) { return true; } } } return false; }, /** * 重置编辑器,可用来做多个tab使用同一个编辑器实例 * @method reset * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 * @example * ```javascript * editor.reset() * ``` */ reset: function () { this.fireEvent('reset'); }, /** * 设置当前编辑区域可以编辑 * @method setEnabled * @example * ```javascript * editor.setEnabled() * ``` */ setEnabled: function () { var me = this, range; if (me.body.contentEditable == 'false') { me.body.contentEditable = true; range = me.selection.getRange(); //有可能内容丢失了 try { range.moveToBookmark(me.lastBk); delete me.lastBk } catch (e) { range.setStartAtFirst(me.body).collapse(true) } range.select(true); if (me.bkqueryCommandState) { me.queryCommandState = me.bkqueryCommandState; delete me.bkqueryCommandState; } if (me.bkqueryCommandValue) { me.queryCommandValue = me.bkqueryCommandValue; delete me.bkqueryCommandValue; } me.fireEvent('selectionchange'); } }, enable: function () { return this.setEnabled(); }, /** 设置当前编辑区域不可编辑 * @method setDisabled */ /** 设置当前编辑区域不可编辑,except中的命令除外 * @method setDisabled * @param { String } except 例外命令的字符串 * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 * @example * ```javascript * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 * ``` */ /** 设置当前编辑区域不可编辑,except中的命令除外 * @method setDisabled * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 * @example * ```javascript * editor.setDisabled(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能 * ``` */ setDisabled: function (except) { var me = this; except = except ? utils.isArray(except) ? except : [except] : []; if (me.body.contentEditable == 'true') { if (!me.lastBk) { me.lastBk = me.selection.getRange().createBookmark(true); } me.body.contentEditable = false; me.bkqueryCommandState = me.queryCommandState; me.bkqueryCommandValue = me.queryCommandValue; me.queryCommandState = function (type) { if (utils.indexOf(except, type) != -1) { return me.bkqueryCommandState.apply(me, arguments); } return -1; }; me.queryCommandValue = function (type) { if (utils.indexOf(except, type) != -1) { return me.bkqueryCommandValue.apply(me, arguments); } return null; }; me.fireEvent('selectionchange'); } }, disable: function (except) { return this.setDisabled(except); }, /** * 设置默认内容 * @method _setDefaultContent * @private * @param { String } cont 要存入的内容 */ _setDefaultContent: function () { function clear() { var me = this; if (me.document.getElementById('initContent')) { me.body.innerHTML = '

            ' + (ie ? '' : '
            ') + '

            '; me.removeListener('firstBeforeExecCommand focus', clear); setTimeout(function () { me.focus(); me._selectionChange(); }, 0) } } return function (cont) { var me = this; me.body.innerHTML = '

            ' + cont + '

            '; me.addListener('firstBeforeExecCommand focus', clear); } }(), /** * 显示编辑器 * @method setShow * @example * ```javascript * editor.setShow() * ``` */ setShow: function () { var me = this, range = me.selection.getRange(); if (me.container.style.display == 'none') { //有可能内容丢失了 try { range.moveToBookmark(me.lastBk); delete me.lastBk } catch (e) { range.setStartAtFirst(me.body).collapse(true) } //ie下focus实效,所以做了个延迟 setTimeout(function () { range.select(true); }, 100); me.container.style.display = ''; } }, show: function () { return this.setShow(); }, /** * 隐藏编辑器 * @method setHide * @example * ```javascript * editor.setHide() * ``` */ setHide: function () { var me = this; if (!me.lastBk) { me.lastBk = me.selection.getRange().createBookmark(true); } me.container.style.display = 'none' }, hide: function () { return this.setHide(); }, /** * 根据指定的路径,获取对应的语言资源 * @method getLang * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 * @example * ```javascript * editor.getLang('contextMenu.delete'); //如果当前是中文,那返回是的是'删除' * ``` */ getLang: function (path) { var lang = UE.I18N[this.options.lang]; if (!lang) { throw Error("not import language file"); } path = (path || "").split("."); for (var i = 0, ci; ci = path[i++];) { lang = lang[ci]; if (!lang)break; } return lang; }, /** * 计算编辑器html内容字符串的长度 * @method getContentLength * @return { Number } 返回计算的长度 * @example * ```javascript * //编辑器html内容

            132

            * editor.getContentLength() //返回27 * ``` */ /** * 计算编辑器当前纯文本内容的长度 * @method getContentLength * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 * @example * ```javascript * //编辑器html内容

            132

            * editor.getContentLength() //返回3 * ``` */ getContentLength: function (ingoneHtml, tagNames) { var count = this.getContent(false,false,true).length; if (ingoneHtml) { tagNames = (tagNames || []).concat([ 'hr', 'img', 'iframe']); count = this.getContentTxt().replace(/[\t\r\n]+/g, '').length; for (var i = 0, ci; ci = tagNames[i++];) { count += this.document.getElementsByTagName(ci).length; } } return count; }, /** * 注册输入过滤规则 * @method addInputRule * @param { Function } rule 要添加的过滤规则 * @example * ```javascript * editor.addInputRule(function(root){ * $.each(root.getNodesByTagName('div'),function(i,node){ * node.tagName="p"; * }); * }); * ``` */ addInputRule: function (rule) { this.inputRules.push(rule); }, /** * 执行注册的过滤规则 * @method filterInputRule * @param { UE.uNode } root 要过滤的uNode节点 * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 * @example * ```javascript * editor.filterInputRule(editor.body); * ``` * @see UE.Editor:addInputRule */ filterInputRule: function (root) { for (var i = 0, ci; ci = this.inputRules[i++];) { ci.call(this, root) } }, /** * 注册输出过滤规则 * @method addOutputRule * @param { Function } rule 要添加的过滤规则 * @example * ```javascript * editor.addOutputRule(function(root){ * $.each(root.getNodesByTagName('p'),function(i,node){ * node.tagName="div"; * }); * }); * ``` */ addOutputRule: function (rule) { this.outputRules.push(rule) }, /** * 根据输出过滤规则,过滤编辑器内容 * @method filterOutputRule * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 * @param { UE.uNode } root 要过滤的uNode节点 * @example * ```javascript * editor.filterOutputRule(editor.body); * ``` * @see UE.Editor:addOutputRule */ filterOutputRule: function (root) { for (var i = 0, ci; ci = this.outputRules[i++];) { ci.call(this, root) } }, /** * 根据action名称获取请求的路径 * @method getActionUrl * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 * @param { String } action action名称 * @example * ```javascript * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" * editor.getActionUrl('imageManager'); //返回 "/ueditor/php/controller.php?action=listimage" * ``` */ getActionUrl: function(action){ var actionName = this.getOpt(action) || action, imageUrl = this.getOpt('imageUrl'), serverUrl = this.getOpt('serverUrl'); if(!serverUrl && imageUrl) { serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2'); } if(serverUrl) { serverUrl = serverUrl + (serverUrl.indexOf('?') == -1 ? '?':'&') + 'action=' + (actionName || ''); return utils.formatUrl(serverUrl); } else { return ''; } } }; utils.inherits(Editor, EventBase); })(); // core/Editor.defaultoptions.js //维护编辑器一下默认的不在插件中的配置项 UE.Editor.defaultOptions = function(editor){ var _url = editor.options.UEDITOR_HOME_URL; return { isShow: true, initialContent: '', initialStyle:'', autoClearinitialContent: false, iframeCssUrl: _url + 'themes/iframe.css', textarea: 'editorValue', focus: false, focusInEnd: true, autoClearEmptyNode: true, fullscreen: false, readonly: false, zIndex: 999, imagePopup: true, enterTag: 'p', customDomain: false, lang: 'zh-cn', langPath: _url + 'lang/', theme: 'default', themePath: _url + 'themes/', allHtmlEnabled: false, scaleEnabled: false, tableNativeEditInFF: false, autoSyncData : true, fileNameFormat: '{time}{rand:6}' } }; // core/loadconfig.js (function(){ UE.Editor.prototype.loadServerConfig = function(){ var me = this; setTimeout(function(){ try{ me.options.imageUrl && me.setOpt('serverUrl', me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2')); var configUrl = me.getActionUrl('config'), isJsonp = utils.isCrossDomainUrl(configUrl); /* 发出ajax请求 */ me._serverConfigLoaded = false; configUrl && UE.ajax.request(configUrl,{ 'method': 'GET', 'dataType': isJsonp ? 'jsonp':'', 'onsuccess':function(r){ try { var config = isJsonp ? r:eval("("+r.responseText+")"); utils.extend(me.options, config); me.fireEvent('serverConfigLoaded'); me._serverConfigLoaded = true; } catch (e) { showErrorMsg(me.getLang('loadconfigFormatError')); } }, 'onerror':function(){ showErrorMsg(me.getLang('loadconfigHttpError')); } }); } catch(e){ showErrorMsg(me.getLang('loadconfigError')); } }); function showErrorMsg(msg) { console && console.error(msg); //me.fireEvent('showMessage', { // 'title': msg, // 'type': 'error' //}); } }; UE.Editor.prototype.isServerConfigLoaded = function(){ var me = this; return me._serverConfigLoaded || false; }; UE.Editor.prototype.afterConfigReady = function(handler){ if (!handler || !utils.isFunction(handler)) return; var me = this; var readyHandler = function(){ handler.apply(me, arguments); me.removeListener('serverConfigLoaded', readyHandler); }; if (me.isServerConfigLoaded()) { handler.call(me, 'serverConfigLoaded'); } else { me.addListener('serverConfigLoaded', readyHandler); } }; })(); // core/ajax.js /** * @file * @module UE.ajax * @since 1.2.6.1 */ /** * 提供对ajax请求的支持 * @module UE.ajax */ UE.ajax = function() { //创建一个ajaxRequest对象 var fnStr = 'XMLHttpRequest()'; try { new ActiveXObject("Msxml2.XMLHTTP"); fnStr = 'ActiveXObject(\'Msxml2.XMLHTTP\')'; } catch (e) { try { new ActiveXObject("Microsoft.XMLHTTP"); fnStr = 'ActiveXObject(\'Microsoft.XMLHTTP\')' } catch (e) { } } var creatAjaxRequest = new Function('return new ' + fnStr); /** * 将json参数转化成适合ajax提交的参数列表 * @param json */ function json2str(json) { var strArr = []; for (var i in json) { //忽略默认的几个参数 if(i=="method" || i=="timeout" || i=="async" || i=="dataType" || i=="callback") continue; //忽略控制 if(json[i] == undefined || json[i] == null) continue; //传递过来的对象和函数不在提交之列 if (!((typeof json[i]).toLowerCase() == "function" || (typeof json[i]).toLowerCase() == "object")) { strArr.push( encodeURIComponent(i) + "="+encodeURIComponent(json[i]) ); } else if (utils.isArray(json[i])) { //支持传数组内容 for(var j = 0; j < json[i].length; j++) { strArr.push( encodeURIComponent(i) + "[]="+encodeURIComponent(json[i][j]) ); } } } return strArr.join("&"); } function doAjax(url, ajaxOptions) { var xhr = creatAjaxRequest(), //是否超时 timeIsOut = false, //默认参数 defaultAjaxOptions = { method:"POST", timeout:5000, async:true, data:{},//需要传递对象的话只能覆盖 onsuccess:function() { }, onerror:function() { } }; if (typeof url === "object") { ajaxOptions = url; url = ajaxOptions.url; } if (!xhr || !url) return; var ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions,ajaxOptions) : defaultAjaxOptions; var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 if (!utils.isEmptyObject(ajaxOpts.data)){ submitStr += (submitStr? "&":"") + json2str(ajaxOpts.data); } //超时检测 var timerID = setTimeout(function() { if (xhr.readyState != 4) { timeIsOut = true; xhr.abort(); clearTimeout(timerID); } }, ajaxOpts.timeout); var method = ajaxOpts.method.toUpperCase(); var str = url + (url.indexOf("?")==-1?"?":"&") + (method=="POST"?"":submitStr+ "&noCache=" + +new Date); xhr.open(method, str, ajaxOpts.async); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (!timeIsOut && xhr.status == 200) { ajaxOpts.onsuccess(xhr); } else { ajaxOpts.onerror(xhr); } } }; if (method == "POST") { xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send(submitStr); } else { xhr.send(null); } } function doJsonp(url, opts) { var successhandler = opts.onsuccess || function(){}, scr = document.createElement('SCRIPT'), options = opts || {}, charset = options['charset'], callbackField = options['jsonp'] || 'callback', callbackFnName, timeOut = options['timeOut'] || 0, timer, reg = new RegExp('(\\?|&)' + callbackField + '=([^&]*)'), matches; if (utils.isFunction(successhandler)) { callbackFnName = 'bd__editor__' + Math.floor(Math.random() * 2147483648).toString(36); window[callbackFnName] = getCallBack(0); } else if(utils.isString(successhandler)){ callbackFnName = successhandler; } else { if (matches = reg.exec(url)) { callbackFnName = matches[2]; } } url = url.replace(reg, '\x241' + callbackField + '=' + callbackFnName); if (url.search(reg) < 0) { url += (url.indexOf('?') < 0 ? '?' : '&') + callbackField + '=' + callbackFnName; } var queryStr = json2str(opts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 if (!utils.isEmptyObject(opts.data)){ queryStr += (queryStr? "&":"") + json2str(opts.data); } if (queryStr) { url = url.replace(/\?/, '?' + queryStr + '&'); } scr.onerror = getCallBack(1); if( timeOut ){ timer = setTimeout(getCallBack(1), timeOut); } createScriptTag(scr, url, charset); function createScriptTag(scr, url, charset) { scr.setAttribute('type', 'text/javascript'); scr.setAttribute('defer', 'defer'); charset && scr.setAttribute('charset', charset); scr.setAttribute('src', url); document.getElementsByTagName('head')[0].appendChild(scr); } function getCallBack(onTimeOut){ return function(){ try { if(onTimeOut){ options.onerror && options.onerror(); }else{ try{ clearTimeout(timer); successhandler.apply(window, arguments); } catch (e){} } } catch (exception) { options.onerror && options.onerror.call(window, exception); } finally { options.oncomplete && options.oncomplete.apply(window, arguments); scr.parentNode && scr.parentNode.removeChild(scr); window[callbackFnName] = null; try { delete window[callbackFnName]; }catch(e){} } } } } return { /** * 根据给定的参数项,向指定的url发起一个ajax请求。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调 * @method request * @param { URLString } url ajax请求的url地址 * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: * @example * ```javascript * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 * UE.ajax.requeset( 'sayhello.php', { * * //请求方法。可选值: 'GET', 'POST',默认值是'POST' * method: 'GET', * * //超时时间。 默认为5000, 单位是ms * timeout: 10000, * * //是否是异步请求。 true为异步请求, false为同步请求 * async: true, * * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 * data: { * name: 'ueditor' * }, * * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 * onsuccess: function ( xhr ) { * console.log( xhr.responseText ); * }, * * //请求失败或者超时后的回调。 * onerror: function ( xhr ) { * alert( 'Ajax请求失败' ); * } * * } ); * ``` */ /** * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 * @method request * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: * @example * ```javascript * * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 * UE.ajax.requeset( 'sayhello.php', { * * //请求的地址, 该项是必须的。 * url: 'sayhello.php' * * } ); * ``` */ request:function(url, opts) { if (opts && opts.dataType == 'jsonp') { doJsonp(url, opts); } else { doAjax(url, opts); } }, getJSONP:function(url, data, fn) { var opts = { 'data': data, 'oncomplete': fn }; doJsonp(url, opts); } }; }(); // core/filterword.js /** * UE过滤word的静态方法 * @file */ /** * UEditor公用空间,UEditor所有的功能都挂载在该空间下 * @module UE */ /** * 根据传入html字符串过滤word * @module UE * @since 1.2.6.1 * @method filterWord * @param { String } html html字符串 * @return { String } 已过滤后的结果字符串 * @example * ```javascript * UE.filterWord(html); * ``` */ var filterWord = UE.filterWord = function () { //是否是word过来的内容 function isWordDocument( str ) { return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/ig.test( str ); } //去掉小数 function transUnit( v ) { v = v.replace( /[\d.]+\w+/g, function ( m ) { return utils.transUnitToPx(m); } ); return v; } function filterPasteWord( str ) { return str.replace(/[\t\r\n]+/g,' ') .replace( //ig, "" ) //转换图片 .replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(str){ //opera能自己解析出image所这里直接返回空 if(browser.opera){ return ''; } try{ //有可能是bitmap占为图,无用,直接过滤掉,主要体现在粘贴excel表格中 if(/Bitmap/i.test(str)){ return ''; } var width = str.match(/width:([ \d.]*p[tx])/i)[1], height = str.match(/height:([ \d.]*p[tx])/i)[1], src = str.match(/src=\s*"([^"]*)"/i)[1]; return ''; } catch(e){ return ''; } }) //针对wps添加的多余标签处理 .replace(/<\/?div[^>]*>/g,'') //去掉多余的属性 .replace( /v:\w+=(["']?)[^'"]+\1/g, '' ) .replace( /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "" ) .replace( /

            ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

            $1

            " ) //去掉多余的属性 .replace( /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function(str,name,marks,val){ //保留list的标示 return name == 'class' && val == 'MsoListParagraph' ? str : '' }) //清除多余的font/span不能匹配 有可能是空格 .replace( /<(font|span)[^>]*>(\s*)<\/\1>/gi, function(a,b,c){ return c.replace(/[\t\r\n ]+/g,' ') }) //处理style的问题 .replace( /(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function( str, tag, tmp, style ) { var n = [], s = style.replace( /^\s+|\s+$/, '' ) .replace(/'/g,'\'') .replace( /"/gi, "'" ) .replace(/[\d.]+(cm|pt)/g,function(str){ return utils.transUnitToPx(str) }) .split( /;\s*/g ); for ( var i = 0,v; v = s[i];i++ ) { var name, value, parts = v.split( ":" ); if ( parts.length == 2 ) { name = parts[0].toLowerCase(); value = parts[1].toLowerCase(); if(/^(background)\w*/.test(name) && value.replace(/(initial|\s)/g,'').length == 0 || /^(margin)\w*/.test(name) && /^0\w+$/.test(value) ){ continue; } switch ( name ) { case "mso-padding-alt": case "mso-padding-top-alt": case "mso-padding-right-alt": case "mso-padding-bottom-alt": case "mso-padding-left-alt": case "mso-margin-alt": case "mso-margin-top-alt": case "mso-margin-right-alt": case "mso-margin-bottom-alt": case "mso-margin-left-alt": //ie下会出现挤到一起的情况 //case "mso-table-layout-alt": case "mso-height": case "mso-width": case "mso-vertical-align-alt": //trace:1819 ff下会解析出padding在table上 if(!/]/.test(html)) { return UE.htmlparser(html).children[0] } else { return new uNode({ type:'element', children:[], tagName:html }) } }; uNode.createText = function (data,noTrans) { return new UE.uNode({ type:'text', 'data':noTrans ? data : utils.unhtml(data || '') }) }; function nodeToHtml(node, arr, formatter, current) { switch (node.type) { case 'root': for (var i = 0, ci; ci = node.children[i++];) { //插入新行 if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { insertLine(arr, current, true); insertIndent(arr, current) } nodeToHtml(ci, arr, formatter, current) } break; case 'text': isText(node, arr); break; case 'element': isElement(node, arr, formatter, current); break; case 'comment': isComment(node, arr, formatter); } return arr; } function isText(node, arr) { if(node.parentNode.tagName == 'pre'){ //源码模式下输入html标签,不能做转换处理,直接输出 arr.push(node.data) }else{ arr.push(notTransTagName[node.parentNode.tagName] ? utils.html(node.data) : node.data.replace(/[ ]{2}/g,'  ')) } } function isElement(node, arr, formatter, current) { var attrhtml = ''; if (node.attrs) { attrhtml = []; var attrs = node.attrs; for (var a in attrs) { //这里就针对 //

            '

            //这里边的\"做转换,要不用innerHTML直接被截断了,属性src //有可能做的不够 attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) { return '"' }) : utils.unhtml(attrs[a])) + '"' : '')) } attrhtml = attrhtml.join(' '); } arr.push('<' + node.tagName + (attrhtml ? ' ' + attrhtml : '') + (dtd.$empty[node.tagName] ? '\/' : '' ) + '>' ); //插入新行 if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { if(node.children && node.children.length){ current = insertLine(arr, current, true); insertIndent(arr, current) } } if (node.children && node.children.length) { for (var i = 0, ci; ci = node.children[i++];) { if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { insertLine(arr, current); insertIndent(arr, current) } nodeToHtml(ci, arr, formatter, current) } } if (!dtd.$empty[node.tagName]) { if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { if(node.children && node.children.length){ current = insertLine(arr, current); insertIndent(arr, current) } } arr.push('<\/' + node.tagName + '>'); } } function isComment(node, arr) { arr.push(''); } function getNodeById(root, id) { var node; if (root.type == 'element' && root.getAttr('id') == id) { return root; } if (root.children && root.children.length) { for (var i = 0, ci; ci = root.children[i++];) { if (node = getNodeById(ci, id)) { return node; } } } } function getNodesByTagName(node, tagName, arr) { if (node.type == 'element' && node.tagName == tagName) { arr.push(node); } if (node.children && node.children.length) { for (var i = 0, ci; ci = node.children[i++];) { getNodesByTagName(ci, tagName, arr) } } } function nodeTraversal(root,fn){ if(root.children && root.children.length){ for(var i= 0,ci;ci=root.children[i];){ nodeTraversal(ci,fn); //ci被替换的情况,这里就不再走 fn了 if(ci.parentNode ){ if(ci.children && ci.children.length){ fn(ci) } if(ci.parentNode) i++ } } }else{ fn(root) } } uNode.prototype = { /** * 当前节点对象,转换成html文本 * @method toHtml * @return { String } 返回转换后的html字符串 * @example * ```javascript * node.toHtml(); * ``` */ /** * 当前节点对象,转换成html文本 * @method toHtml * @param { Boolean } formatter 是否格式化返回值 * @return { String } 返回转换后的html字符串 * @example * ```javascript * node.toHtml( true ); * ``` */ toHtml:function (formatter) { var arr = []; nodeToHtml(this, arr, formatter, 0); return arr.join('') }, /** * 获取节点的html内容 * @method innerHTML * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 * @return { String } 返回节点的html内容 * @example * ```javascript * var htmlstr = node.innerHTML(); * ``` */ /** * 设置节点的html内容 * @method innerHTML * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 * @param { String } htmlstr 传入要设置的html内容 * @return { UE.uNode } 返回节点本身 * @example * ```javascript * node.innerHTML('text'); * ``` */ innerHTML:function (htmlstr) { if (this.type != 'element' || dtd.$empty[this.tagName]) { return this; } if (utils.isString(htmlstr)) { if(this.children){ for (var i = 0, ci; ci = this.children[i++];) { ci.parentNode = null; } } this.children = []; var tmpRoot = UE.htmlparser(htmlstr); for (var i = 0, ci; ci = tmpRoot.children[i++];) { this.children.push(ci); ci.parentNode = this; } return this; } else { var tmpRoot = new UE.uNode({ type:'root', children:this.children }); return tmpRoot.toHtml(); } }, /** * 获取节点的纯文本内容 * @method innerText * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 * @return { String } 返回节点的存文本内容 * @example * ```javascript * var textStr = node.innerText(); * ``` */ /** * 设置节点的纯文本内容 * @method innerText * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 * @param { String } textStr 传入要设置的文本内容 * @return { UE.uNode } 返回节点本身 * @example * ```javascript * node.innerText('text'); * ``` */ innerText:function (textStr,noTrans) { if (this.type != 'element' || dtd.$empty[this.tagName]) { return this; } if (textStr) { if(this.children){ for (var i = 0, ci; ci = this.children[i++];) { ci.parentNode = null; } } this.children = []; this.appendChild(uNode.createText(textStr,noTrans)); return this; } else { return this.toHtml().replace(/<[^>]+>/g, ''); } }, /** * 获取当前对象的data属性 * @method getData * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 * @example * ```javascript * node.getData(); * ``` */ getData:function () { if (this.type == 'element') return ''; return this.data }, /** * 获取当前节点下的第一个子节点 * @method firstChild * @return { UE.uNode } 返回第一个子节点 * @example * ```javascript * node.firstChild(); //返回第一个子节点 * ``` */ firstChild:function () { // if (this.type != 'element' || dtd.$empty[this.tagName]) { // return this; // } return this.children ? this.children[0] : null; }, /** * 获取当前节点下的最后一个子节点 * @method lastChild * @return { UE.uNode } 返回最后一个子节点 * @example * ```javascript * node.lastChild(); //返回最后一个子节点 * ``` */ lastChild:function () { // if (this.type != 'element' || dtd.$empty[this.tagName] ) { // return this; // } return this.children ? this.children[this.children.length - 1] : null; }, /** * 获取和当前节点有相同父亲节点的前一个节点 * @method previousSibling * @return { UE.uNode } 返回前一个节点 * @example * ```javascript * node.children[2].previousSibling(); //返回子节点node.children[1] * ``` */ previousSibling : function(){ var parent = this.parentNode; for (var i = 0, ci; ci = parent.children[i]; i++) { if (ci === this) { return i == 0 ? null : parent.children[i-1]; } } }, /** * 获取和当前节点有相同父亲节点的后一个节点 * @method nextSibling * @return { UE.uNode } 返回后一个节点,找不到返回null * @example * ```javascript * node.children[2].nextSibling(); //如果有,返回子节点node.children[3] * ``` */ nextSibling : function(){ var parent = this.parentNode; for (var i = 0, ci; ci = parent.children[i++];) { if (ci === this) { return parent.children[i]; } } }, /** * 用新的节点替换当前节点 * @method replaceChild * @param { UE.uNode } target 要替换成该节点参数 * @param { UE.uNode } source 要被替换掉的节点 * @return { UE.uNode } 返回替换之后的节点对象 * @example * ```javascript * node.replaceChild(newNode, childNode); //用newNode替换childNode,childNode是node的子节点 * ``` */ replaceChild:function (target, source) { if (this.children) { if(target.parentNode){ target.parentNode.removeChild(target); } for (var i = 0, ci; ci = this.children[i]; i++) { if (ci === source) { this.children.splice(i, 1, target); source.parentNode = null; target.parentNode = this; return target; } } } }, /** * 在节点的子节点列表最后位置插入一个节点 * @method appendChild * @param { UE.uNode } node 要插入的节点 * @return { UE.uNode } 返回刚插入的子节点 * @example * ```javascript * node.appendChild( newNode ); //在node内插入子节点newNode * ``` */ appendChild:function (node) { if (this.type == 'root' || (this.type == 'element' && !dtd.$empty[this.tagName])) { if (!this.children) { this.children = [] } if(node.parentNode){ node.parentNode.removeChild(node); } for (var i = 0, ci; ci = this.children[i]; i++) { if (ci === node) { this.children.splice(i, 1); break; } } this.children.push(node); node.parentNode = this; return node; } }, /** * 在传入节点的前面插入一个节点 * @method insertBefore * @param { UE.uNode } target 要插入的节点 * @param { UE.uNode } source 在该参数节点前面插入 * @return { UE.uNode } 返回刚插入的子节点 * @example * ```javascript * node.parentNode.insertBefore(newNode, node); //在node节点后面插入newNode * ``` */ insertBefore:function (target, source) { if (this.children) { if(target.parentNode){ target.parentNode.removeChild(target); } for (var i = 0, ci; ci = this.children[i]; i++) { if (ci === source) { this.children.splice(i, 0, target); target.parentNode = this; return target; } } } }, /** * 在传入节点的后面插入一个节点 * @method insertAfter * @param { UE.uNode } target 要插入的节点 * @param { UE.uNode } source 在该参数节点后面插入 * @return { UE.uNode } 返回刚插入的子节点 * @example * ```javascript * node.parentNode.insertAfter(newNode, node); //在node节点后面插入newNode * ``` */ insertAfter:function (target, source) { if (this.children) { if(target.parentNode){ target.parentNode.removeChild(target); } for (var i = 0, ci; ci = this.children[i]; i++) { if (ci === source) { this.children.splice(i + 1, 0, target); target.parentNode = this; return target; } } } }, /** * 从当前节点的子节点列表中,移除节点 * @method removeChild * @param { UE.uNode } node 要移除的节点引用 * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 * @return { * } 返回刚移除的子节点 * @example * ```javascript * node.removeChild(childNode,true); //在node的子节点列表中移除child节点,并且吧child的子节点插入到移除的位置 * ``` */ removeChild:function (node,keepChildren) { if (this.children) { for (var i = 0, ci; ci = this.children[i]; i++) { if (ci === node) { this.children.splice(i, 1); ci.parentNode = null; if(keepChildren && ci.children && ci.children.length){ for(var j= 0,cj;cj=ci.children[j];j++){ this.children.splice(i+j,0,cj); cj.parentNode = this; } } return ci; } } } }, /** * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 * @method getAttr * @param { String } attrName 要获取的属性名称 * @return { * } 返回attrs对象下的属性值 * @example * ```javascript * node.getAttr('title'); * ``` */ getAttr:function (attrName) { return this.attrs && this.attrs[attrName.toLowerCase()] }, /** * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 * @method setAttr * @param { String } attrName 要设置的属性名称 * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 * @return { * } 返回attrs对象下的属性值 * @example * ```javascript * node.setAttr('title','标题'); * ``` */ setAttr:function (attrName, attrVal) { if (!attrName) { delete this.attrs; return; } if(!this.attrs){ this.attrs = {}; } if (utils.isObject(attrName)) { for (var a in attrName) { if (!attrName[a]) { delete this.attrs[a] } else { this.attrs[a.toLowerCase()] = attrName[a]; } } } else { if (!attrVal) { delete this.attrs[attrName] } else { this.attrs[attrName.toLowerCase()] = attrVal; } } }, /** * 获取当前节点在父节点下的位置索引 * @method getIndex * @return { Number } 返回索引数值,如果没有父节点,返回-1 * @example * ```javascript * node.getIndex(); * ``` */ getIndex:function(){ var parent = this.parentNode; for(var i= 0,ci;ci=parent.children[i];i++){ if(ci === this){ return i; } } return -1; }, /** * 在当前节点下,根据id查找节点 * @method getNodeById * @param { String } id 要查找的id * @return { UE.uNode } 返回找到的节点 * @example * ```javascript * node.getNodeById('textId'); * ``` */ getNodeById:function (id) { var node; if (this.children && this.children.length) { for (var i = 0, ci; ci = this.children[i++];) { if (node = getNodeById(ci, id)) { return node; } } } }, /** * 在当前节点下,根据元素名称查找节点列表 * @method getNodesByTagName * @param { String } tagNames 要查找的元素名称 * @return { Array } 返回找到的节点列表 * @example * ```javascript * node.getNodesByTagName('span'); * ``` */ getNodesByTagName:function (tagNames) { tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, ' ').split(' '); var arr = [], me = this; utils.each(tagNames, function (tagName) { if (me.children && me.children.length) { for (var i = 0, ci; ci = me.children[i++];) { getNodesByTagName(ci, tagName, arr) } } }); return arr; }, /** * 根据样式名称,获取节点的样式值 * @method getStyle * @param { String } name 要获取的样式名称 * @return { String } 返回样式值 * @example * ```javascript * node.getStyle('font-size'); * ``` */ getStyle:function (name) { var cssStyle = this.getAttr('style'); if (!cssStyle) { return '' } var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+)','i'); var match = cssStyle.match(reg); if (match && match[0]) { return match[2] } return ''; }, /** * 给节点设置样式 * @method setStyle * @param { String } name 要设置的的样式名称 * @param { String } val 要设置的的样值 * @example * ```javascript * node.setStyle('font-size', '12px'); * ``` */ setStyle:function (name, val) { function exec(name, val) { var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+;?)', 'gi'); cssStyle = cssStyle.replace(reg, '$1'); if (val) { cssStyle = name + ':' + utils.unhtml(val) + ';' + cssStyle } } var cssStyle = this.getAttr('style'); if (!cssStyle) { cssStyle = ''; } if (utils.isObject(name)) { for (var a in name) { exec(a, name[a]) } } else { exec(name, val) } this.setAttr('style', utils.trim(cssStyle)) }, /** * 传入一个函数,递归遍历当前节点下的所有节点 * @method traversal * @param { Function } fn 遍历到节点的时,传入节点作为参数,运行此函数 * @example * ```javascript * traversal(node, function(){ * console.log(node.type); * }); * ``` */ traversal:function(fn){ if(this.children && this.children.length){ nodeTraversal(this,fn); } return this; } } })(); // core/htmlparser.js /** * html字符串转换成uNode节点 * @file * @module UE * @since 1.2.6.1 */ /** * UEditor公用空间,UEditor所有的功能都挂载在该空间下 * @unfile * @module UE */ /** * html字符串转换成uNode节点的静态方法 * @method htmlparser * @param { String } htmlstr 要转换的html代码 * @param { Boolean } ignoreBlank 若设置为true,转换的时候忽略\n\r\t等空白字符 * @return { uNode } 给定的html片段转换形成的uNode对象 * @example * ```javascript * var root = UE.htmlparser('

            htmlparser

            ', true); * ``` */ var htmlparser = UE.htmlparser = function (htmlstr,ignoreBlank) { //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 ') } html.push('') } //禁止指定table-width //return '
            这样的标签了 //先去掉了,加上的原因忘了,这里先记录 var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; //ie下取得的html可能会有\n存在,要去掉,在处理replace(/[\t\r\n]*/g,'');代码高量的\n不能去除 var allowEmptyTags = { b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1, sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1 }; htmlstr = htmlstr ? htmlstr.replace(new RegExp(domUtils.fillChar, 'g'), '') : ''; if(!ignoreBlank){ htmlstr = htmlstr.replace(new RegExp('[\\r\\t\\n'+(ignoreBlank?'':' ')+']*<\/?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n'+(ignoreBlank?'':' ')+']*','g'), function(a,b){ //br暂时单独处理 if(b && allowEmptyTags[b.toLowerCase()]){ return a.replace(/(^[\n\r]+)|([\n\r]+$)/g,''); } return a.replace(new RegExp('^[\\r\\n'+(ignoreBlank?'':' ')+']+'),'').replace(new RegExp('[\\r\\n'+(ignoreBlank?'':' ')+']+$'),''); }); } var notTransAttrs = { 'href':1, 'src':1 }; var uNode = UE.uNode, needParentNode = { 'td':'tr', 'tr':['tbody','thead','tfoot'], 'tbody':'table', 'th':'tr', 'thead':'table', 'tfoot':'table', 'caption':'table', 'li':['ul', 'ol'], 'dt':'dl', 'dd':'dl', 'option':'select' }, needChild = { 'ol':'li', 'ul':'li' }; function text(parent, data) { if(needChild[parent.tagName]){ var tmpNode = uNode.createElement(needChild[parent.tagName]); parent.appendChild(tmpNode); tmpNode.appendChild(uNode.createText(data)); parent = tmpNode; }else{ parent.appendChild(uNode.createText(data)); } } function element(parent, tagName, htmlattr) { var needParentTag; if (needParentTag = needParentNode[tagName]) { var tmpParent = parent,hasParent; while(tmpParent.type != 'root'){ if(utils.isArray(needParentTag) ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 : needParentTag == tmpParent.tagName){ parent = tmpParent; hasParent = true; break; } tmpParent = tmpParent.parentNode; } if(!hasParent){ parent = element(parent, utils.isArray(needParentTag) ? needParentTag[0] : needParentTag) } } //按dtd处理嵌套 // if(parent.type != 'root' && !dtd[parent.tagName][tagName]) // parent = parent.parentNode; var elm = new uNode({ parentNode:parent, type:'element', tagName:tagName.toLowerCase(), //是自闭合的处理一下 children:dtd.$empty[tagName] ? null : [] }); //如果属性存在,处理属性 if (htmlattr) { var attrs = {}, match; while (match = re_attr.exec(htmlattr)) { attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] ? (match[2] || match[3] || match[4]) : utils.unhtml(match[2] || match[3] || match[4]) } elm.attrs = attrs; } //trace:3970 // //如果parent下不能放elm // if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){ // parent = parent.parentNode; // elm.parentNode = parent; // } parent.children.push(elm); //如果是自闭合节点返回父亲节点 return dtd.$empty[tagName] ? parent : elm } function comment(parent, data) { parent.children.push(new uNode({ type:'comment', data:data, parentNode:parent })); } var match, currentIndex = 0, nextIndex = 0; //设置根节点 var root = new uNode({ type:'root', children:[] }); var currentParent = root; while (match = re_tag.exec(htmlstr)) { currentIndex = match.index; try{ if (currentIndex > nextIndex) { //text node text(currentParent, htmlstr.slice(nextIndex, currentIndex)); } if (match[3]) { if(dtd.$cdata[currentParent.tagName]){ text(currentParent, match[0]); }else{ //start tag currentParent = element(currentParent, match[3].toLowerCase(), match[4]); } } else if (match[1]) { if(currentParent.type != 'root'){ if(dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]){ text(currentParent, match[0]); }else{ var tmpParent = currentParent; while(currentParent.type == 'element' && currentParent.tagName != match[1].toLowerCase()){ currentParent = currentParent.parentNode; if(currentParent.type == 'root'){ currentParent = tmpParent; throw 'break' } } //end tag currentParent = currentParent.parentNode; } } } else if (match[2]) { //comment comment(currentParent, match[2]) } }catch(e){} nextIndex = re_tag.lastIndex; } //如果结束是文本,就有可能丢掉,所以这里手动判断一下 //例如
          • sdfsdfsdf
          • sdfsdfsdfsdf if (nextIndex < htmlstr.length) { text(currentParent, htmlstr.slice(nextIndex)); } return root; }; // core/filternode.js /** * UE过滤节点的静态方法 * @file */ /** * UEditor公用空间,UEditor所有的功能都挂载在该空间下 * @module UE */ /** * 根据传入节点和过滤规则过滤相应节点 * @module UE * @since 1.2.6.1 * @method filterNode * @param { Object } root 指定root节点 * @param { Object } rules 过滤规则json对象 * @example * ```javascript * UE.filterNode(root,editor.options.filterRules); * ``` */ var filterNode = UE.filterNode = function () { function filterNode(node,rules){ switch (node.type) { case 'text': break; case 'element': var val; if(val = rules[node.tagName]){ if(val === '-'){ node.parentNode.removeChild(node) }else if(utils.isFunction(val)){ var parentNode = node.parentNode, index = node.getIndex(); val(node); if(node.parentNode){ if(node.children){ for(var i = 0,ci;ci=node.children[i];){ filterNode(ci,rules); if(ci.parentNode){ i++; } } } }else{ for(var i = index,ci;ci=parentNode.children[i];){ filterNode(ci,rules); if(ci.parentNode){ i++; } } } }else{ var attrs = val['$']; if(attrs && node.attrs){ var tmpAttrs = {},tmpVal; for(var a in attrs){ tmpVal = node.getAttr(a); //todo 只先对style单独处理 if(a == 'style' && utils.isArray(attrs[a])){ var tmpCssStyle = []; utils.each(attrs[a],function(v){ var tmp; if(tmp = node.getStyle(v)){ tmpCssStyle.push(v + ':' + tmp); } }); tmpVal = tmpCssStyle.join(';') } if(tmpVal){ tmpAttrs[a] = tmpVal; } } node.attrs = tmpAttrs; } if(node.children){ for(var i = 0,ci;ci=node.children[i];){ filterNode(ci,rules); if(ci.parentNode){ i++; } } } } }else{ //如果不在名单里扣出子节点并删除该节点,cdata除外 if(dtd.$cdata[node.tagName]){ node.parentNode.removeChild(node) }else{ var parentNode = node.parentNode, index = node.getIndex(); node.parentNode.removeChild(node,true); for(var i = index,ci;ci=parentNode.children[i];){ filterNode(ci,rules); if(ci.parentNode){ i++; } } } } break; case 'comment': node.parentNode.removeChild(node) } } return function(root,rules){ if(utils.isEmptyObject(rules)){ return root; } var val; if(val = rules['-']){ utils.each(val.split(' '),function(k){ rules[k] = '-' }) } for(var i= 0,ci;ci=root.children[i];){ filterNode(ci,rules); if(ci.parentNode){ i++; } } return root; } }(); // core/plugin.js /** * Created with JetBrains PhpStorm. * User: campaign * Date: 10/8/13 * Time: 6:15 PM * To change this template use File | Settings | File Templates. */ UE.plugin = function(){ var _plugins = {}; return { register : function(pluginName,fn,oldOptionName,afterDisabled){ if(oldOptionName && utils.isFunction(oldOptionName)){ afterDisabled = oldOptionName; oldOptionName = null } _plugins[pluginName] = { optionName : oldOptionName || pluginName, execFn : fn, //当插件被禁用时执行 afterDisabled : afterDisabled } }, load : function(editor){ utils.each(_plugins,function(plugin){ var _export = plugin.execFn.call(editor); if(editor.options[plugin.optionName] !== false){ if(_export){ //后边需要再做扩展 utils.each(_export,function(v,k){ switch(k.toLowerCase()){ case 'shortcutkey': editor.addshortcutkey(v); break; case 'bindevents': utils.each(v,function(fn,eventName){ editor.addListener(eventName,fn); }); break; case 'bindmultievents': utils.each(utils.isArray(v) ? v:[v],function(event){ var types = utils.trim(event.type).split(/\s+/); utils.each(types,function(eventName){ editor.addListener(eventName, event.handler); }); }); break; case 'commands': utils.each(v,function(execFn,execName){ editor.commands[execName] = execFn }); break; case 'outputrule': editor.addOutputRule(v); break; case 'inputrule': editor.addInputRule(v); break; case 'defaultoptions': editor.setOpt(v) } }) } }else if(plugin.afterDisabled){ plugin.afterDisabled.call(editor) } }); //向下兼容 utils.each(UE.plugins,function(plugin){ plugin.call(editor); }); }, run : function(pluginName,editor){ var plugin = _plugins[pluginName]; if(plugin){ plugin.exeFn.call(editor) } } } }(); // core/keymap.js var keymap = UE.keymap = { 'Backspace' : 8, 'Tab' : 9, 'Enter' : 13, 'Shift':16, 'Control':17, 'Alt':18, 'CapsLock':20, 'Esc':27, 'Spacebar':32, 'PageUp':33, 'PageDown':34, 'End':35, 'Home':36, 'Left':37, 'Up':38, 'Right':39, 'Down':40, 'Insert':45, 'Del':46, 'NumLock':144, 'Cmd':91, '=':187, '-':189, "b":66, 'i':73, //回退 'z':90, 'y':89, //粘贴 'v' : 86, 'x' : 88, 's' : 83, 'n' : 78 }; // core/localstorage.js //存储媒介封装 var LocalStorage = UE.LocalStorage = (function () { var storage = window.localStorage || getUserData() || null, LOCAL_FILE = 'localStorage'; return { saveLocalData: function (key, data) { if (storage && data) { storage.setItem(key, data); return true; } return false; }, getLocalData: function (key) { if (storage) { return storage.getItem(key); } return null; }, removeItem: function (key) { storage && storage.removeItem(key); } }; function getUserData() { var container = document.createElement("div"); container.style.display = "none"; if (!container.addBehavior) { return null; } container.addBehavior("#default#userdata"); return { getItem: function (key) { var result = null; try { document.body.appendChild(container); container.load(LOCAL_FILE); result = container.getAttribute(key); document.body.removeChild(container); } catch (e) { } return result; }, setItem: function (key, value) { document.body.appendChild(container); container.setAttribute(key, value); container.save(LOCAL_FILE); document.body.removeChild(container); }, //// 暂时没有用到 //clear: function () { // // var expiresTime = new Date(); // expiresTime.setFullYear(expiresTime.getFullYear() - 1); // document.body.appendChild(container); // container.expires = expiresTime.toUTCString(); // container.save(LOCAL_FILE); // document.body.removeChild(container); // //}, removeItem: function (key) { document.body.appendChild(container); container.removeAttribute(key); container.save(LOCAL_FILE); document.body.removeChild(container); } }; } })(); (function () { var ROOTKEY = 'ueditor_preference'; UE.Editor.prototype.setPreferences = function(key,value){ var obj = {}; if (utils.isString(key)) { obj[ key ] = value; } else { obj = key; } var data = LocalStorage.getLocalData(ROOTKEY); if (data && (data = utils.str2json(data))) { utils.extend(data, obj); } else { data = obj; } data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); }; UE.Editor.prototype.getPreferences = function(key){ var data = LocalStorage.getLocalData(ROOTKEY); if (data && (data = utils.str2json(data))) { return key ? data[key] : data } return null; }; UE.Editor.prototype.removePreferences = function (key) { var data = LocalStorage.getLocalData(ROOTKEY); if (data && (data = utils.str2json(data))) { data[key] = undefined; delete data[key] } data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); }; })(); // plugins/defaultfilter.js ///import core ///plugin 编辑器默认的过滤转换机制 UE.plugins['defaultfilter'] = function () { var me = this; me.setOpt({ 'allowDivTransToP':true, 'disabledTableInTable':true }); //默认的过滤处理 //进入编辑器的内容处理 me.addInputRule(function (root) { var allowDivTransToP = this.options.allowDivTransToP; var val; function tdParent(node){ while(node && node.type == 'element'){ if(node.tagName == 'td'){ return true; } node = node.parentNode; } return false; } //进行默认的处理 root.traversal(function (node) { if (node.type == 'element') { if (!dtd.$cdata[node.tagName] && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { if (!node.firstChild()) node.parentNode.removeChild(node); else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { node.parentNode.removeChild(node, true) } return; } switch (node.tagName) { case 'style': case 'script': node.setAttr({ cdata_tag: node.tagName, cdata_data: (node.innerHTML() || ''), '_ue_custom_node_':'true' }); node.tagName = 'div'; node.innerHTML(''); break; case 'a': if (val = node.getAttr('href')) { node.setAttr('_href', val) } break; case 'img': //todo base64暂时去掉,后边做远程图片上传后,干掉这个 if (val = node.getAttr('src')) { if (/^data:/.test(val)) { node.parentNode.removeChild(node); break; } } node.setAttr('_src', node.getAttr('src')); break; case 'span': if (browser.webkit && (val = node.getStyle('white-space'))) { if (/nowrap|normal/.test(val)) { node.setStyle('white-space', ''); if (me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs)) { node.parentNode.removeChild(node, true) } } } val = node.getAttr('id'); if(val && /^_baidu_bookmark_/i.test(val)){ node.parentNode.removeChild(node) } break; case 'p': if (val = node.getAttr('align')) { node.setAttr('align'); node.setStyle('text-align', val) } //trace:3431 // var cssStyle = node.getAttr('style'); // if (cssStyle) { // cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, ''); // node.setAttr('style', cssStyle) // // } //p标签不允许嵌套 utils.each(node.children,function(n){ if(n.type == 'element' && n.tagName == 'p'){ var next = n.nextSibling(); node.parentNode.insertAfter(n,node); var last = n; while(next){ var tmp = next.nextSibling(); node.parentNode.insertAfter(next,last); last = next; next = tmp; } return false; } }); if (!node.firstChild()) { node.innerHTML(browser.ie ? ' ' : '
            ') } break; case 'div': if(node.getAttr('cdata_tag')){ break; } //针对代码这里不处理插入代码的div val = node.getAttr('class'); if(val && /^line number\d+/.test(val)){ break; } if(!allowDivTransToP){ break; } var tmpNode, p = UE.uNode.createElement('p'); while (tmpNode = node.firstChild()) { if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { p.appendChild(tmpNode); } else { if (p.firstChild()) { node.parentNode.insertBefore(p, node); p = UE.uNode.createElement('p'); } else { node.parentNode.insertBefore(tmpNode, node); } } } if (p.firstChild()) { node.parentNode.insertBefore(p, node); } node.parentNode.removeChild(node); break; case 'dl': node.tagName = 'ul'; break; case 'dt': case 'dd': node.tagName = 'li'; break; case 'li': var className = node.getAttr('class'); if (!className || !/list\-/.test(className)) { node.setAttr() } var tmpNodes = node.getNodesByTagName('ol ul'); UE.utils.each(tmpNodes, function (n) { node.parentNode.insertAfter(n, node); }); break; case 'td': case 'th': case 'caption': if(!node.children || !node.children.length){ node.appendChild(browser.ie11below ? UE.uNode.createText(' ') : UE.uNode.createElement('br')) } break; case 'table': if(me.options.disabledTableInTable && tdParent(node)){ node.parentNode.insertBefore(UE.uNode.createText(node.innerText()),node); node.parentNode.removeChild(node) } } } // if(node.type == 'comment'){ // node.parentNode.removeChild(node); // } }) }); //从编辑器出去的内容处理 me.addOutputRule(function (root) { var val; root.traversal(function (node) { if (node.type == 'element') { if (me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { if (!node.firstChild()) node.parentNode.removeChild(node); else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { node.parentNode.removeChild(node, true) } return; } switch (node.tagName) { case 'div': if (val = node.getAttr('cdata_tag')) { node.tagName = val; node.appendChild(UE.uNode.createText(node.getAttr('cdata_data'))); node.setAttr({cdata_tag: '', cdata_data: '','_ue_custom_node_':''}); } break; case 'a': if (val = node.getAttr('_href')) { node.setAttr({ 'href': utils.html(val), '_href': '' }) } break; break; case 'span': val = node.getAttr('id'); if(val && /^_baidu_bookmark_/i.test(val)){ node.parentNode.removeChild(node) } break; case 'img': if (val = node.getAttr('_src')) { node.setAttr({ 'src': node.getAttr('_src'), '_src': '' }) } } } }) }); }; // plugins/inserthtml.js /** * 插入html字符串插件 * @file * @since 1.2.6.1 */ /** * 插入html代码 * @command inserthtml * @method execCommand * @param { String } cmd 命令字符串 * @param { String } html 插入的html字符串 * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 * @example * ```javascript * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 * //执行命令,插入CC * //插入后的效果 xxxCCxxx * //

            xx|xxx

            当前选区为闭合状态 * //插入

            CC

            * //结果

            xx

            CC

            xxx

            * //

            xxxx

            |

            xxx

            当前选区在两个p标签之间 * //插入 xxxx * //结果

            xxxx

            xxxx

            xxx

            * ``` */ UE.commands['inserthtml'] = { execCommand: function (command,html,notNeedFilter){ var me = this, range, div; if(!html){ return; } if(me.fireEvent('beforeinserthtml',html) === true){ return; } range = me.selection.getRange(); div = range.document.createElement( 'div' ); div.style.display = 'inline'; if (!notNeedFilter) { var root = UE.htmlparser(html); //如果给了过滤规则就先进行过滤 if(me.options.filterRules){ UE.filterNode(root,me.options.filterRules); } //执行默认的处理 me.filterInputRule(root); html = root.toHtml() } div.innerHTML = utils.trim( html ); if ( !range.collapsed ) { var tmpNode = range.startContainer; if(domUtils.isFillChar(tmpNode)){ range.setStartBefore(tmpNode) } tmpNode = range.endContainer; if(domUtils.isFillChar(tmpNode)){ range.setEndAfter(tmpNode) } range.txtToElmBoundary(); //结束边界可能放到了br的前边,要把br包含进来 // x[xxx]
            if(range.endContainer && range.endContainer.nodeType == 1){ tmpNode = range.endContainer.childNodes[range.endOffset]; if(tmpNode && domUtils.isBr(tmpNode)){ range.setEndAfter(tmpNode); } } if(range.startOffset == 0){ tmpNode = range.startContainer; if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ tmpNode = range.endContainer; if(range.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ me.body.innerHTML = '

            '+(browser.ie ? '' : '
            ')+'

            '; range.setStart(me.body.firstChild,0).collapse(true) } } } !range.collapsed && range.deleteContents(); if(range.startContainer.nodeType == 1){ var child = range.startContainer.childNodes[range.startOffset],pre; if(child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)){ range.setEnd(pre,pre.childNodes.length).collapse(); while(child.firstChild){ pre.appendChild(child.firstChild); } domUtils.remove(child); } } } var child,parent,pre,tmp,hadBreak = 0, nextNode; //如果当前位置选中了fillchar要干掉,要不会产生空行 if(range.inFillChar()){ child = range.startContainer; if(domUtils.isFillChar(child)){ range.setStartBefore(child).collapse(true); domUtils.remove(child); }else if(domUtils.isFillChar(child,true)){ child.nodeValue = child.nodeValue.replace(fillCharReg,''); range.startOffset--; range.collapsed && range.collapse(true) } } //列表单独处理 var li = domUtils.findParentByTagName(range.startContainer,'li',true); if(li){ var next,last; while(child = div.firstChild){ //针对hr单独处理一下先 while(child && (child.nodeType == 3 || !domUtils.isBlockElm(child) || child.tagName=='HR' )){ next = child.nextSibling; range.insertNode( child).collapse(); last = child; child = next; } if(child){ if(/^(ol|ul)$/i.test(child.tagName)){ while(child.firstChild){ last = child.firstChild; domUtils.insertAfter(li,child.firstChild); li = li.nextSibling; } domUtils.remove(child) }else{ var tmpLi; next = child.nextSibling; tmpLi = me.document.createElement('li'); domUtils.insertAfter(li,tmpLi); tmpLi.appendChild(child); last = child; child = next; li = tmpLi; } } } li = domUtils.findParentByTagName(range.startContainer,'li',true); if(domUtils.isEmptyBlock(li)){ domUtils.remove(li) } if(last){ range.setStartAfter(last).collapse(true).select(true) } }else{ while ( child = div.firstChild ) { if(hadBreak){ var p = me.document.createElement('p'); while(child && (child.nodeType == 3 || !dtd.$block[child.tagName])){ nextNode = child.nextSibling; p.appendChild(child); child = nextNode; } if(p.firstChild){ child = p } } range.insertNode( child ); nextNode = child.nextSibling; if ( !hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm( child ) ){ parent = domUtils.findParent( child,function ( node ){ return domUtils.isBlockElm( node ); } ); if ( parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)){ if(!dtd[parent.tagName][child.nodeName]){ pre = parent; }else{ tmp = child.parentNode; while (tmp !== parent){ pre = tmp; tmp = tmp.parentNode; } } domUtils.breakParent( child, pre || tmp ); //去掉break后前一个多余的节点

            |<[p> ==>

            |

            var pre = child.previousSibling; domUtils.trimWhiteTextNode(pre); if(!pre.childNodes.length){ domUtils.remove(pre); } //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位 if(!browser.ie && (next = child.nextSibling) && domUtils.isBlockElm(next) && next.lastChild && !domUtils.isBr(next.lastChild)){ next.appendChild(me.document.createElement('br')); } hadBreak = 1; } } var next = child.nextSibling; if(!div.firstChild && next && domUtils.isBlockElm(next)){ range.setStart(next,0).collapse(true); break; } range.setEndAfter( child ).collapse(); } child = range.startContainer; if(nextNode && domUtils.isBr(nextNode)){ domUtils.remove(nextNode) } //用chrome可能有空白展位符 if(domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)){ if(nextNode = child.nextSibling){ domUtils.remove(child); if(nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]){ range.setStart(nextNode,0).collapse(true).shrinkBoundary() } }else{ try{ child.innerHTML = browser.ie ? domUtils.fillChar : '
            '; }catch(e){ range.setStartBefore(child); domUtils.remove(child) } } } //加上true因为在删除表情等时会删两次,第一次是删的fillData try{ range.select(true); }catch(e){} } setTimeout(function(){ range = me.selection.getRange(); range.scrollToView(me.autoHeightEnabled,me.autoHeightEnabled ? domUtils.getXY(me.iframe).y:0); me.fireEvent('afterinserthtml', html); },200); } }; // plugins/autotypeset.js /** * 自动排版 * @file * @since 1.2.6.1 */ /** * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 * @command autotypeset * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'autotypeset' ); * ``` */ UE.plugins['autotypeset'] = function(){ this.setOpt({'autotypeset': { mergeEmptyline: true, //合并空行 removeClass: true, //去掉冗余的class removeEmptyline: false, //去掉空行 textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 pasteFilter: false, //根据规则过滤没事粘贴进来的内容 clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 removeEmptyNode: false, // 去掉空节点 //可以去掉的标签 removeTagNames: utils.extend({div:1},dtd.$removeEmpty), indent: false, // 行首缩进 indentValue : '2em', //行首缩进的大小 bdc2sb: false, tobdc: false }}); var me = this, opt = me.options.autotypeset, remainClass = { 'selectTdClass':1, 'pagebreak':1, 'anchorclass':1 }, remainTag = { 'li':1 }, tags = { div:1, p:1, //trace:2183 这些也认为是行 blockquote:1,center:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1, span:1 }, highlightCont; //升级了版本,但配置项目里没有autotypeset if(!opt){ return; } readLocalOpts(); function isLine(node,notEmpty){ if(!node || node.nodeType == 3) return 0; if(domUtils.isBr(node)) return 1; if(node && node.parentNode && tags[node.tagName.toLowerCase()]){ if(highlightCont && highlightCont.contains(node) || node.getAttribute('pagebreak') ){ return 0; } return notEmpty ? !domUtils.isEmptyBlock(node) : domUtils.isEmptyBlock(node,new RegExp('[\\s'+domUtils.fillChar +']','g')); } } function removeNotAttributeSpan(node){ if(!node.style.cssText){ domUtils.removeAttributes(node,['style']); if(node.tagName.toLowerCase() == 'span' && domUtils.hasNoAttributes(node)){ domUtils.remove(node,true); } } } function autotype(type,html){ var me = this,cont; if(html){ if(!opt.pasteFilter){ return; } cont = me.document.createElement('div'); cont.innerHTML = html.html; }else{ cont = me.document.body; } var nodes = domUtils.getElementsByTagName(cont,'*'); // 行首缩进,段落方向,段间距,段内间距 for(var i=0,ci;ci=nodes[i++];){ if(me.fireEvent('excludeNodeinautotype',ci) === true){ continue; } //font-size if(opt.clearFontSize && ci.style.fontSize){ domUtils.removeStyle(ci,'font-size'); removeNotAttributeSpan(ci); } //font-family if(opt.clearFontFamily && ci.style.fontFamily){ domUtils.removeStyle(ci,'font-family'); removeNotAttributeSpan(ci); } if(isLine(ci)){ //合并空行 if(opt.mergeEmptyline ){ var next = ci.nextSibling,tmpNode,isBr = domUtils.isBr(ci); while(isLine(next)){ tmpNode = next; next = tmpNode.nextSibling; if(isBr && (!next || next && !domUtils.isBr(next))){ break; } domUtils.remove(tmpNode); } } //去掉空行,保留占位的空行 if(opt.removeEmptyline && domUtils.inDoc(ci,cont) && !remainTag[ci.parentNode.tagName.toLowerCase()] ){ if(domUtils.isBr(ci)){ next = ci.nextSibling; if(next && !domUtils.isBr(next)){ continue; } } domUtils.remove(ci); continue; } } if(isLine(ci,true) && ci.tagName != 'SPAN'){ if(opt.indent){ ci.style.textIndent = opt.indentValue; } if(opt.textAlign){ ci.style.textAlign = opt.textAlign; } // if(opt.lineHeight) // ci.style.lineHeight = opt.lineHeight + 'cm'; } //去掉class,保留的class不去掉 if(opt.removeClass && ci.className && !remainClass[ci.className.toLowerCase()]){ if(highlightCont && highlightCont.contains(ci)){ continue; } domUtils.removeAttributes(ci,['class']); } //表情不处理 if(opt.imageBlockLine && ci.tagName.toLowerCase() == 'img' && !ci.getAttribute('emotion')){ if(html){ var img = ci; switch (opt.imageBlockLine){ case 'left': case 'right': case 'none': var pN = img.parentNode,tmpNode,pre,next; while(dtd.$inline[pN.tagName] || pN.tagName == 'A'){ pN = pN.parentNode; } tmpNode = pN; if(tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode,'text-align') == 'center'){ if(!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1){ pre = tmpNode.previousSibling; next = tmpNode.nextSibling; if(pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)){ pre.appendChild(tmpNode.firstChild); while(next.firstChild){ pre.appendChild(next.firstChild); } domUtils.remove(tmpNode); domUtils.remove(next); }else{ domUtils.setStyle(tmpNode,'text-align',''); } } } domUtils.setStyle(img,'float', opt.imageBlockLine); break; case 'center': if(me.queryCommandValue('imagefloat') != 'center'){ pN = img.parentNode; domUtils.setStyle(img,'float','none'); tmpNode = img; while(pN && domUtils.getChildCount(pN,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1 && (dtd.$inline[pN.tagName] || pN.tagName == 'A')){ tmpNode = pN; pN = pN.parentNode; } var pNode = me.document.createElement('p'); domUtils.setAttributes(pNode,{ style:'text-align:center' }); tmpNode.parentNode.insertBefore(pNode,tmpNode); pNode.appendChild(tmpNode); domUtils.setStyle(tmpNode,'float',''); } } } else { var range = me.selection.getRange(); range.selectNode(ci).select(); me.execCommand('imagefloat', opt.imageBlockLine); } } //去掉冗余的标签 if(opt.removeEmptyNode){ if(opt.removeTagNames[ci.tagName.toLowerCase()] && domUtils.hasNoAttributes(ci) && domUtils.isEmptyBlock(ci)){ domUtils.remove(ci); } } } if(opt.tobdc){ var root = UE.htmlparser(cont.innerHTML); root.traversal(function(node){ if(node.type == 'text'){ node.data = ToDBC(node.data) } }); cont.innerHTML = root.toHtml() } if(opt.bdc2sb){ var root = UE.htmlparser(cont.innerHTML); root.traversal(function(node){ if(node.type == 'text'){ node.data = DBC2SB(node.data) } }); cont.innerHTML = root.toHtml() } if(html){ html.html = cont.innerHTML; } } if(opt.pasteFilter){ me.addListener('beforepaste',autotype); } function DBC2SB(str) { var result = ''; for (var i = 0; i < str.length; i++) { var code = str.charCodeAt(i); //获取当前字符的unicode编码 if (code >= 65281 && code <= 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符 { result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码 } else if (code == 12288)//空格 { result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); } else { result += str.charAt(i); } } return result; } function ToDBC(txtstring) { txtstring = utils.html(txtstring); var tmp = ""; var mark = "";/*用于判断,如果是html尖括里的标记,则不进行全角的转换*/ for (var i = 0; i < txtstring.length; i++) { if (txtstring.charCodeAt(i) == 32) { tmp = tmp + String.fromCharCode(12288); } else if (txtstring.charCodeAt(i) < 127) { tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248); } else { tmp += txtstring.charAt(i); } } return tmp; } function readLocalOpts() { var cookieOpt = me.getPreferences('autotypeset'); utils.extend(me.options.autotypeset, cookieOpt); } me.commands['autotypeset'] = { execCommand:function () { me.removeListener('beforepaste',autotype); if(opt.pasteFilter){ me.addListener('beforepaste',autotype); } autotype.call(me) } }; }; // plugins/autosubmit.js /** * 快捷键提交 * @file * @since 1.2.6.1 */ /** * 提交表单 * @command autosubmit * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'autosubmit' ); * ``` */ UE.plugin.register('autosubmit',function(){ return { shortcutkey:{ "autosubmit":"ctrl+13" //手动提交 }, commands:{ 'autosubmit':{ execCommand:function () { var me=this, form = domUtils.findParentByTagName(me.iframe,"form", false); if (form){ if(me.fireEvent("beforesubmit")===false){ return; } me.sync(); form.submit(); } } } } } }); // plugins/background.js /** * 背景插件,为UEditor提供设置背景功能 * @file * @since 1.2.6.1 */ UE.plugin.register('background', function () { var me = this, cssRuleId = 'editor_background', isSetColored, reg = new RegExp('body[\\s]*\\{(.+)\\}', 'i'); function stringToObj(str) { var obj = {}, styles = str.split(';'); utils.each(styles, function (v) { var index = v.indexOf(':'), key = utils.trim(v.substr(0, index)).toLowerCase(); key && (obj[key] = utils.trim(v.substr(index + 1) || '')); }); return obj; } function setBackground(obj) { if (obj) { var styles = []; for (var name in obj) { if (obj.hasOwnProperty(name)) { styles.push(name + ":" + obj[name] + '; '); } } utils.cssRule(cssRuleId, styles.length ? ('body{' + styles.join("") + '}') : '', me.document); } else { utils.cssRule(cssRuleId, '', me.document) } } //重写editor.hasContent方法 var orgFn = me.hasContents; me.hasContents = function(){ if(me.queryCommandValue('background')){ return true } return orgFn.apply(me,arguments); }; return { bindEvents: { 'getAllHtml': function (type, headHtml) { var body = this.body, su = domUtils.getComputedStyle(body, "background-image"), url = ""; if (su.indexOf(me.options.imagePath) > 0) { url = su.substring(su.indexOf(me.options.imagePath), su.length - 1).replace(/"|\(|\)/ig, ""); } else { url = su != "none" ? su.replace(/url\("?|"?\)/ig, "") : ""; } var html = ' '; headHtml.push(html); }, 'aftersetcontent': function () { if(isSetColored == false) setBackground(); } }, inputRule: function (root) { isSetColored = false; utils.each(root.getNodesByTagName('p'), function (p) { var styles = p.getAttr('data-background'); if (styles) { isSetColored = true; setBackground(stringToObj(styles)); p.parentNode.removeChild(p); } }) }, outputRule: function (root) { var me = this, styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); if (styles) { root.appendChild(UE.uNode.createElement('


            ')); } }, commands: { 'background': { execCommand: function (cmd, obj) { setBackground(obj); }, queryCommandValue: function () { var me = this, styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); return styles ? stringToObj(styles[1]) : null; }, notNeedUndo: true } } } }); // plugins/image.js /** * 图片插入、排版插件 * @file * @since 1.2.6.1 */ /** * 图片对齐方式 * @command imagefloat * @method execCommand * @remind 值center为独占一行居中 * @param { String } cmd 命令字符串 * @param { String } align 对齐方式,可传left、right、none、center * @remaind center表示图片独占一行 * @example * ```javascript * editor.execCommand( 'imagefloat', 'center' ); * ``` */ /** * 如果选区所在位置是图片区域 * @command imagefloat * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回图片对齐方式 * @example * ```javascript * editor.queryCommandValue( 'imagefloat' ); * ``` */ UE.commands['imagefloat'] = { execCommand:function (cmd, align) { var me = this, range = me.selection.getRange(); if (!range.collapsed) { var img = range.getClosedNode(); if (img && img.tagName == 'IMG') { switch (align) { case 'left': case 'right': case 'none': var pN = img.parentNode, tmpNode, pre, next; while (dtd.$inline[pN.tagName] || pN.tagName == 'A') { pN = pN.parentNode; } tmpNode = pN; if (tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode, 'text-align') == 'center') { if (!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode, function (node) { return !domUtils.isBr(node) && !domUtils.isWhitespace(node); }) == 1) { pre = tmpNode.previousSibling; next = tmpNode.nextSibling; if (pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)) { pre.appendChild(tmpNode.firstChild); while (next.firstChild) { pre.appendChild(next.firstChild); } domUtils.remove(tmpNode); domUtils.remove(next); } else { domUtils.setStyle(tmpNode, 'text-align', ''); } } range.selectNode(img).select(); } domUtils.setStyle(img, 'float', align == 'none' ? '' : align); if(align == 'none'){ domUtils.removeAttributes(img,'align'); } break; case 'center': if (me.queryCommandValue('imagefloat') != 'center') { pN = img.parentNode; domUtils.setStyle(img, 'float', ''); domUtils.removeAttributes(img,'align'); tmpNode = img; while (pN && domUtils.getChildCount(pN, function (node) { return !domUtils.isBr(node) && !domUtils.isWhitespace(node); }) == 1 && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) { tmpNode = pN; pN = pN.parentNode; } range.setStartBefore(tmpNode).setCursor(false); pN = me.document.createElement('div'); pN.appendChild(tmpNode); domUtils.setStyle(tmpNode, 'float', ''); me.execCommand('insertHtml', '

            ' + pN.innerHTML + '

            '); tmpNode = me.document.getElementById('_img_parent_tmp'); tmpNode.removeAttribute('id'); tmpNode = tmpNode.firstChild; range.selectNode(tmpNode).select(); //去掉后边多余的元素 next = tmpNode.parentNode.nextSibling; if (next && domUtils.isEmptyNode(next)) { domUtils.remove(next); } } break; } } } }, queryCommandValue:function () { var range = this.selection.getRange(), startNode, floatStyle; if (range.collapsed) { return 'none'; } startNode = range.getClosedNode(); if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { floatStyle = domUtils.getComputedStyle(startNode, 'float') || startNode.getAttribute('align'); if (floatStyle == 'none') { floatStyle = domUtils.getComputedStyle(startNode.parentNode, 'text-align') == 'center' ? 'center' : floatStyle; } return { left:1, right:1, center:1 }[floatStyle] ? floatStyle : 'none'; } return 'none'; }, queryCommandState:function () { var range = this.selection.getRange(), startNode; if (range.collapsed) return -1; startNode = range.getClosedNode(); if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { return 0; } return -1; } }; /** * 插入图片 * @command insertimage * @method execCommand * @param { String } cmd 命令字符串 * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, * 此时数组的每一个元素都是一个Object类型的图片属性集合。 * @example * ```javascript * editor.execCommand( 'insertimage', { * src:'a/b/c.jpg', * width:'100', * height:'100' * } ); * ``` * @example * ```javascript * editor.execCommand( 'insertimage', [{ * src:'a/b/c.jpg', * width:'100', * height:'100' * },{ * src:'a/b/d.jpg', * width:'100', * height:'100' * }] ); * ``` */ UE.commands['insertimage'] = { execCommand:function (cmd, opt) { opt = utils.isArray(opt) ? opt : [opt]; if (!opt.length) { return; } var me = this, range = me.selection.getRange(), img = range.getClosedNode(); if(me.fireEvent('beforeinsertimage', opt) === true){ return; } function unhtmlData(imgCi) { utils.each('width,height,border,hspace,vspace'.split(','), function (item) { if (imgCi[item]) { imgCi[item] = parseInt(imgCi[item], 10) || 0; } }); utils.each('src,_src'.split(','), function (item) { if (imgCi[item]) { imgCi[item] = utils.unhtmlForUrl(imgCi[item]); } }); utils.each('title,alt'.split(','), function (item) { if (imgCi[item]) { imgCi[item] = utils.unhtml(imgCi[item]); } }); } if (img && /img/i.test(img.tagName) && (img.className != "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1) && !img.getAttribute("word_img")) { var first = opt.shift(); var floatStyle = first['floatStyle']; delete first['floatStyle']; //// img.style.border = (first.border||0) +"px solid #000"; //// img.style.margin = (first.margin||0) +"px"; // img.style.cssText += ';margin:' + (first.margin||0) +"px;" + 'border:' + (first.border||0) +"px solid #000"; domUtils.setAttributes(img, first); me.execCommand('imagefloat', floatStyle); if (opt.length > 0) { range.setStartAfter(img).setCursor(false, true); me.execCommand('insertimage', opt); } } else { var html = [], str = '', ci; ci = opt[0]; if (opt.length == 1) { unhtmlData(ci); str = '' + ci.alt + ''; if (ci['floatStyle'] == 'center') { str = '

            ' + str + '

            '; } html.push(str); } else { for (var i = 0; ci = opt[i++];) { unhtmlData(ci); str = '

            '; html.push(str); } } me.execCommand('insertHtml', html.join('')); } me.fireEvent('afterinsertimage', opt) } }; // plugins/justify.js /** * 段落格式 * @file * @since 1.2.6.1 */ /** * 段落对齐方式 * @command justify * @method execCommand * @param { String } cmd 命令字符串 * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 * @example * ```javascript * editor.execCommand( 'justify', 'center' ); * ``` */ /** * 如果选区所在位置是段落区域,返回当前段落对齐方式 * @command justify * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回段落对齐方式 * @example * ```javascript * editor.queryCommandValue( 'justify' ); * ``` */ UE.plugins['justify']=function(){ var me=this, block = domUtils.isBlockElm, defaultValue = { left:1, right:1, center:1, justify:1 }, doJustify = function (range, style) { var bookmark = range.createBookmark(), filterFn = function (node) { return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); }; range.enlarge(true); var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), tmpRange = range.cloneRange(), tmpNode; while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { if (current.nodeType == 3 || !block(current)) { tmpRange.setStartBefore(current); while (current && current !== bookmark2.end && !block(current)) { tmpNode = current; current = domUtils.getNextDomNode(current, false, null, function (node) { return !block(node); }); } tmpRange.setEndAfter(tmpNode); var common = tmpRange.getCommonAncestor(); if (!domUtils.isBody(common) && block(common)) { domUtils.setStyles(common, utils.isString(style) ? {'text-align':style} : style); current = common; } else { var p = range.document.createElement('p'); domUtils.setStyles(p, utils.isString(style) ? {'text-align':style} : style); var frag = tmpRange.extractContents(); p.appendChild(frag); tmpRange.insertNode(p); current = p; } current = domUtils.getNextDomNode(current, false, filterFn); } else { current = domUtils.getNextDomNode(current, true, filterFn); } } return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); }; UE.commands['justify'] = { execCommand:function (cmdName, align) { var range = this.selection.getRange(), txt; //闭合时单独处理 if (range.collapsed) { txt = this.document.createTextNode('p'); range.insertNode(txt); } doJustify(range, align); if (txt) { range.setStartBefore(txt).collapse(true); domUtils.remove(txt); } range.select(); return true; }, queryCommandValue:function () { var startNode = this.selection.getStart(), value = domUtils.getComputedStyle(startNode, 'text-align'); return defaultValue[value] ? value : 'left'; }, queryCommandState:function () { var start = this.selection.getStart(), cell = start && domUtils.findParentByTagName(start, ["td", "th","caption"], true); return cell? -1:0; } }; }; // plugins/font.js /** * 字体颜色,背景色,字号,字体,下划线,删除线 * @file * @since 1.2.6.1 */ /** * 字体颜色 * @command forecolor * @method execCommand * @param { String } cmd 命令字符串 * @param { String } value 色值(必须十六进制) * @example * ```javascript * editor.execCommand( 'forecolor', '#000' ); * ``` */ /** * 返回选区字体颜色 * @command forecolor * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回字体颜色 * @example * ```javascript * editor.queryCommandValue( 'forecolor' ); * ``` */ /** * 字体背景颜色 * @command backcolor * @method execCommand * @param { String } cmd 命令字符串 * @param { String } value 色值(必须十六进制) * @example * ```javascript * editor.execCommand( 'backcolor', '#000' ); * ``` */ /** * 返回选区字体颜色 * @command backcolor * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回字体背景颜色 * @example * ```javascript * editor.queryCommandValue( 'backcolor' ); * ``` */ /** * 字体大小 * @command fontsize * @method execCommand * @param { String } cmd 命令字符串 * @param { String } value 字体大小 * @example * ```javascript * editor.execCommand( 'fontsize', '14px' ); * ``` */ /** * 返回选区字体大小 * @command fontsize * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回字体大小 * @example * ```javascript * editor.queryCommandValue( 'fontsize' ); * ``` */ /** * 字体样式 * @command fontfamily * @method execCommand * @param { String } cmd 命令字符串 * @param { String } value 字体样式 * @example * ```javascript * editor.execCommand( 'fontfamily', '微软雅黑' ); * ``` */ /** * 返回选区字体样式 * @command fontfamily * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回字体样式 * @example * ```javascript * editor.queryCommandValue( 'fontfamily' ); * ``` */ /** * 字体下划线,与删除线互斥 * @command underline * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'underline' ); * ``` */ /** * 字体删除线,与下划线互斥 * @command strikethrough * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'strikethrough' ); * ``` */ /** * 字体边框 * @command fontborder * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'fontborder' ); * ``` */ UE.plugins['font'] = function () { var me = this, fonts = { 'forecolor': 'color', 'backcolor': 'background-color', 'fontsize': 'font-size', 'fontfamily': 'font-family', 'underline': 'text-decoration', 'strikethrough': 'text-decoration', 'fontborder': 'border' }, needCmd = {'underline': 1, 'strikethrough': 1, 'fontborder': 1}, needSetChild = { 'forecolor': 'color', 'backcolor': 'background-color', 'fontsize': 'font-size', 'fontfamily': 'font-family' }; me.setOpt({ 'fontfamily': [ { name: 'songti', val: '宋体,SimSun'}, { name: 'yahei', val: '微软雅黑,Microsoft YaHei'}, { name: 'kaiti', val: '楷体,楷体_GB2312, SimKai'}, { name: 'heiti', val: '黑体, SimHei'}, { name: 'lishu', val: '隶书, SimLi'}, { name: 'andaleMono', val: 'andale mono'}, { name: 'arial', val: 'arial, helvetica,sans-serif'}, { name: 'arialBlack', val: 'arial black,avant garde'}, { name: 'comicSansMs', val: 'comic sans ms'}, { name: 'impact', val: 'impact,chicago'}, { name: 'timesNewRoman', val: 'times new roman'} ], 'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36] }); function mergeWithParent(node){ var parent; while(parent = node.parentNode){ if(parent.tagName == 'SPAN' && domUtils.getChildCount(parent,function(child){ return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child) }) == 1) { parent.style.cssText += node.style.cssText; domUtils.remove(node,true); node = parent; }else{ break; } } } function mergeChild(rng,cmdName,value){ if(needSetChild[cmdName]){ rng.adjustmentBoundary(); if(!rng.collapsed && rng.startContainer.nodeType == 1){ var start = rng.startContainer.childNodes[rng.startOffset]; if(start && domUtils.isTagNode(start,'span')){ var bk = rng.createBookmark(); utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) { if (!span.parentNode || domUtils.isBookmarkNode(span))return; if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){ return; } domUtils.removeStyle(span,needSetChild[cmdName]); if(span.style.cssText.replace(/^\s+$/,'').length == 0){ domUtils.remove(span,true) } }); rng.moveToBookmark(bk) } } } } function mergesibling(rng,cmdName,value) { var collapsed = rng.collapsed, bk = rng.createBookmark(), common; if (collapsed) { common = bk.start.parentNode; while (dtd.$inline[common.tagName]) { common = common.parentNode; } } else { common = domUtils.getCommonAncestor(bk.start, bk.end); } utils.each(domUtils.getElementsByTagName(common, 'span'), function (span) { if (!span.parentNode || domUtils.isBookmarkNode(span))return; if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { if(/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)){ domUtils.remove(span, true); }else{ domUtils.removeStyle(span,'border'); } return } if (/border/i.test(span.style.cssText) && span.parentNode.tagName == 'SPAN' && /border/i.test(span.parentNode.style.cssText)) { span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, ''); } if(!(cmdName=='fontborder' && value=='none')){ var next = span.nextSibling; while (next && next.nodeType == 1 && next.tagName == 'SPAN' ) { if(domUtils.isBookmarkNode(next) && cmdName == 'fontborder') { span.appendChild(next); next = span.nextSibling; continue; } if (next.style.cssText == span.style.cssText) { domUtils.moveChild(next, span); domUtils.remove(next); } if (span.nextSibling === next) break; next = span.nextSibling; } } mergeWithParent(span); if(browser.ie && browser.version > 8 ){ //拷贝父亲们的特别的属性,这里只做背景颜色的处理 var parent = domUtils.findParent(span,function(n){return n.tagName == 'SPAN' && /background-color/.test(n.style.cssText)}); if(parent && !/background-color/.test(span.style.cssText)){ span.style.backgroundColor = parent.style.backgroundColor; } } }); rng.moveToBookmark(bk); mergeChild(rng,cmdName,value) } me.addInputRule(function (root) { utils.each(root.getNodesByTagName('u s del font strike'), function (node) { if (node.tagName == 'font') { var cssStyle = []; for (var p in node.attrs) { switch (p) { case 'size': cssStyle.push('font-size:' + ({ '1':'10', '2':'12', '3':'16', '4':'18', '5':'24', '6':'32', '7':'48' }[node.attrs[p]] || node.attrs[p]) + 'px'); break; case 'color': cssStyle.push('color:' + node.attrs[p]); break; case 'face': cssStyle.push('font-family:' + node.attrs[p]); break; case 'style': cssStyle.push(node.attrs[p]); } } node.attrs = { 'style': cssStyle.join(';') }; } else { var val = node.tagName == 'u' ? 'underline' : 'line-through'; node.attrs = { 'style': (node.getAttr('style') || '') + 'text-decoration:' + val + ';' } } node.tagName = 'span'; }); // utils.each(root.getNodesByTagName('span'), function (node) { // var val; // if(val = node.getAttr('class')){ // if(/fontstrikethrough/.test(val)){ // node.setStyle('text-decoration','line-through'); // if(node.attrs['class']){ // node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,''); // }else{ // node.setAttr('class') // } // } // if(/fontborder/.test(val)){ // node.setStyle('border','1px solid #000'); // if(node.attrs['class']){ // node.attrs['class'] = node.attrs['class'].replace(/fontborder/,''); // }else{ // node.setAttr('class') // } // } // } // }); }); // me.addOutputRule(function(root){ // utils.each(root.getNodesByTagName('span'), function (node) { // var val; // if(val = node.getStyle('text-decoration')){ // if(/line-through/.test(val)){ // if(node.attrs['class']){ // node.attrs['class'] += ' fontstrikethrough'; // }else{ // node.setAttr('class','fontstrikethrough') // } // } // // node.setStyle('text-decoration') // } // if(val = node.getStyle('border')){ // if(/1px/.test(val) && /solid/.test(val)){ // if(node.attrs['class']){ // node.attrs['class'] += ' fontborder'; // // }else{ // node.setAttr('class','fontborder') // } // } // node.setStyle('border') // // } // }); // }); for (var p in fonts) { (function (cmd, style) { UE.commands[cmd] = { execCommand: function (cmdName, value) { value = value || (this.queryCommandState(cmdName) ? 'none' : cmdName == 'underline' ? 'underline' : cmdName == 'fontborder' ? '1px solid #000' : 'line-through'); var me = this, range = this.selection.getRange(), text; if (value == 'default') { if (range.collapsed) { text = me.document.createTextNode('font'); range.insertNode(text).select(); } me.execCommand('removeFormat', 'span,a', style); if (text) { range.setStartBefore(text).collapse(true); domUtils.remove(text); } mergesibling(range,cmdName,value); range.select() } else { if (!range.collapsed) { if (needCmd[cmd] && me.queryCommandValue(cmd)) { me.execCommand('removeFormat', 'span,a', style); } range = me.selection.getRange(); range.applyInlineStyle('span', {'style': style + ':' + value}); mergesibling(range, cmdName,value); range.select(); } else { var span = domUtils.findParentByTagName(range.startContainer, 'span', true); text = me.document.createTextNode('font'); if (span && !span.children.length && !span[browser.ie ? 'innerText' : 'textContent'].replace(fillCharReg, '').length) { //for ie hack when enter range.insertNode(text); if (needCmd[cmd]) { range.selectNode(text).select(); me.execCommand('removeFormat', 'span,a', style, null); span = domUtils.findParentByTagName(text, 'span', true); range.setStartBefore(text); } span && (span.style.cssText += ';' + style + ':' + value); range.collapse(true).select(); } else { range.insertNode(text); range.selectNode(text).select(); span = range.document.createElement('span'); if (needCmd[cmd]) { //a标签内的不处理跳过 if (domUtils.findParentByTagName(text, 'a', true)) { range.setStartBefore(text).setCursor(); domUtils.remove(text); return; } me.execCommand('removeFormat', 'span,a', style); } span.style.cssText = style + ':' + value; text.parentNode.insertBefore(span, text); //修复,span套span 但样式不继承的问题 if (!browser.ie || browser.ie && browser.version == 9) { var spanParent = span.parentNode; while (!domUtils.isBlockElm(spanParent)) { if (spanParent.tagName == 'SPAN') { //opera合并style不会加入";" span.style.cssText = spanParent.style.cssText + ";" + span.style.cssText; } spanParent = spanParent.parentNode; } } if (opera) { setTimeout(function () { range.setStart(span, 0).collapse(true); mergesibling(range, cmdName,value); range.select(); }); } else { range.setStart(span, 0).collapse(true); mergesibling(range,cmdName,value); range.select(); } //trace:981 //domUtils.mergeToParent(span) } domUtils.remove(text); } } return true; }, queryCommandValue: function (cmdName) { var startNode = this.selection.getStart(); //trace:946 if (cmdName == 'underline' || cmdName == 'strikethrough') { var tmpNode = startNode, value; while (tmpNode && !domUtils.isBlockElm(tmpNode) && !domUtils.isBody(tmpNode)) { if (tmpNode.nodeType == 1) { value = domUtils.getComputedStyle(tmpNode, style); if (value != 'none') { return value; } } tmpNode = tmpNode.parentNode; } return 'none'; } if (cmdName == 'fontborder') { var tmp = startNode, val; while (tmp && dtd.$inline[tmp.tagName]) { if (val = domUtils.getComputedStyle(tmp, 'border')) { if (/1px/.test(val) && /solid/.test(val)) { return val; } } tmp = tmp.parentNode; } return '' } if( cmdName == 'FontSize' ) { var styleVal = domUtils.getComputedStyle(startNode, style), tmp = /^([\d\.]+)(\w+)$/.exec( styleVal ); if( tmp ) { return Math.floor( tmp[1] ) + tmp[2]; } return styleVal; } return domUtils.getComputedStyle(startNode, style); }, queryCommandState: function (cmdName) { if (!needCmd[cmdName]) return 0; var val = this.queryCommandValue(cmdName); if (cmdName == 'fontborder') { return /1px/.test(val) && /solid/.test(val) } else { return cmdName == 'underline' ? /underline/.test(val) : /line\-through/.test(val); } } }; })(p, fonts[p]); } }; // plugins/link.js /** * 超链接 * @file * @since 1.2.6.1 */ /** * 插入超链接 * @command link * @method execCommand * @param { String } cmd 命令字符串 * @param { Object } options 设置自定义属性,例如:url、title、target * @example * ```javascript * editor.execCommand( 'link', '{ * url:'ueditor.baidu.com', * title:'ueditor', * target:'_blank' * }' ); * ``` */ /** * 返回当前选中的第一个超链接节点 * @command link * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { Element } 超链接节点 * @example * ```javascript * editor.queryCommandValue( 'link' ); * ``` */ /** * 取消超链接 * @command unlink * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'unlink'); * ``` */ UE.plugins['link'] = function(){ function optimize( range ) { var start = range.startContainer,end = range.endContainer; if ( start = domUtils.findParentByTagName( start, 'a', true ) ) { range.setStartBefore( start ); } if ( end = domUtils.findParentByTagName( end, 'a', true ) ) { range.setEndAfter( end ); } } UE.commands['unlink'] = { execCommand : function() { var range = this.selection.getRange(), bookmark; if(range.collapsed && !domUtils.findParentByTagName( range.startContainer, 'a', true )){ return; } bookmark = range.createBookmark(); optimize( range ); range.removeInlineStyle( 'a' ).moveToBookmark( bookmark ).select(); }, queryCommandState : function(){ return !this.highlight && this.queryCommandValue('link') ? 0 : -1; } }; function doLink(range,opt,me){ var rngClone = range.cloneRange(), link = me.queryCommandValue('link'); optimize( range = range.adjustmentBoundary() ); var start = range.startContainer; if(start.nodeType == 1 && link){ start = start.childNodes[range.startOffset]; if(start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[browser.ie?'innerText':'textContent'])){ start[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue||opt.href); } } if( !rngClone.collapsed || link){ range.removeInlineStyle( 'a' ); rngClone = range.cloneRange(); } if ( rngClone.collapsed ) { var a = range.document.createElement( 'a'), text = ''; if(opt.textValue){ text = utils.html(opt.textValue); delete opt.textValue; }else{ text = utils.html(opt.href); } domUtils.setAttributes( a, opt ); start = domUtils.findParentByTagName( rngClone.startContainer, 'a', true ); if(start && domUtils.isInNodeEndBoundary(rngClone,start)){ range.setStartAfter(start).collapse(true); } a[browser.ie ? 'innerText' : 'textContent'] = text; range.insertNode(a).selectNode( a ); } else { range.applyInlineStyle( 'a', opt ); } } UE.commands['link'] = { execCommand : function( cmdName, opt ) { var range; opt._href && (opt._href = utils.unhtml(opt._href,/[<">]/g)); opt.href && (opt.href = utils.unhtml(opt.href,/[<">]/g)); opt.textValue && (opt.textValue = utils.unhtml(opt.textValue,/[<">]/g)); doLink(range=this.selection.getRange(),opt,this); //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题 range.collapse().select(true); }, queryCommandValue : function() { var range = this.selection.getRange(), node; if ( range.collapsed ) { // node = this.selection.getStart(); //在ie下getstart()取值偏上了 node = range.startContainer; node = node.nodeType == 1 ? node : node.parentNode; if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) && ! domUtils.isInNodeEndBoundary(range,node)) { return node; } } else { //trace:1111 如果是

            xx

            startContainer是p就会找不到a range.shrinkBoundary(); var start = range.startContainer.nodeType == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset], end = range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset-1], common = range.getCommonAncestor(); node = domUtils.findParentByTagName( common, 'a', true ); if ( !node && common.nodeType == 1){ var as = common.getElementsByTagName( 'a' ), ps,pe; for ( var i = 0,ci; ci = as[i++]; ) { ps = domUtils.getPosition( ci, start ),pe = domUtils.getPosition( ci,end); if ( (ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) && (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) ) { node = ci; break; } } } return node; } }, queryCommandState : function() { //判断如果是视频的话连接不可用 //fix 853 var img = this.selection.getRange().getClosedNode(), flag = img && (img.className == "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1); return flag ? -1 : 0; } }; }; // plugins/iframe.js ///import core ///import plugins\inserthtml.js ///commands 插入框架 ///commandsName InsertFrame ///commandsTitle 插入Iframe ///commandsDialog dialogs\insertframe UE.plugins['insertframe'] = function() { var me =this; function deleteIframe(){ me._iframe && delete me._iframe; } me.addListener("selectionchange",function(){ deleteIframe(); }); }; // plugins/scrawl.js ///import core ///commands 涂鸦 ///commandsName Scrawl ///commandsTitle 涂鸦 ///commandsDialog dialogs\scrawl UE.commands['scrawl'] = { queryCommandState : function(){ return ( browser.ie && browser.version <= 8 ) ? -1 :0; } }; // plugins/removeformat.js /** * 清除格式 * @file * @since 1.2.6.1 */ /** * 清除文字样式 * @command removeformat * @method execCommand * @param { String } cmd 命令字符串 * @param {String} tags 以逗号隔开的标签。如:strong * @param {String} style 样式如:color * @param {String} attrs 属性如:width * @example * ```javascript * editor.execCommand( 'removeformat', 'strong','color','width' ); * ``` */ UE.plugins['removeformat'] = function(){ var me = this; me.setOpt({ 'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var', 'removeFormatAttributes':'class,style,lang,width,height,align,hspace,valign' }); me.commands['removeformat'] = { execCommand : function( cmdName, tags, style, attrs,notIncludeA ) { var tagReg = new RegExp( '^(?:' + (tags || this.options.removeFormatTags).replace( /,/g, '|' ) + ')$', 'i' ) , removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split( ',' ), range = new dom.Range( this.document ), bookmark,node,parent, filter = function( node ) { return node.nodeType == 1; }; function isRedundantSpan (node) { if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span'){ return 0; } if (browser.ie) { //ie 下判断实效,所以只能简单用style来判断 //return node.style.cssText == '' ? 1 : 0; var attrs = node.attributes; if ( attrs.length ) { for ( var i = 0,l = attrs.length; i var node = range.startContainer, tmp, collapsed = range.collapsed; while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ tmp = node.parentNode; range.setStartBefore(node); //trace:937 //更新结束边界 if(range.startContainer === range.endContainer){ range.endOffset--; } domUtils.remove(node); node = tmp; } if(!collapsed){ node = range.endContainer; while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ tmp = node.parentNode; range.setEndBefore(node); domUtils.remove(node); node = tmp; } } } range = this.selection.getRange(); doRemove( range ); range.select(); } }; }; // plugins/blockquote.js /** * 添加引用 * @file * @since 1.2.6.1 */ /** * 添加引用 * @command blockquote * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'blockquote' ); * ``` */ /** * 添加引用 * @command blockquote * @method execCommand * @param { String } cmd 命令字符串 * @param { Object } attrs 节点属性 * @example * ```javascript * editor.execCommand( 'blockquote',{ * style: "color: red;" * } ); * ``` */ UE.plugins['blockquote'] = function(){ var me = this; function getObj(editor){ return domUtils.filterNodeList(editor.selection.getStartElementPath(),'blockquote'); } me.commands['blockquote'] = { execCommand : function( cmdName, attrs ) { var range = this.selection.getRange(), obj = getObj(this), blockquote = dtd.blockquote, bookmark = range.createBookmark(); if ( obj ) { var start = range.startContainer, startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start,function(node){return domUtils.isBlockElm(node)}), end = range.endContainer, endBlock = domUtils.isBlockElm(end) ? end : domUtils.findParent(end,function(node){return domUtils.isBlockElm(node)}); //处理一下li startBlock = domUtils.findParentByTagName(startBlock,'li',true) || startBlock; endBlock = domUtils.findParentByTagName(endBlock,'li',true) || endBlock; if(startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj || domUtils.isBody(startBlock)){ domUtils.remove(obj,true); }else{ domUtils.breakParent(startBlock,obj); } if(startBlock !== endBlock){ obj = domUtils.findParentByTagName(endBlock,'blockquote'); if(obj){ if(endBlock.tagName == 'LI' || endBlock.tagName == 'TD'|| domUtils.isBody(endBlock)){ obj.parentNode && domUtils.remove(obj,true); }else{ domUtils.breakParent(endBlock,obj); } } } var blockquotes = domUtils.getElementsByTagName(this.document,'blockquote'); for(var i=0,bi;bi=blockquotes[i++];){ if(!bi.childNodes.length){ domUtils.remove(bi); }else if(domUtils.getPosition(bi,startBlock)&domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi,endBlock)&domUtils.POSITION_PRECEDING){ domUtils.remove(bi,true); } } } else { var tmpRange = range.cloneRange(), node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode, preNode = node, doEnd = 1; //调整开始 while ( 1 ) { if ( domUtils.isBody(node) ) { if ( preNode !== node ) { if ( range.collapsed ) { tmpRange.selectNode( preNode ); doEnd = 0; } else { tmpRange.setStartBefore( preNode ); } }else{ tmpRange.setStart(node,0); } break; } if ( !blockquote[node.tagName] ) { if ( range.collapsed ) { tmpRange.selectNode( preNode ); } else{ tmpRange.setStartBefore( preNode); } break; } preNode = node; node = node.parentNode; } //调整结束 if ( doEnd ) { preNode = node = node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode; while ( 1 ) { if ( domUtils.isBody( node ) ) { if ( preNode !== node ) { tmpRange.setEndAfter( preNode ); } else { tmpRange.setEnd( node, node.childNodes.length ); } break; } if ( !blockquote[node.tagName] ) { tmpRange.setEndAfter( preNode ); break; } preNode = node; node = node.parentNode; } } node = range.document.createElement( 'blockquote' ); domUtils.setAttributes( node, attrs ); node.appendChild( tmpRange.extractContents() ); tmpRange.insertNode( node ); //去除重复的 var childs = domUtils.getElementsByTagName(node,'blockquote'); for(var i=0,ci;ci=childs[i++];){ if(ci.parentNode){ domUtils.remove(ci,true); } } } range.moveToBookmark( bookmark ).select(); }, queryCommandState : function() { return getObj(this) ? 1 : 0; } }; }; // plugins/convertcase.js /** * 大小写转换 * @file * @since 1.2.6.1 */ /** * 把选区内文本变大写,与“tolowercase”命令互斥 * @command touppercase * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'touppercase' ); * ``` */ /** * 把选区内文本变小写,与“touppercase”命令互斥 * @command tolowercase * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'tolowercase' ); * ``` */ UE.commands['touppercase'] = UE.commands['tolowercase'] = { execCommand:function (cmd) { var me = this; var rng = me.selection.getRange(); if(rng.collapsed){ return rng; } var bk = rng.createBookmark(), bkEnd = bk.end, filterFn = function( node ) { return !domUtils.isBr(node) && !domUtils.isWhitespace( node ); }, curNode = domUtils.getNextDomNode( bk.start, false, filterFn ); while ( curNode && (domUtils.getPosition( curNode, bkEnd ) & domUtils.POSITION_PRECEDING) ) { if ( curNode.nodeType == 3 ) { curNode.nodeValue = curNode.nodeValue[cmd == 'touppercase' ? 'toUpperCase' : 'toLowerCase'](); } curNode = domUtils.getNextDomNode( curNode, true, filterFn ); if(curNode === bkEnd){ break; } } rng.moveToBookmark(bk).select(); } }; // plugins/indent.js /** * 首行缩进 * @file * @since 1.2.6.1 */ /** * 缩进 * @command indent * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'indent' ); * ``` */ UE.commands['indent'] = { execCommand : function() { var me = this,value = me.queryCommandState("indent") ? "0em" : (me.options.indentValue || '2em'); me.execCommand('Paragraph','p',{style:'text-indent:'+ value}); }, queryCommandState : function() { var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0; } }; // plugins/print.js /** * 打印 * @file * @since 1.2.6.1 */ /** * 打印 * @command print * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'print' ); * ``` */ UE.commands['print'] = { execCommand : function(){ this.window.print(); }, notNeedUndo : 1 }; // plugins/preview.js /** * 预览 * @file * @since 1.2.6.1 */ /** * 预览 * @command preview * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'preview' ); * ``` */ UE.commands['preview'] = { execCommand : function(){ var w = window.open('', '_blank', ''), d = w.document; d.open(); d.write('
            '+this.getContent(null,null,true)+'
            '); d.close(); }, notNeedUndo : 1 }; // plugins/selectall.js /** * 全选 * @file * @since 1.2.6.1 */ /** * 选中所有内容 * @command selectall * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'selectall' ); * ``` */ UE.plugins['selectall'] = function(){ var me = this; me.commands['selectall'] = { execCommand : function(){ //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 var me = this,body = me.body, range = me.selection.getRange(); range.selectNodeContents(body); if(domUtils.isEmptyBlock(body)){ //opera不能自动合并到元素的里边,要手动处理一下 if(browser.opera && body.firstChild && body.firstChild.nodeType == 1){ range.setStartAtFirst(body.firstChild); } range.collapse(true); } range.select(true); }, notNeedUndo : 1 }; //快捷键 me.addshortcutkey({ "selectAll" : "ctrl+65" }); }; // plugins/paragraph.js /** * 段落样式 * @file * @since 1.2.6.1 */ /** * 段落格式 * @command paragraph * @method execCommand * @param { String } cmd 命令字符串 * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' * @param {Object} attrs 标签的属性 * @example * ```javascript * editor.execCommand( 'Paragraph','h1','{ * class:'test' * }' ); * ``` */ /** * 返回选区内节点标签名 * @command paragraph * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 节点标签名 * @example * ```javascript * editor.queryCommandValue( 'Paragraph' ); * ``` */ UE.plugins['paragraph'] = function() { var me = this, block = domUtils.isBlockElm, notExchange = ['TD','LI','PRE'], doParagraph = function(range,style,attrs,sourceCmdName){ var bookmark = range.createBookmark(), filterFn = function( node ) { return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace( node ); }, para; range.enlarge( true ); var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), tmpRange = range.cloneRange(), tmpNode; while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { if ( current.nodeType == 3 || !block( current ) ) { tmpRange.setStartBefore( current ); while ( current && current !== bookmark2.end && !block( current ) ) { tmpNode = current; current = domUtils.getNextDomNode( current, false, null, function( node ) { return !block( node ); } ); } tmpRange.setEndAfter( tmpNode ); para = range.document.createElement( style ); if(attrs){ domUtils.setAttributes(para,attrs); if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ para.style.cssText = attrs.style; } } para.appendChild( tmpRange.extractContents() ); //需要内容占位 if(domUtils.isEmptyNode(para)){ domUtils.fillChar(range.document,para); } tmpRange.insertNode( para ); var parent = para.parentNode; //如果para上一级是一个block元素且不是body,td就删除它 if ( block( parent ) && !domUtils.isBody( para.parentNode ) && utils.indexOf(notExchange,parent.tagName)==-1) { //存储dir,style if(!(sourceCmdName && sourceCmdName == 'customstyle')){ parent.getAttribute('dir') && para.setAttribute('dir',parent.getAttribute('dir')); //trace:1070 parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText); //trace:1030 parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign); parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent); parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding); } //trace:1706 选择的就是h1-6要删除 if(attrs && /h\d/i.test(parent.tagName) && !/h\d/i.test(para.tagName) ){ domUtils.setAttributes(parent,attrs); if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ parent.style.cssText = attrs.style; } domUtils.remove(para,true); para = parent; }else{ domUtils.remove( para.parentNode, true ); } } if( utils.indexOf(notExchange,parent.tagName)!=-1){ current = parent; }else{ current = para; } current = domUtils.getNextDomNode( current, false, filterFn ); } else { current = domUtils.getNextDomNode( current, true, filterFn ); } } return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); }; me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}); me.commands['paragraph'] = { execCommand : function( cmdName, style,attrs,sourceCmdName ) { var range = this.selection.getRange(); //闭合时单独处理 if(range.collapsed){ var txt = this.document.createTextNode('p'); range.insertNode(txt); //去掉冗余的fillchar if(browser.ie){ var node = txt.previousSibling; if(node && domUtils.isWhitespace(node)){ domUtils.remove(node); } node = txt.nextSibling; if(node && domUtils.isWhitespace(node)){ domUtils.remove(node); } } } range = doParagraph(range,style,attrs,sourceCmdName); if(txt){ range.setStartBefore(txt).collapse(true); pN = txt.parentNode; domUtils.remove(txt); if(domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)){ domUtils.fillNode(this.document,pN); } } if(browser.gecko && range.collapsed && range.startContainer.nodeType == 1){ var child = range.startContainer.childNodes[range.startOffset]; if(child && child.nodeType == 1 && child.tagName.toLowerCase() == style){ range.setStart(child,0).collapse(true); } } //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了 range.select(); return true; }, queryCommandValue : function() { var node = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); return node ? node.tagName.toLowerCase() : ''; } }; }; // plugins/directionality.js /** * 设置文字输入的方向的插件 * @file * @since 1.2.6.1 */ (function() { var block = domUtils.isBlockElm , getObj = function(editor){ // var startNode = editor.selection.getStart(), // parents; // if ( startNode ) { // //查找所有的是block的父亲节点 // parents = domUtils.findParents( startNode, true, block, true ); // for ( var i = 0,ci; ci = parents[i++]; ) { // if ( ci.getAttribute( 'dir' ) ) { // return ci; // } // } // } return domUtils.filterNodeList(editor.selection.getStartElementPath(),function(n){return n && n.nodeType == 1 && n.getAttribute('dir')}); }, doDirectionality = function(range,editor,forward){ var bookmark, filterFn = function( node ) { return node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); }, obj = getObj( editor ); if ( obj && range.collapsed ) { obj.setAttribute( 'dir', forward ); return range; } bookmark = range.createBookmark(); range.enlarge( true ); var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), tmpRange = range.cloneRange(), tmpNode; while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { if ( current.nodeType == 3 || !block( current ) ) { tmpRange.setStartBefore( current ); while ( current && current !== bookmark2.end && !block( current ) ) { tmpNode = current; current = domUtils.getNextDomNode( current, false, null, function( node ) { return !block( node ); } ); } tmpRange.setEndAfter( tmpNode ); var common = tmpRange.getCommonAncestor(); if ( !domUtils.isBody( common ) && block( common ) ) { //遍历到了block节点 common.setAttribute( 'dir', forward ); current = common; } else { //没有遍历到,添加一个block节点 var p = range.document.createElement( 'p' ); p.setAttribute( 'dir', forward ); var frag = tmpRange.extractContents(); p.appendChild( frag ); tmpRange.insertNode( p ); current = p; } current = domUtils.getNextDomNode( current, false, filterFn ); } else { current = domUtils.getNextDomNode( current, true, filterFn ); } } return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); }; /** * 文字输入方向 * @command directionality * @method execCommand * @param { String } cmdName 命令字符串 * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 * @example * ```javascript * editor.execCommand( 'directionality', 'ltr'); * ``` */ /** * 查询当前选区的文字输入方向 * @command directionality * @method queryCommandValue * @param { String } cmdName 命令字符串 * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 * @example * ```javascript * editor.queryCommandValue( 'directionality'); * ``` */ UE.commands['directionality'] = { execCommand : function( cmdName,forward ) { var range = this.selection.getRange(); //闭合时单独处理 if(range.collapsed){ var txt = this.document.createTextNode('d'); range.insertNode(txt); } doDirectionality(range,this,forward); if(txt){ range.setStartBefore(txt).collapse(true); domUtils.remove(txt); } range.select(); return true; }, queryCommandValue : function() { var node = getObj(this); return node ? node.getAttribute('dir') : 'ltr'; } }; })(); // plugins/horizontal.js /** * 插入分割线插件 * @file * @since 1.2.6.1 */ /** * 插入分割线 * @command horizontal * @method execCommand * @param { String } cmdName 命令字符串 * @example * ```javascript * editor.execCommand( 'horizontal' ); * ``` */ UE.plugins['horizontal'] = function(){ var me = this; me.commands['horizontal'] = { execCommand : function( cmdName ) { var me = this; if(me.queryCommandState(cmdName)!==-1){ me.execCommand('insertHtml','
            '); var range = me.selection.getRange(), start = range.startContainer; if(start.nodeType == 1 && !start.childNodes[range.startOffset] ){ var tmp; if(tmp = start.childNodes[range.startOffset - 1]){ if(tmp.nodeType == 1 && tmp.tagName == 'HR'){ if(me.options.enterTag == 'p'){ tmp = me.document.createElement('p'); range.insertNode(tmp); range.setStart(tmp,0).setCursor(); }else{ tmp = me.document.createElement('br'); range.insertNode(tmp); range.setStartBefore(tmp).setCursor(); } } } } return true; } }, //边界在table里不能加分隔线 queryCommandState : function() { return domUtils.filterNodeList(this.selection.getStartElementPath(),'table') ? -1 : 0; } }; // me.addListener('delkeyup',function(){ // var rng = this.selection.getRange(); // if(browser.ie && browser.version > 8){ // rng.txtToElmBoundary(true); // if(domUtils.isStartInblock(rng)){ // var tmpNode = rng.startContainer; // var pre = tmpNode.previousSibling; // if(pre && domUtils.isTagNode(pre,'hr')){ // domUtils.remove(pre); // rng.select(); // return; // } // } // } // if(domUtils.isBody(rng.startContainer)){ // var hr = rng.startContainer.childNodes[rng.startOffset -1]; // if(hr && hr.nodeName == 'HR'){ // var next = hr.nextSibling; // if(next){ // rng.setStart(next,0) // }else if(hr.previousSibling){ // rng.setStartAtLast(hr.previousSibling) // }else{ // var p = this.document.createElement('p'); // hr.parentNode.insertBefore(p,hr); // domUtils.fillNode(this.document,p); // rng.setStart(p,0); // } // domUtils.remove(hr); // rng.setCursor(false,true); // } // } // }) me.addListener('delkeydown',function(name,evt){ var rng = this.selection.getRange(); rng.txtToElmBoundary(true); if(domUtils.isStartInblock(rng)){ var tmpNode = rng.startContainer; var pre = tmpNode.previousSibling; if(pre && domUtils.isTagNode(pre,'hr')){ domUtils.remove(pre); rng.select(); domUtils.preventDefault(evt); return true; } } }) }; // plugins/time.js /** * 插入时间和日期 * @file * @since 1.2.6.1 */ /** * 插入时间,默认格式:12:59:59 * @command time * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'time'); * ``` */ /** * 插入日期,默认格式:2013-08-30 * @command date * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'date'); * ``` */ UE.commands['time'] = UE.commands["date"] = { execCommand : function(cmd, format){ var date = new Date; function formatTime(date, format) { var hh = ('0' + date.getHours()).slice(-2), ii = ('0' + date.getMinutes()).slice(-2), ss = ('0' + date.getSeconds()).slice(-2); format = format || 'hh:ii:ss'; return format.replace(/hh/ig, hh).replace(/ii/ig, ii).replace(/ss/ig, ss); } function formatDate(date, format) { var yyyy = ('000' + date.getFullYear()).slice(-4), yy = yyyy.slice(-2), mm = ('0' + (date.getMonth()+1)).slice(-2), dd = ('0' + date.getDate()).slice(-2); format = format || 'yyyy-mm-dd'; return format.replace(/yyyy/ig, yyyy).replace(/yy/ig, yy).replace(/mm/ig, mm).replace(/dd/ig, dd); } this.execCommand('insertHtml',cmd == "time" ? formatTime(date, format):formatDate(date, format) ); } }; // plugins/rowspacing.js /** * 段前段后间距插件 * @file * @since 1.2.6.1 */ /** * 设置段间距 * @command rowspacing * @method execCommand * @param { String } cmd 命令字符串 * @param { String } value 段间距的值,以px为单位 * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 * @example * ```javascript * editor.execCommand( 'rowspacing', '10', 'top' ); * ``` */ UE.plugins['rowspacing'] = function(){ var me = this; me.setOpt({ 'rowspacingtop':['5', '10', '15', '20', '25'], 'rowspacingbottom':['5', '10', '15', '20', '25'] }); me.commands['rowspacing'] = { execCommand : function( cmdName,value,dir ) { this.execCommand('paragraph','p',{style:'margin-'+dir+':'+value + 'px'}); return true; }, queryCommandValue : function(cmdName,dir) { var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node) }), value; //trace:1026 if(pN){ value = domUtils.getComputedStyle(pN,'margin-'+dir).replace(/[^\d]/g,''); return !value ? 0 : value; } return 0; } }; }; // plugins/lineheight.js /** * 设置行内间距 * @file * @since 1.2.6.1 */ UE.plugins['lineheight'] = function(){ var me = this; me.setOpt({'lineheight':['1', '1.5','1.75','2', '3', '4', '5']}); /** * 行距 * @command lineheight * @method execCommand * @param { String } cmdName 命令字符串 * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 * @example * ```javascript * editor.execCommand( 'lineheight', 1.5); * ``` */ /** * 查询当前选区内容的行高大小 * @command lineheight * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回当前行高大小 * @example * ```javascript * editor.queryCommandValue( 'lineheight' ); * ``` */ me.commands['lineheight'] = { execCommand : function( cmdName,value ) { this.execCommand('paragraph','p',{style:'line-height:'+ (value == "1" ? "normal" : value + 'em') }); return true; }, queryCommandValue : function() { var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node)}); if(pN){ var value = domUtils.getComputedStyle(pN,'line-height'); return value == 'normal' ? 1 : value.replace(/[^\d.]*/ig,""); } } }; }; // plugins/insertcode.js /** * 插入代码插件 * @file * @since 1.2.6.1 */ UE.plugins['insertcode'] = function() { var me = this; me.ready(function(){ utils.cssRule('pre','pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}', me.document) }); me.setOpt('insertcode',{ 'as3':'ActionScript3', 'bash':'Bash/Shell', 'cpp':'C/C++', 'css':'Css', 'cf':'CodeFunction', 'c#':'C#', 'delphi':'Delphi', 'diff':'Diff', 'erlang':'Erlang', 'groovy':'Groovy', 'html':'Html', 'java':'Java', 'jfx':'JavaFx', 'js':'Javascript', 'pl':'Perl', 'php':'Php', 'plain':'Plain Text', 'ps':'PowerShell', 'python':'Python', 'ruby':'Ruby', 'scala':'Scala', 'sql':'Sql', 'vb':'Vb', 'xml':'Xml' }); /** * 插入代码 * @command insertcode * @method execCommand * @param { String } cmd 命令字符串 * @param { String } lang 插入代码的语言 * @example * ```javascript * editor.execCommand( 'insertcode', 'javascript' ); * ``` */ /** * 如果选区所在位置是插入插入代码区域,返回代码的语言 * @command insertcode * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回代码的语言 * @example * ```javascript * editor.queryCommandValue( 'insertcode' ); * ``` */ me.commands['insertcode'] = { execCommand : function(cmd,lang){ var me = this, rng = me.selection.getRange(), pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); if(pre){ pre.className = 'brush:'+lang+';toolbar:false;'; }else{ var code = ''; if(rng.collapsed){ code = browser.ie && browser.ie11below ? (browser.version <= 8 ? ' ':''):'
            '; }else{ var frag = rng.extractContents(); var div = me.document.createElement('div'); div.appendChild(frag); utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\r\t]/g,'')),me.options.filterTxtRules).children,function(node){ if(browser.ie && browser.ie11below && browser.version > 8){ if(node.type =='element'){ if(node.tagName == 'br'){ code += '\n' }else if(!dtd.$empty[node.tagName]){ utils.each(node.children,function(cn){ if(cn.type =='element'){ if(cn.tagName == 'br'){ code += '\n' }else if(!dtd.$empty[node.tagName]){ code += cn.innerText(); } }else{ code += cn.data } }) if(!/\n$/.test(code)){ code += '\n'; } } }else{ code += node.data + '\n' } if(!node.nextSibling() && /\n$/.test(code)){ code = code.replace(/\n$/,''); } }else{ if(browser.ie && browser.ie11below){ if(node.type =='element'){ if(node.tagName == 'br'){ code += '
            ' }else if(!dtd.$empty[node.tagName]){ utils.each(node.children,function(cn){ if(cn.type =='element'){ if(cn.tagName == 'br'){ code += '
            ' }else if(!dtd.$empty[node.tagName]){ code += cn.innerText(); } }else{ code += cn.data } }); if(!/br>$/.test(code)){ code += '
            '; } } }else{ code += node.data + '
            ' } if(!node.nextSibling() && /
            $/.test(code)){ code = code.replace(/
            $/,''); } }else{ code += (node.type == 'element' ? (dtd.$empty[node.tagName] ? '' : node.innerText()) : node.data); if(!/br\/?\s*>$/.test(code)){ if(!node.nextSibling()) return; code += '
            ' } } } }); } me.execCommand('inserthtml','
            '+code+'
            ',true); pre = me.document.getElementById('coder'); domUtils.removeAttributes(pre,'id'); var tmpNode = pre.previousSibling; if(tmpNode && (tmpNode.nodeType == 3 && tmpNode.nodeValue.length == 1 && browser.ie && browser.version == 6 || domUtils.isEmptyBlock(tmpNode))){ domUtils.remove(tmpNode) } var rng = me.selection.getRange(); if(domUtils.isEmptyBlock(pre)){ rng.setStart(pre,0).setCursor(false,true) }else{ rng.selectNodeContents(pre).select() } } }, queryCommandValue : function(){ var path = this.selection.getStartElementPath(); var lang = ''; utils.each(path,function(node){ if(node.nodeName =='PRE'){ var match = node.className.match(/brush:([^;]+)/); lang = match && match[1] ? match[1] : ''; return false; } }); return lang; } }; me.addInputRule(function(root){ utils.each(root.getNodesByTagName('pre'),function(pre){ var brs = pre.getNodesByTagName('br'); if(brs.length){ browser.ie && browser.ie11below && browser.version > 8 && utils.each(brs,function(br){ var txt = UE.uNode.createText('\n'); br.parentNode.insertBefore(txt,br); br.parentNode.removeChild(br); }); return; } if(browser.ie && browser.ie11below && browser.version > 8) return; var code = pre.innerText().split(/\n/); pre.innerHTML(''); utils.each(code,function(c){ if(c.length){ pre.appendChild(UE.uNode.createText(c)); } pre.appendChild(UE.uNode.createElement('br')) }) }) }); me.addOutputRule(function(root){ utils.each(root.getNodesByTagName('pre'),function(pre){ var code = ''; utils.each(pre.children,function(n){ if(n.type == 'text'){ //在ie下文本内容有可能末尾带有\n要去掉 //trace:3396 code += n.data.replace(/[ ]/g,' ').replace(/\n$/,''); }else{ if(n.tagName == 'br'){ code += '\n' }else{ code += (!dtd.$empty[n.tagName] ? '' : n.innerText()); } } }); pre.innerText(code.replace(/( |\n)+$/,'')) }) }); //不需要判断highlight的command列表 me.notNeedCodeQuery ={ help:1, undo:1, redo:1, source:1, print:1, searchreplace:1, fullscreen:1, preview:1, insertparagraph:1, elementpath:1, insertcode:1, inserthtml:1, selectall:1 }; //将queyCommamndState重置 var orgQuery = me.queryCommandState; me.queryCommandState = function(cmd){ var me = this; if(!me.notNeedCodeQuery[cmd.toLowerCase()] && me.selection && me.queryCommandValue('insertcode')){ return -1; } return UE.Editor.prototype.queryCommandState.apply(this,arguments) }; me.addListener('beforeenterkeydown',function(){ var rng = me.selection.getRange(); var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); if(pre){ me.fireEvent('saveScene'); if(!rng.collapsed){ rng.deleteContents(); } if(!browser.ie || browser.ie9above){ var tmpNode = me.document.createElement('br'),pre; rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); var next = tmpNode.nextSibling; if(!next && (!browser.ie || browser.version > 10)){ rng.insertNode(tmpNode.cloneNode(false)); }else{ rng.setStartAfter(tmpNode); } pre = tmpNode.previousSibling; var tmp; while(pre ){ tmp = pre; pre = pre.previousSibling; if(!pre || pre.nodeName == 'BR'){ pre = tmp; break; } } if(pre){ var str = ''; while(pre && pre.nodeName != 'BR' && new RegExp('^[\\s'+domUtils.fillChar+']*$').test(pre.nodeValue)){ str += pre.nodeValue; pre = pre.nextSibling; } if(pre.nodeName != 'BR'){ var match = pre.nodeValue.match(new RegExp('^([\\s'+domUtils.fillChar+']+)')); if(match && match[1]){ str += match[1] } } if(str){ str = me.document.createTextNode(str); rng.insertNode(str).setStartAfter(str); } } rng.collapse(true).select(true); }else{ if(browser.version > 8){ var txt = me.document.createTextNode('\n'); var start = rng.startContainer; if(rng.startOffset == 0){ var preNode = start.previousSibling; if(preNode){ rng.insertNode(txt); var fillchar = me.document.createTextNode(' '); rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) } }else{ rng.insertNode(txt).setStartAfter(txt); var fillchar = me.document.createTextNode(' '); start = rng.startContainer.childNodes[rng.startOffset]; if(start && !/^\n/.test(start.nodeValue)){ rng.setStartBefore(txt) } rng.insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) } }else{ var tmpNode = me.document.createElement('br'); rng.insertNode(tmpNode); rng.insertNode(me.document.createTextNode(domUtils.fillChar)); rng.setStartAfter(tmpNode); pre = tmpNode.previousSibling; var tmp; while(pre ){ tmp = pre; pre = pre.previousSibling; if(!pre || pre.nodeName == 'BR'){ pre = tmp; break; } } if(pre){ var str = ''; while(pre && pre.nodeName != 'BR' && new RegExp('^[ '+domUtils.fillChar+']*$').test(pre.nodeValue)){ str += pre.nodeValue; pre = pre.nextSibling; } if(pre.nodeName != 'BR'){ var match = pre.nodeValue.match(new RegExp('^([ '+domUtils.fillChar+']+)')); if(match && match[1]){ str += match[1] } } str = me.document.createTextNode(str); rng.insertNode(str).setStartAfter(str); } rng.collapse(true).select(); } } me.fireEvent('saveScene'); return true; } }); me.addListener('tabkeydown',function(cmd,evt){ var rng = me.selection.getRange(); var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); if(pre){ me.fireEvent('saveScene'); if(evt.shiftKey){ }else{ if(!rng.collapsed){ var bk = rng.createBookmark(); var start = bk.start.previousSibling; while(start){ if(pre.firstChild === start && !domUtils.isBr(start)){ pre.insertBefore(me.document.createTextNode(' '),start); break; } if(domUtils.isBr(start)){ pre.insertBefore(me.document.createTextNode(' '),start.nextSibling); break; } start = start.previousSibling; } var end = bk.end; start = bk.start.nextSibling; if(pre.firstChild === bk.start){ pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) } while(start && start !== end){ if(domUtils.isBr(start) && start.nextSibling){ if(start.nextSibling === end){ break; } pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) } start = start.nextSibling; } rng.moveToBookmark(bk).select(); }else{ var tmpNode = me.document.createTextNode(' '); rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true); } } me.fireEvent('saveScene'); return true; } }); me.addListener('beforeinserthtml',function(evtName,html){ var me = this, rng = me.selection.getRange(), pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); if(pre){ if(!rng.collapsed){ rng.deleteContents() } var htmlstr = ''; if(browser.ie && browser.version > 8){ utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ if(node.type =='element'){ if(node.tagName == 'br'){ htmlstr += '\n' }else if(!dtd.$empty[node.tagName]){ utils.each(node.children,function(cn){ if(cn.type =='element'){ if(cn.tagName == 'br'){ htmlstr += '\n' }else if(!dtd.$empty[node.tagName]){ htmlstr += cn.innerText(); } }else{ htmlstr += cn.data } }) if(!/\n$/.test(htmlstr)){ htmlstr += '\n'; } } }else{ htmlstr += node.data + '\n' } if(!node.nextSibling() && /\n$/.test(htmlstr)){ htmlstr = htmlstr.replace(/\n$/,''); } }); var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/ /g,' '))); rng.insertNode(tmpNode).selectNode(tmpNode).select(); }else{ var frag = me.document.createDocumentFragment(); utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ if(node.type =='element'){ if(node.tagName == 'br'){ frag.appendChild(me.document.createElement('br')) }else if(!dtd.$empty[node.tagName]){ utils.each(node.children,function(cn){ if(cn.type =='element'){ if(cn.tagName == 'br'){ frag.appendChild(me.document.createElement('br')) }else if(!dtd.$empty[node.tagName]){ frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/ /g,' ')))); } }else{ frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/ /g,' ')))); } }) if(frag.lastChild.nodeName != 'BR'){ frag.appendChild(me.document.createElement('br')) } } }else{ frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/ /g,' ')))); } if(!node.nextSibling() && frag.lastChild.nodeName == 'BR'){ frag.removeChild(frag.lastChild) } }); rng.insertNode(frag).select(); } return true; } }); //方向键的处理 me.addListener('keydown',function(cmd,evt){ var me = this,keyCode = evt.keyCode || evt.which; if(keyCode == 40){ var rng = me.selection.getRange(),pre,start = rng.startContainer; if(rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer,'pre',true)) && !pre.nextSibling){ var last = pre.lastChild while(last && last.nodeName == 'BR'){ last = last.previousSibling; } if(last === start || rng.startContainer === pre && rng.startOffset == pre.childNodes.length){ me.execCommand('insertparagraph'); domUtils.preventDefault(evt) } } } }); //trace:3395 me.addListener('delkeydown',function(type,evt){ var rng = this.selection.getRange(); rng.txtToElmBoundary(true); var start = rng.startContainer; if(domUtils.isTagNode(start,'pre') && rng.collapsed && domUtils.isStartInblock(rng)){ var p = me.document.createElement('p'); domUtils.fillNode(me.document,p); start.parentNode.insertBefore(p,start); domUtils.remove(start); rng.setStart(p,0).setCursor(false,true); domUtils.preventDefault(evt); return true; } }) }; // plugins/cleardoc.js /** * 清空文档插件 * @file * @since 1.2.6.1 */ /** * 清空文档 * @command cleardoc * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * //editor 是编辑器实例 * editor.execCommand('cleardoc'); * ``` */ UE.commands['cleardoc'] = { execCommand : function( cmdName) { var me = this, enterTag = me.options.enterTag, range = me.selection.getRange(); if(enterTag == "br"){ me.body.innerHTML = "
            "; range.setStart(me.body,0).setCursor(); }else{ me.body.innerHTML = "

            "+(ie ? "" : "
            ")+"

            "; range.setStart(me.body.firstChild,0).setCursor(false,true); } setTimeout(function(){ me.fireEvent("clearDoc"); },0); } }; // plugins/anchor.js /** * 锚点插件,为UEditor提供插入锚点支持 * @file * @since 1.2.6.1 */ UE.plugin.register('anchor', function (){ return { bindEvents:{ 'ready':function(){ utils.cssRule('anchor', '.anchorclass{background: url(\'' + this.options.themePath + this.options.theme +'/images/anchor.gif\') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}', this.document); } }, outputRule: function(root){ utils.each(root.getNodesByTagName('img'),function(a){ var val; if(val = a.getAttr('anchorname')){ a.tagName = 'a'; a.setAttr({ anchorname : '', name : val, 'class' : '' }) } }) }, inputRule:function(root){ utils.each(root.getNodesByTagName('a'),function(a){ var val; if((val = a.getAttr('name')) && !a.getAttr('href')){ a.tagName = 'img'; a.setAttr({ anchorname :a.getAttr('name'), 'class' : 'anchorclass' }); a.setAttr('name') } }) }, commands:{ /** * 插入锚点 * @command anchor * @method execCommand * @param { String } cmd 命令字符串 * @param { String } name 锚点名称字符串 * @example * ```javascript * //editor 是编辑器实例 * editor.execCommand('anchor', 'anchor1'); * ``` */ 'anchor':{ execCommand:function (cmd, name) { var range = this.selection.getRange(),img = range.getClosedNode(); if (img && img.getAttribute('anchorname')) { if (name) { img.setAttribute('anchorname', name); } else { range.setStartBefore(img).setCursor(); domUtils.remove(img); } } else { if (name) { //只在选区的开始插入 var anchor = this.document.createElement('img'); range.collapse(true); domUtils.setAttributes(anchor,{ 'anchorname':name, 'class':'anchorclass' }); range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true); } } } } } } }); // plugins/wordcount.js ///import core ///commands 字数统计 ///commandsName WordCount,wordCount ///commandsTitle 字数统计 /* * Created by JetBrains WebStorm. * User: taoqili * Date: 11-9-7 * Time: 下午8:18 * To change this template use File | Settings | File Templates. */ UE.plugins['wordcount'] = function(){ var me = this; me.setOpt('wordCount',true); me.addListener('contentchange',function(){ me.fireEvent('wordcount'); }); var timer; me.addListener('ready',function(){ var me = this; domUtils.on(me.body,"keyup",function(evt){ var code = evt.keyCode||evt.which, //忽略的按键,ctr,alt,shift,方向键 ignores = {"16":1,"18":1,"20":1,"37":1,"38":1,"39":1,"40":1}; if(code in ignores) return; clearTimeout(timer); timer = setTimeout(function(){ me.fireEvent('wordcount'); },200) }) }); }; // plugins/pagebreak.js /** * 分页功能插件 * @file * @since 1.2.6.1 */ UE.plugins['pagebreak'] = function () { var me = this, notBreakTags = ['td']; me.setOpt('pageBreakTag','_ueditor_page_break_tag_'); function fillNode(node){ if(domUtils.isEmptyBlock(node)){ var firstChild = node.firstChild,tmpNode; while(firstChild && firstChild.nodeType == 1 && domUtils.isEmptyBlock(firstChild)){ tmpNode = firstChild; firstChild = firstChild.firstChild; } !tmpNode && (tmpNode = node); domUtils.fillNode(me.document,tmpNode); } } //分页符样式添加 me.ready(function(){ utils.cssRule('pagebreak','.pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}',me.document); }); function isHr(node){ return node && node.nodeType == 1 && node.tagName == 'HR' && node.className == 'pagebreak'; } me.addInputRule(function(root){ root.traversal(function(node){ if(node.type == 'text' && node.data == me.options.pageBreakTag){ var hr = UE.uNode.createElement('
            '); node.parentNode.insertBefore(hr,node); node.parentNode.removeChild(node) } }) }); me.addOutputRule(function(node){ utils.each(node.getNodesByTagName('hr'),function(n){ if(n.getAttr('class') == 'pagebreak'){ var txt = UE.uNode.createText(me.options.pageBreakTag); n.parentNode.insertBefore(txt,n); n.parentNode.removeChild(n); } }) }); /** * 插入分页符 * @command pagebreak * @method execCommand * @param { String } cmd 命令字符串 * @remind 在表格中插入分页符会把表格切分成两部分 * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, * 以便于提交数据到服务器端后处理分页。 * @example * ```javascript * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak * ``` */ me.commands['pagebreak'] = { execCommand:function () { var range = me.selection.getRange(),hr = me.document.createElement('hr'); domUtils.setAttributes(hr,{ 'class' : 'pagebreak', noshade:"noshade", size:"5" }); domUtils.unSelectable(hr); //table单独处理 var node = domUtils.findParentByTagName(range.startContainer, notBreakTags, true), parents = [], pN; if (node) { switch (node.tagName) { case 'TD': pN = node.parentNode; if (!pN.previousSibling) { var table = domUtils.findParentByTagName(pN, 'table'); // var tableWrapDiv = table.parentNode; // if(tableWrapDiv && tableWrapDiv.nodeType == 1 // && tableWrapDiv.tagName == 'DIV' // && tableWrapDiv.getAttribute('dropdrag') // ){ // domUtils.remove(tableWrapDiv,true); // } table.parentNode.insertBefore(hr, table); parents = domUtils.findParents(hr, true); } else { pN.parentNode.insertBefore(hr, pN); parents = domUtils.findParents(hr); } pN = parents[1]; if (hr !== pN) { domUtils.breakParent(hr, pN); } //table要重写绑定一下拖拽 me.fireEvent('afteradjusttable',me.document); } } else { if (!range.collapsed) { range.deleteContents(); var start = range.startContainer; while ( !domUtils.isBody(start) && domUtils.isBlockElm(start) && domUtils.isEmptyNode(start)) { range.setStartBefore(start).collapse(true); domUtils.remove(start); start = range.startContainer; } } range.insertNode(hr); var pN = hr.parentNode, nextNode; while (!domUtils.isBody(pN)) { domUtils.breakParent(hr, pN); nextNode = hr.nextSibling; if (nextNode && domUtils.isEmptyBlock(nextNode)) { domUtils.remove(nextNode); } pN = hr.parentNode; } nextNode = hr.nextSibling; var pre = hr.previousSibling; if(isHr(pre)){ domUtils.remove(pre); }else{ pre && fillNode(pre); } if(!nextNode){ var p = me.document.createElement('p'); hr.parentNode.appendChild(p); domUtils.fillNode(me.document,p); range.setStart(p,0).collapse(true); }else{ if(isHr(nextNode)){ domUtils.remove(nextNode); }else{ fillNode(nextNode); } range.setEndAfter(hr).collapse(false); } range.select(true); } } }; }; // plugins/wordimage.js ///import core ///commands 本地图片引导上传 ///commandsName WordImage ///commandsTitle 本地图片引导上传 ///commandsDialog dialogs\wordimage UE.plugin.register('wordimage',function(){ var me = this, images = []; return { commands : { 'wordimage':{ execCommand:function () { var images = domUtils.getElementsByTagName(me.body, "img"); var urlList = []; for (var i = 0, ci; ci = images[i++];) { var url = ci.getAttribute("word_img"); url && urlList.push(url); } return urlList; }, queryCommandState:function () { images = domUtils.getElementsByTagName(me.body, "img"); for (var i = 0, ci; ci = images[i++];) { if (ci.getAttribute("word_img")) { return 1; } } return -1; }, notNeedUndo:true } }, inputRule : function (root) { utils.each(root.getNodesByTagName('img'), function (img) { var attrs = img.attrs, flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, opt = me.options, src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif'; if (attrs['src'] && /^(?:(file:\/+))/.test(attrs['src'])) { img.setAttr({ width:attrs.width, height:attrs.height, alt:attrs.alt, word_img: attrs.src, src:src, 'style':'background:url(' + ( flag ? opt.themePath + opt.theme + '/images/word.gif' : opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd' }) } }) } } }); // plugins/dragdrop.js UE.plugins['dragdrop'] = function (){ var me = this; me.ready(function(){ domUtils.on(this.body,'dragend',function(){ var rng = me.selection.getRange(); var node = rng.getClosedNode()||me.selection.getStart(); if(node && node.tagName == 'IMG'){ var pre = node.previousSibling,next; while(next = node.nextSibling){ if(next.nodeType == 1 && next.tagName == 'SPAN' && !next.firstChild){ domUtils.remove(next) }else{ break; } } if((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre) || !pre) && (!next || next && !domUtils.isEmptyBlock(next))){ if(pre && pre.tagName == 'P' && !domUtils.isEmptyBlock(pre)){ pre.appendChild(node); domUtils.moveChild(next,pre); domUtils.remove(next); }else if(next && next.tagName == 'P' && !domUtils.isEmptyBlock(next)){ next.insertBefore(node,next.firstChild); } if(pre && pre.tagName == 'P' && domUtils.isEmptyBlock(pre)){ domUtils.remove(pre) } if(next && next.tagName == 'P' && domUtils.isEmptyBlock(next)){ domUtils.remove(next) } rng.selectNode(node).select(); me.fireEvent('saveScene'); } } }) }); me.addListener('keyup', function(type, evt) { var keyCode = evt.keyCode || evt.which; if (keyCode == 13) { var rng = me.selection.getRange(),node; if(node = domUtils.findParentByTagName(rng.startContainer,'p',true)){ if(domUtils.getComputedStyle(node,'text-align') == 'center'){ domUtils.removeStyle(node,'text-align') } } } }) }; // plugins/undo.js /** * undo redo * @file * @since 1.2.6.1 */ /** * 撤销上一次执行的命令 * @command undo * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'undo' ); * ``` */ /** * 重做上一次执行的命令 * @command redo * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'redo' ); * ``` */ UE.plugins['undo'] = function () { var saveSceneTimer; var me = this, maxUndoCount = me.options.maxUndoCount || 20, maxInputCount = me.options.maxInputCount || 20, fillchar = new RegExp(domUtils.fillChar + '|<\/hr>', 'gi');// ie会产生多余的 var noNeedFillCharTags = { ol:1,ul:1,table:1,tbody:1,tr:1,body:1 }; var orgState = me.options.autoClearEmptyNode; function compareAddr(indexA, indexB) { if (indexA.length != indexB.length) return 0; for (var i = 0, l = indexA.length; i < l; i++) { if (indexA[i] != indexB[i]) return 0 } return 1; } function compareRangeAddress(rngAddrA, rngAddrB) { if (rngAddrA.collapsed != rngAddrB.collapsed) { return 0; } if (!compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)) { return 0; } return 1; } function UndoManager() { this.list = []; this.index = 0; this.hasUndo = false; this.hasRedo = false; this.undo = function () { if (this.hasUndo) { if (!this.list[this.index - 1] && this.list.length == 1) { this.reset(); return; } while (this.list[this.index].content == this.list[this.index - 1].content) { this.index--; if (this.index == 0) { return this.restore(0); } } this.restore(--this.index); } }; this.redo = function () { if (this.hasRedo) { while (this.list[this.index].content == this.list[this.index + 1].content) { this.index++; if (this.index == this.list.length - 1) { return this.restore(this.index); } } this.restore(++this.index); } }; this.restore = function () { var me = this.editor; var scene = this.list[this.index]; var root = UE.htmlparser(scene.content.replace(fillchar, '')); me.options.autoClearEmptyNode = false; me.filterInputRule(root); me.options.autoClearEmptyNode = orgState; //trace:873 //去掉展位符 me.document.body.innerHTML = root.toHtml(); me.fireEvent('afterscencerestore'); //处理undo后空格不展位的问题 if (browser.ie) { utils.each(domUtils.getElementsByTagName(me.document,'td th caption p'),function(node){ if(domUtils.isEmptyNode(node)){ domUtils.fillNode(me.document, node); } }) } try{ var rng = new dom.Range(me.document).moveToAddress(scene.address); rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]); }catch(e){} this.update(); this.clearKey(); //不能把自己reset了 me.fireEvent('reset', true); }; this.getScene = function () { var me = this.editor; var rng = me.selection.getRange(), rngAddress = rng.createAddress(false,true); me.fireEvent('beforegetscene'); var root = UE.htmlparser(me.body.innerHTML); me.options.autoClearEmptyNode = false; me.filterOutputRule(root); me.options.autoClearEmptyNode = orgState; var cont = root.toHtml(); //trace:3461 //这个会引起回退时导致空格丢失的情况 // browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); me.fireEvent('aftergetscene'); return { address:rngAddress, content:cont } }; this.save = function (notCompareRange,notSetCursor) { clearTimeout(saveSceneTimer); var currentScene = this.getScene(notSetCursor), lastScene = this.list[this.index]; if(lastScene && lastScene.content != currentScene.content){ me.trigger('contentchange') } //内容相同位置相同不存 if (lastScene && lastScene.content == currentScene.content && ( notCompareRange ? 1 : compareRangeAddress(lastScene.address, currentScene.address) ) ) { return; } this.list = this.list.slice(0, this.index + 1); this.list.push(currentScene); //如果大于最大数量了,就把最前的剔除 if (this.list.length > maxUndoCount) { this.list.shift(); } this.index = this.list.length - 1; this.clearKey(); //跟新undo/redo状态 this.update(); }; this.update = function () { this.hasRedo = !!this.list[this.index + 1]; this.hasUndo = !!this.list[this.index - 1]; }; this.reset = function () { this.list = []; this.index = 0; this.hasUndo = false; this.hasRedo = false; this.clearKey(); }; this.clearKey = function () { keycont = 0; lastKeyCode = null; }; } me.undoManger = new UndoManager(); me.undoManger.editor = me; function saveScene() { this.undoManger.save(); } me.addListener('saveScene', function () { var args = Array.prototype.splice.call(arguments,1); this.undoManger.save.apply(this.undoManger,args); }); // me.addListener('beforeexeccommand', saveScene); // me.addListener('afterexeccommand', saveScene); me.addListener('reset', function (type, exclude) { if (!exclude) { this.undoManger.reset(); } }); me.commands['redo'] = me.commands['undo'] = { execCommand:function (cmdName) { this.undoManger[cmdName](); }, queryCommandState:function (cmdName) { return this.undoManger['has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')] ? 0 : -1; }, notNeedUndo:1 }; var keys = { // /*Backspace*/ 8:1, /*Delete*/ 46:1, /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1, 37:1, 38:1, 39:1, 40:1 }, keycont = 0, lastKeyCode; //输入法状态下不计算字符数 var inputType = false; me.addListener('ready', function () { domUtils.on(this.body, 'compositionstart', function () { inputType = true; }); domUtils.on(this.body, 'compositionend', function () { inputType = false; }) }); //快捷键 me.addshortcutkey({ "Undo":"ctrl+90", //undo "Redo":"ctrl+89" //redo }); var isCollapsed = true; me.addListener('keydown', function (type, evt) { var me = this; var keyCode = evt.keyCode || evt.which; if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { if (inputType) return; if(!me.selection.getRange().collapsed){ me.undoManger.save(false,true); isCollapsed = false; return; } if (me.undoManger.list.length == 0) { me.undoManger.save(true); } clearTimeout(saveSceneTimer); function save(cont){ cont.undoManger.save(false,true); cont.fireEvent('selectionchange'); } saveSceneTimer = setTimeout(function(){ if(inputType){ var interalTimer = setInterval(function(){ if(!inputType){ save(me); clearInterval(interalTimer) } },300) return; } save(me); },200); lastKeyCode = keyCode; keycont++; if (keycont >= maxInputCount ) { save(me) } } }); me.addListener('keyup', function (type, evt) { var keyCode = evt.keyCode || evt.which; if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { if (inputType) return; if(!isCollapsed){ this.undoManger.save(false,true); isCollapsed = true; } } }); //扩展实例,添加关闭和开启命令undo me.stopCmdUndo = function(){ me.__hasEnterExecCommand = true; }; me.startCmdUndo = function(){ me.__hasEnterExecCommand = false; } }; // plugins/copy.js UE.plugin.register('copy', function () { var me = this; function initZeroClipboard() { ZeroClipboard.config({ debug: false, swfPath: me.options.UEDITOR_HOME_URL + 'third-party/zeroclipboard/ZeroClipboard.swf' }); var client = me.zeroclipboard = new ZeroClipboard(); // 复制内容 client.on('copy', function (e) { var client = e.client, rng = me.selection.getRange(), div = document.createElement('div'); div.appendChild(rng.cloneContents()); client.setText(div.innerText || div.textContent); client.setHtml(div.innerHTML); rng.select(); }); // hover事件传递到target client.on('mouseover mouseout', function (e) { var target = e.target; if (e.type == 'mouseover') { domUtils.addClass(target, 'edui-state-hover'); } else if (e.type == 'mouseout') { domUtils.removeClasses(target, 'edui-state-hover'); } }); // flash加载不成功 client.on('wrongflash noflash', function () { ZeroClipboard.destroy(); }); } return { bindEvents: { 'ready': function () { if (!browser.ie) { if (window.ZeroClipboard) { initZeroClipboard(); } else { utils.loadFile(document, { src: me.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.js", tag: "script", type: "text/javascript", defer: "defer" }, function () { initZeroClipboard(); }); } } } }, commands: { 'copy': { execCommand: function (cmd) { if (!me.document.execCommand('copy')) { alert(me.getLang('copymsg')); } } } } } }); // plugins/paste.js ///import core ///import plugins/inserthtml.js ///import plugins/undo.js ///import plugins/serialize.js ///commands 粘贴 ///commandsName PastePlain ///commandsTitle 纯文本粘贴模式 /** * @description 粘贴 * @author zhanyi */ UE.plugins['paste'] = function () { function getClipboardData(callback) { var doc = this.document; if (doc.getElementById('baidu_pastebin')) { return; } var range = this.selection.getRange(), bk = range.createBookmark(), //创建剪贴的容器div pastebin = doc.createElement('div'); pastebin.id = 'baidu_pastebin'; // Safari 要求div必须有内容,才能粘贴内容进来 browser.webkit && pastebin.appendChild(doc.createTextNode(domUtils.fillChar + domUtils.fillChar)); doc.body.appendChild(pastebin); //trace:717 隐藏的span不能得到top //bk.start.innerHTML = ' '; bk.start.style.display = ''; pastebin.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + //要在现在光标平行的位置加入,否则会出现跳动的问题 domUtils.getXY(bk.start).y + 'px'; range.selectNodeContents(pastebin).select(true); setTimeout(function () { if (browser.webkit) { for (var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi; pi = pastebins[i++];) { if (domUtils.isEmptyNode(pi)) { domUtils.remove(pi); } else { pastebin = pi; break; } } } try { pastebin.parentNode.removeChild(pastebin); } catch (e) { } range.moveToBookmark(bk).select(true); callback(pastebin); }, 0); } var me = this; me.setOpt({ retainOnlyLabelPasted : false }); var txtContent, htmlContent, address; function getPureHtml(html){ return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function (a, b, tagName, attrs) { tagName = tagName.toLowerCase(); if ({img: 1}[tagName]) { return a; } attrs = attrs.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, function (str, atr, val) { if ({ 'src': 1, 'href': 1, 'name': 1 }[atr.toLowerCase()]) { return atr + '=' + val + ' ' } return '' }); if ({ 'span': 1, 'div': 1 }[tagName]) { return '' } else { return '<' + b + tagName + ' ' + utils.trim(attrs) + '>' } }); } function filter(div) { var html; if (div.firstChild) { //去掉cut中添加的边界值 var nodes = domUtils.getElementsByTagName(div, 'span'); for (var i = 0, ni; ni = nodes[i++];) { if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') { domUtils.remove(ni); } } if (browser.webkit) { var brs = div.querySelectorAll('div br'); for (var i = 0, bi; bi = brs[i++];) { var pN = bi.parentNode; if (pN.tagName == 'DIV' && pN.childNodes.length == 1) { pN.innerHTML = '


            '; domUtils.remove(pN); } } var divs = div.querySelectorAll('#baidu_pastebin'); for (var i = 0, di; di = divs[i++];) { var tmpP = me.document.createElement('p'); di.parentNode.insertBefore(tmpP, di); while (di.firstChild) { tmpP.appendChild(di.firstChild); } domUtils.remove(di); } var metas = div.querySelectorAll('meta'); for (var i = 0, ci; ci = metas[i++];) { domUtils.remove(ci); } var brs = div.querySelectorAll('br'); for (i = 0; ci = brs[i++];) { if (/^apple-/i.test(ci.className)) { domUtils.remove(ci); } } } if (browser.gecko) { var dirtyNodes = div.querySelectorAll('[_moz_dirty]'); for (i = 0; ci = dirtyNodes[i++];) { ci.removeAttribute('_moz_dirty'); } } if (!browser.ie) { var spans = div.querySelectorAll('span.Apple-style-span'); for (var i = 0, ci; ci = spans[i++];) { domUtils.remove(ci, true); } } //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 html = div.innerHTML;//.replace(/>(?:(\s| )*?)<'); //过滤word粘贴过来的冗余属性 html = UE.filterWord(html); //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 var root = UE.htmlparser(html); //如果给了过滤规则就先进行过滤 if (me.options.filterRules) { UE.filterNode(root, me.options.filterRules); } //执行默认的处理 me.filterInputRule(root); //针对chrome的处理 if (browser.webkit) { var br = root.lastChild(); if (br && br.type == 'element' && br.tagName == 'br') { root.removeChild(br) } utils.each(me.body.querySelectorAll('div'), function (node) { if (domUtils.isEmptyBlock(node)) { domUtils.remove(node,true) } }) } html = {'html': root.toHtml()}; me.fireEvent('beforepaste', html, root); //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 if(!html.html){ return; } root = UE.htmlparser(html.html,true); //如果开启了纯文本模式 if (me.queryCommandState('pasteplain') === 1) { me.execCommand('insertHtml', UE.filterNode(root, me.options.filterTxtRules).toHtml(), true); } else { //文本模式 UE.filterNode(root, me.options.filterTxtRules); txtContent = root.toHtml(); //完全模式 htmlContent = html.html; address = me.selection.getRange().createAddress(true); me.execCommand('insertHtml', me.getOpt('retainOnlyLabelPasted') === true ? getPureHtml(htmlContent) : htmlContent, true); } me.fireEvent("afterpaste", html); } } me.addListener('pasteTransfer', function (cmd, plainType) { if (address && txtContent && htmlContent && txtContent != htmlContent) { var range = me.selection.getRange(); range.moveToAddress(address, true); if (!range.collapsed) { while (!domUtils.isBody(range.startContainer) ) { var start = range.startContainer; if(start.nodeType == 1){ start = start.childNodes[range.startOffset]; if(!start){ range.setStartBefore(range.startContainer); continue; } var pre = start.previousSibling; if(pre && pre.nodeType == 3 && new RegExp('^[\n\r\t '+domUtils.fillChar+']*$').test(pre.nodeValue)){ range.setStartBefore(pre) } } if(range.startOffset == 0){ range.setStartBefore(range.startContainer); }else{ break; } } while (!domUtils.isBody(range.endContainer) ) { var end = range.endContainer; if(end.nodeType == 1){ end = end.childNodes[range.endOffset]; if(!end){ range.setEndAfter(range.endContainer); continue; } var next = end.nextSibling; if(next && next.nodeType == 3 && new RegExp('^[\n\r\t'+domUtils.fillChar+']*$').test(next.nodeValue)){ range.setEndAfter(next) } } if(range.endOffset == range.endContainer[range.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length){ range.setEndAfter(range.endContainer); }else{ break; } } } range.deleteContents(); range.select(true); me.__hasEnterExecCommand = true; var html = htmlContent; if (plainType === 2 ) { html = getPureHtml(html); } else if (plainType) { html = txtContent; } me.execCommand('inserthtml', html, true); me.__hasEnterExecCommand = false; var rng = me.selection.getRange(); while (!domUtils.isBody(rng.startContainer) && !rng.startOffset && rng.startContainer[rng.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length ) { rng.setStartBefore(rng.startContainer); } var tmpAddress = rng.createAddress(true); address.endAddress = tmpAddress.startAddress; } }); me.addListener('ready', function () { domUtils.on(me.body, 'cut', function () { var range = me.selection.getRange(); if (!range.collapsed && me.undoManger) { me.undoManger.save(); } }); //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 domUtils.on(me.body, browser.ie || browser.opera ? 'keydown' : 'paste', function (e) { if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) { return; } getClipboardData.call(me, function (div) { filter(div); }); }); }); me.commands['paste'] = { execCommand: function (cmd) { if (browser.ie) { getClipboardData.call(me, function (div) { filter(div); }); me.document.execCommand('paste'); } else { alert(me.getLang('pastemsg')); } } } }; // plugins/puretxtpaste.js /** * 纯文本粘贴插件 * @file * @since 1.2.6.1 */ UE.plugins['pasteplain'] = function(){ var me = this; me.setOpt({ 'pasteplain':false, 'filterTxtRules' : function(){ function transP(node){ node.tagName = 'p'; node.setStyle(); } function removeNode(node){ node.parentNode.removeChild(node,true) } return { //直接删除及其字节点内容 '-' : 'script style object iframe embed input select', 'p': {$:{}}, 'br':{$:{}}, div: function (node) { var tmpNode, p = UE.uNode.createElement('p'); while (tmpNode = node.firstChild()) { if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { p.appendChild(tmpNode); } else { if (p.firstChild()) { node.parentNode.insertBefore(p, node); p = UE.uNode.createElement('p'); } else { node.parentNode.insertBefore(tmpNode, node); } } } if (p.firstChild()) { node.parentNode.insertBefore(p, node); } node.parentNode.removeChild(node); }, ol: removeNode, ul: removeNode, dl:removeNode, dt:removeNode, dd:removeNode, 'li':removeNode, 'caption':transP, 'th':transP, 'tr':transP, 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, 'td':function(node){ //没有内容的td直接删掉 var txt = !!node.innerText(); if(txt){ node.parentNode.insertAfter(UE.uNode.createText('    '),node); } node.parentNode.removeChild(node,node.innerText()) } } }() }); //暂时这里支持一下老版本的属性 var pasteplain = me.options.pasteplain; /** * 启用或取消纯文本粘贴模式 * @command pasteplain * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.queryCommandState( 'pasteplain' ); * ``` */ /** * 查询当前是否处于纯文本粘贴模式 * @command pasteplain * @method queryCommandState * @param { String } cmd 命令字符串 * @return { int } 如果处于纯文本模式,返回1,否则,返回0 * @example * ```javascript * editor.queryCommandState( 'pasteplain' ); * ``` */ me.commands['pasteplain'] = { queryCommandState: function (){ return pasteplain ? 1 : 0; }, execCommand: function (){ pasteplain = !pasteplain|0; }, notNeedUndo : 1 }; }; // plugins/list.js /** * 有序列表,无序列表插件 * @file * @since 1.2.6.1 */ UE.plugins['list'] = function () { var me = this, notExchange = { 'TD':1, 'PRE':1, 'BLOCKQUOTE':1 }; var customStyle = { 'cn' : 'cn-1-', 'cn1' : 'cn-2-', 'cn2' : 'cn-3-', 'num': 'num-1-', 'num1' : 'num-2-', 'num2' : 'num-3-', 'dash' : 'dash', 'dot':'dot' }; me.setOpt( { 'autoTransWordToList':false, 'insertorderedlist':{ 'num':'', 'num1':'', 'num2':'', 'cn':'', 'cn1':'', 'cn2':'', 'decimal':'', 'lower-alpha':'', 'lower-roman':'', 'upper-alpha':'', 'upper-roman':'' }, 'insertunorderedlist':{ 'circle':'', 'disc':'', 'square':'', 'dash' : '', 'dot':'' }, listDefaultPaddingLeft : '30', listiconpath : 'http://bs.baidu.com/listicon/', maxListLevel : -1,//-1不限制 disablePInList:false } ); function listToArray(list){ var arr = []; for(var p in list){ arr.push(p) } return arr; } var listStyle = { 'OL':listToArray(me.options.insertorderedlist), 'UL':listToArray(me.options.insertunorderedlist) }; var liiconpath = me.options.listiconpath; //根据用户配置,调整customStyle for(var s in customStyle){ if(!me.options.insertorderedlist.hasOwnProperty(s) && !me.options.insertunorderedlist.hasOwnProperty(s)){ delete customStyle[s]; } } me.ready(function () { var customCss = []; for(var p in customStyle){ if(p == 'dash' || p == 'dot'){ customCss.push('li.list-' + customStyle[p] + '{background-image:url(' + liiconpath +customStyle[p]+'.gif)}'); customCss.push('ul.custom_'+p+'{list-style:none;}ul.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); }else{ for(var i= 0;i<99;i++){ customCss.push('li.list-' + customStyle[p] + i + '{background-image:url(' + liiconpath + 'list-'+customStyle[p] + i + '.gif)}') } customCss.push('ol.custom_'+p+'{list-style:none;}ol.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); } switch(p){ case 'cn': customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); break; case 'cn1': customCss.push('li.list-'+p+'-paddingleft-1{padding-left:30px}'); customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); break; case 'cn2': customCss.push('li.list-'+p+'-paddingleft-1{padding-left:40px}'); customCss.push('li.list-'+p+'-paddingleft-2{padding-left:55px}'); customCss.push('li.list-'+p+'-paddingleft-3{padding-left:68px}'); break; case 'num': case 'num1': customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); break; case 'num2': customCss.push('li.list-'+p+'-paddingleft-1{padding-left:35px}'); customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); break; case 'dash': customCss.push('li.list-'+p+'-paddingleft{padding-left:35px}'); break; case 'dot': customCss.push('li.list-'+p+'-paddingleft{padding-left:20px}'); } } customCss.push('.list-paddingleft-1{padding-left:0}'); customCss.push('.list-paddingleft-2{padding-left:'+me.options.listDefaultPaddingLeft+'px}'); customCss.push('.list-paddingleft-3{padding-left:'+me.options.listDefaultPaddingLeft*2+'px}'); //如果不给宽度会在自定应样式里出现滚动条 utils.cssRule('list', 'ol,ul{margin:0;pading:0;'+(browser.ie ? '' : 'width:95%')+'}li{clear:both;}'+customCss.join('\n'), me.document); }); //单独处理剪切的问题 me.ready(function(){ domUtils.on(me.body,'cut',function(){ setTimeout(function(){ var rng = me.selection.getRange(),li; //trace:3416 if(!rng.collapsed){ if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ if(!li.nextSibling && domUtils.isEmptyBlock(li)){ var pn = li.parentNode,node; if(node = pn.previousSibling){ domUtils.remove(pn); rng.setStartAtLast(node).collapse(true); rng.select(true); }else if(node = pn.nextSibling){ domUtils.remove(pn); rng.setStartAtFirst(node).collapse(true); rng.select(true); }else{ var tmpNode = me.document.createElement('p'); domUtils.fillNode(me.document,tmpNode); pn.parentNode.insertBefore(tmpNode,pn); domUtils.remove(pn); rng.setStart(tmpNode,0).collapse(true); rng.select(true); } } } } }) }) }); function getStyle(node){ var cls = node.className; if(domUtils.hasClass(node,/custom_/)){ return cls.match(/custom_(\w+)/)[1] } return domUtils.getStyle(node, 'list-style-type') } me.addListener('beforepaste',function(type,html){ var me = this, rng = me.selection.getRange(),li; var root = UE.htmlparser(html.html,true); if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ var list = li.parentNode,tagName = list.tagName == 'OL' ? 'ul':'ol'; utils.each(root.getNodesByTagName(tagName),function(n){ n.tagName = list.tagName; n.setAttr(); if(n.parentNode === root){ type = getStyle(list) || (list.tagName == 'OL' ? 'decimal' : 'disc') }else{ var className = n.parentNode.getAttr('class'); if(className && /custom_/.test(className)){ type = className.match(/custom_(\w+)/)[1] }else{ type = n.parentNode.getStyle('list-style-type'); } if(!type){ type = list.tagName == 'OL' ? 'decimal' : 'disc'; } } var index = utils.indexOf(listStyle[list.tagName], type); if(n.parentNode !== root) index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; var currentStyle = listStyle[list.tagName][index]; if(customStyle[currentStyle]){ n.setAttr('class', 'custom_' + currentStyle) }else{ n.setStyle('list-style-type',currentStyle) } }) } html.html = root.toHtml(); }); //导出时,去掉p标签 me.getOpt('disablePInList') === true && me.addOutputRule(function(root){ utils.each(root.getNodesByTagName('li'),function(li){ var newChildrens = [],index=0; utils.each(li.children,function(n){ if(n.tagName == 'p'){ var tmpNode; while(tmpNode = n.children.pop()) { newChildrens.splice(index,0,tmpNode); tmpNode.parentNode = li; lastNode = tmpNode; } tmpNode = newChildrens[newChildrens.length-1]; if(!tmpNode || tmpNode.type != 'element' || tmpNode.tagName != 'br'){ var br = UE.uNode.createElement('br'); br.parentNode = li; newChildrens.push(br); } index = newChildrens.length; } }); if(newChildrens.length){ li.children = newChildrens; } }); }); //进入编辑器的li要套p标签 me.addInputRule(function(root){ utils.each(root.getNodesByTagName('li'),function(li){ var tmpP = UE.uNode.createElement('p'); for(var i= 0,ci;ci=li.children[i];){ if(ci.type == 'text' || dtd.p[ci.tagName]){ tmpP.appendChild(ci); }else{ if(tmpP.firstChild()){ li.insertBefore(tmpP,ci); tmpP = UE.uNode.createElement('p'); i = i + 2; }else{ i++; } } } if(tmpP.firstChild() && !tmpP.parentNode || !li.firstChild()){ li.appendChild(tmpP); } //trace:3357 //p不能为空 if (!tmpP.firstChild()) { tmpP.innerHTML(browser.ie ? ' ' : '
            ') } //去掉末尾的空白 var p = li.firstChild(); var lastChild = p.lastChild(); if(lastChild && lastChild.type == 'text' && /^\s*$/.test(lastChild.data)){ p.removeChild(lastChild) } }); if(me.options.autoTransWordToList){ var orderlisttype = { 'num1':/^\d+\)/, 'decimal':/^\d+\./, 'lower-alpha':/^[a-z]+\)/, 'upper-alpha':/^[A-Z]+\./, 'cn':/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/, 'cn2':/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/ }, unorderlisttype = { 'square':'n' }; function checkListType(content,container){ var span = container.firstChild(); if(span && span.type == 'element' && span.tagName == 'span' && /Wingdings|Symbol/.test(span.getStyle('font-family'))){ for(var p in unorderlisttype){ if(unorderlisttype[p] == span.data){ return p } } return 'disc' } for(var p in orderlisttype){ if(orderlisttype[p].test(content)){ return p; } } } utils.each(root.getNodesByTagName('p'),function(node){ if(node.getAttr('class') != 'MsoListParagraph'){ return } //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视 node.setStyle('margin',''); node.setStyle('margin-left',''); node.setAttr('class',''); function appendLi(list,p,type){ if(list.tagName == 'ol'){ if(browser.ie){ var first = p.firstChild(); if(first.type =='element' && first.tagName == 'span' && orderlisttype[type].test(first.innerText())){ p.removeChild(first); } }else{ p.innerHTML(p.innerHTML().replace(orderlisttype[type],'')); } }else{ p.removeChild(p.firstChild()) } var li = UE.uNode.createElement('li'); li.appendChild(p); list.appendChild(li); } var tmp = node,type,cacheNode = node; if(node.parentNode.tagName != 'li' && (type = checkListType(node.innerText(),node))){ var list = UE.uNode.createElement(me.options.insertorderedlist.hasOwnProperty(type) ? 'ol' : 'ul'); if(customStyle[type]){ list.setAttr('class','custom_'+type) }else{ list.setStyle('list-style-type',type) } while(node && node.parentNode.tagName != 'li' && checkListType(node.innerText(),node)){ tmp = node.nextSibling(); if(!tmp){ node.parentNode.insertBefore(list,node) } appendLi(list,node,type); node = tmp; } if(!list.parentNode && node && node.parentNode){ node.parentNode.insertBefore(list,node) } } var span = cacheNode.firstChild(); if(span && span.type == 'element' && span.tagName == 'span' && /^\s*( )+\s*$/.test(span.innerText())){ span.parentNode.removeChild(span) } }) } }); //调整索引标签 me.addListener('contentchange',function(){ adjustListStyle(me.document) }); function adjustListStyle(doc,ignore){ utils.each(domUtils.getElementsByTagName(doc,'ol ul'),function(node){ if(!domUtils.inDoc(node,doc)) return; var parent = node.parentNode; if(parent.tagName == node.tagName){ var nodeStyleType = getStyle(node) || (node.tagName == 'OL' ? 'decimal' : 'disc'), parentStyleType = getStyle(parent) || (parent.tagName == 'OL' ? 'decimal' : 'disc'); if(nodeStyleType == parentStyleType){ var styleIndex = utils.indexOf(listStyle[node.tagName], nodeStyleType); styleIndex = styleIndex + 1 == listStyle[node.tagName].length ? 0 : styleIndex + 1; setListStyle(node,listStyle[node.tagName][styleIndex]) } } var index = 0,type = 2; if( domUtils.hasClass(node,/custom_/)){ if(!(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/))){ type = 1; } }else{ if(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/)){ type = 3; } } var style = domUtils.getStyle(node, 'list-style-type'); style && (node.style.cssText = 'list-style-type:' + style); node.className = utils.trim(node.className.replace(/list-paddingleft-\w+/,'')) + ' list-paddingleft-' + type; utils.each(domUtils.getElementsByTagName(node,'li'),function(li){ li.style.cssText && (li.style.cssText = ''); if(!li.firstChild){ domUtils.remove(li); return; } if(li.parentNode !== node){ return; } index++; if(domUtils.hasClass(node,/custom_/) ){ var paddingLeft = 1,currentStyle = getStyle(node); if(node.tagName == 'OL'){ if(currentStyle){ switch(currentStyle){ case 'cn' : case 'cn1': case 'cn2': if(index > 10 && (index % 10 == 0 || index > 10 && index < 20)){ paddingLeft = 2 }else if(index > 20){ paddingLeft = 3 } break; case 'num2' : if(index > 9){ paddingLeft = 2 } } } li.className = 'list-'+customStyle[currentStyle]+ index + ' ' + 'list-'+currentStyle+'-paddingleft-' + paddingLeft; }else{ li.className = 'list-'+customStyle[currentStyle] + ' ' + 'list-'+currentStyle+'-paddingleft'; } }else{ li.className = li.className.replace(/list-[\w\-]+/gi,''); } var className = li.getAttribute('class'); if(className !== null && !className.replace(/\s/g,'')){ domUtils.removeAttributes(li,'class') } }); !ignore && adjustList(node,node.tagName.toLowerCase(),getStyle(node)||domUtils.getStyle(node, 'list-style-type'),true); }) } function adjustList(list, tag, style,ignoreEmpty) { var nextList = list.nextSibling; if (nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (getStyle(nextList) || domUtils.getStyle(nextList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { domUtils.moveChild(nextList, list); if (nextList.childNodes.length == 0) { domUtils.remove(nextList); } } if(nextList && domUtils.isFillChar(nextList)){ domUtils.remove(nextList); } var preList = list.previousSibling; if (preList && preList.nodeType == 1 && preList.tagName.toLowerCase() == tag && (getStyle(preList) || domUtils.getStyle(preList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { domUtils.moveChild(list, preList); } if(preList && domUtils.isFillChar(preList)){ domUtils.remove(preList); } !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list); if(getStyle(list)){ adjustListStyle(list.ownerDocument,true) } } function setListStyle(list,style){ if(customStyle[style]){ list.className = 'custom_' + style; } try{ domUtils.setStyle(list, 'list-style-type', style); }catch(e){} } function clearEmptySibling(node) { var tmpNode = node.previousSibling; if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { domUtils.remove(tmpNode); } tmpNode = node.nextSibling; if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { domUtils.remove(tmpNode); } } me.addListener('keydown', function (type, evt) { function preventAndSave() { evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); me.fireEvent('contentchange'); me.undoManger && me.undoManger.save(); } function findList(node,filterFn){ while(node && !domUtils.isBody(node)){ if(filterFn(node)){ return null } if(node.nodeType == 1 && /[ou]l/i.test(node.tagName)){ return node; } node = node.parentNode; } return null; } var keyCode = evt.keyCode || evt.which; if (keyCode == 13 && !evt.shiftKey) {//回车 var rng = me.selection.getRange(), parent = domUtils.findParent(rng.startContainer,function(node){return domUtils.isBlockElm(node)},true), li = domUtils.findParentByTagName(rng.startContainer,'li',true); if(parent && parent.tagName != 'PRE' && !li){ var html = parent.innerHTML.replace(new RegExp(domUtils.fillChar, 'g'),''); if(/^\s*1\s*\.[^\d]/.test(html)){ parent.innerHTML = html.replace(/^\s*1\s*\./,''); rng.setStartAtLast(parent).collapse(true).select(); me.__hasEnterExecCommand = true; me.execCommand('insertorderedlist'); me.__hasEnterExecCommand = false; } } var range = me.selection.getRange(), start = findList(range.startContainer,function (node) { return node.tagName == 'TABLE'; }), end = range.collapsed ? start : findList(range.endContainer,function (node) { return node.tagName == 'TABLE'; }); if (start && end && start === end) { if (!range.collapsed) { start = domUtils.findParentByTagName(range.startContainer, 'li', true); end = domUtils.findParentByTagName(range.endContainer, 'li', true); if (start && end && start === end) { range.deleteContents(); li = domUtils.findParentByTagName(range.startContainer, 'li', true); if (li && domUtils.isEmptyBlock(li)) { pre = li.previousSibling; next = li.nextSibling; p = me.document.createElement('p'); domUtils.fillNode(me.document, p); parentList = li.parentNode; if (pre && next) { range.setStart(next, 0).collapse(true).select(true); domUtils.remove(li); } else { if (!pre && !next || !pre) { parentList.parentNode.insertBefore(p, parentList); } else { li.parentNode.parentNode.insertBefore(p, parentList.nextSibling); } domUtils.remove(li); if (!parentList.firstChild) { domUtils.remove(parentList); } range.setStart(p, 0).setCursor(); } preventAndSave(); return; } } else { var tmpRange = range.cloneRange(), bk = tmpRange.collapse(false).createBookmark(); range.deleteContents(); tmpRange.moveToBookmark(bk); var li = domUtils.findParentByTagName(tmpRange.startContainer, 'li', true); clearEmptySibling(li); tmpRange.select(); preventAndSave(); return; } } li = domUtils.findParentByTagName(range.startContainer, 'li', true); if (li) { if (domUtils.isEmptyBlock(li)) { bk = range.createBookmark(); var parentList = li.parentNode; if (li !== parentList.lastChild) { domUtils.breakParent(li, parentList); clearEmptySibling(li); } else { parentList.parentNode.insertBefore(li, parentList.nextSibling); if (domUtils.isEmptyNode(parentList)) { domUtils.remove(parentList); } } //嵌套不处理 if (!dtd.$list[li.parentNode.tagName]) { if (!domUtils.isBlockElm(li.firstChild)) { p = me.document.createElement('p'); li.parentNode.insertBefore(p, li); while (li.firstChild) { p.appendChild(li.firstChild); } domUtils.remove(li); } else { domUtils.remove(li, true); } } range.moveToBookmark(bk).select(); } else { var first = li.firstChild; if (!first || !domUtils.isBlockElm(first)) { var p = me.document.createElement('p'); !li.firstChild && domUtils.fillNode(me.document, p); while (li.firstChild) { p.appendChild(li.firstChild); } li.appendChild(p); first = p; } var span = me.document.createElement('span'); range.insertNode(span); domUtils.breakParent(span, li); var nextLi = span.nextSibling; first = nextLi.firstChild; if (!first) { p = me.document.createElement('p'); domUtils.fillNode(me.document, p); nextLi.appendChild(p); first = p; } if (domUtils.isEmptyNode(first)) { first.innerHTML = ''; domUtils.fillNode(me.document, first); } range.setStart(first, 0).collapse(true).shrinkBoundary().select(); domUtils.remove(span); var pre = nextLi.previousSibling; if (pre && domUtils.isEmptyBlock(pre)) { pre.innerHTML = '

            '; domUtils.fillNode(me.document, pre.firstChild); } } // } preventAndSave(); } } } if (keyCode == 8) { //修中ie中li下的问题 range = me.selection.getRange(); if (range.collapsed && domUtils.isStartInblock(range)) { tmpRange = range.cloneRange().trimBoundary(); li = domUtils.findParentByTagName(range.startContainer, 'li', true); //要在li的最左边,才能处理 if (li && domUtils.isStartInblock(tmpRange)) { start = domUtils.findParentByTagName(range.startContainer, 'p', true); if (start && start !== li.firstChild) { var parentList = domUtils.findParentByTagName(start,['ol','ul']); domUtils.breakParent(start,parentList); clearEmptySibling(start); me.fireEvent('contentchange'); range.setStart(start,0).setCursor(false,true); me.fireEvent('saveScene'); domUtils.preventDefault(evt); return; } if (li && (pre = li.previousSibling)) { if (keyCode == 46 && li.childNodes.length) { return; } //有可能上边的兄弟节点是个2级菜单,要追加到2级菜单的最后的li if (dtd.$list[pre.tagName]) { pre = pre.lastChild; } me.undoManger && me.undoManger.save(); first = li.firstChild; if (domUtils.isBlockElm(first)) { if (domUtils.isEmptyNode(first)) { // range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); pre.appendChild(first); range.setStart(first, 0).setCursor(false, true); //first不是唯一的节点 while (li.firstChild) { pre.appendChild(li.firstChild); } } else { span = me.document.createElement('span'); range.insertNode(span); //判断pre是否是空的节点,如果是


            类型的空节点,干掉p标签防止它占位 if (domUtils.isEmptyBlock(pre)) { pre.innerHTML = ''; } domUtils.moveChild(li, pre); range.setStartBefore(span).collapse(true).select(true); domUtils.remove(span); } } else { if (domUtils.isEmptyNode(li)) { var p = me.document.createElement('p'); pre.appendChild(p); range.setStart(p, 0).setCursor(); // range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); } else { range.setEnd(pre, pre.childNodes.length).collapse().select(true); while (li.firstChild) { pre.appendChild(li.firstChild); } } } domUtils.remove(li); me.fireEvent('contentchange'); me.fireEvent('saveScene'); domUtils.preventDefault(evt); return; } //trace:980 if (li && !li.previousSibling) { var parentList = li.parentNode; var bk = range.createBookmark(); if(domUtils.isTagNode(parentList.parentNode,'ol ul')){ parentList.parentNode.insertBefore(li,parentList); if(domUtils.isEmptyNode(parentList)){ domUtils.remove(parentList) } }else{ while(li.firstChild){ parentList.parentNode.insertBefore(li.firstChild,parentList); } domUtils.remove(li); if(domUtils.isEmptyNode(parentList)){ domUtils.remove(parentList) } } range.moveToBookmark(bk).setCursor(false,true); me.fireEvent('contentchange'); me.fireEvent('saveScene'); domUtils.preventDefault(evt); return; } } } } }); me.addListener('keyup',function(type, evt){ var keyCode = evt.keyCode || evt.which; if (keyCode == 8) { var rng = me.selection.getRange(),list; if(list = domUtils.findParentByTagName(rng.startContainer,['ol', 'ul'],true)){ adjustList(list,list.tagName.toLowerCase(),getStyle(list)||domUtils.getComputedStyle(list,'list-style-type'),true) } } }); //处理tab键 me.addListener('tabkeydown',function(){ var range = me.selection.getRange(); //控制级数 function checkLevel(li){ if(me.options.maxListLevel != -1){ var level = li.parentNode,levelNum = 0; while(/[ou]l/i.test(level.tagName)){ levelNum++; level = level.parentNode; } if(levelNum >= me.options.maxListLevel){ return true; } } } //只以开始为准 //todo 后续改进 var li = domUtils.findParentByTagName(range.startContainer, 'li', true); if(li){ var bk; if(range.collapsed){ if(checkLevel(li)) return true; var parentLi = li.parentNode, list = me.document.createElement(parentLi.tagName), index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; var currentStyle = listStyle[list.tagName][index]; setListStyle(list,currentStyle); if(domUtils.isStartInblock(range)){ me.fireEvent('saveScene'); bk = range.createBookmark(); parentLi.insertBefore(list, li); list.appendChild(li); adjustList(list,list.tagName.toLowerCase(),currentStyle); me.fireEvent('contentchange'); range.moveToBookmark(bk).select(true); return true; } }else{ me.fireEvent('saveScene'); bk = range.createBookmark(); for(var i= 0,closeList,parents = domUtils.findParents(li),ci;ci=parents[i++];){ if(domUtils.isTagNode(ci,'ol ul')){ closeList = ci; break; } } var current = li; if(bk.end){ while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ if(checkLevel(current)){ current = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); continue; } var parentLi = current.parentNode, list = me.document.createElement(parentLi.tagName), index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); var currentIndex = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; var currentStyle = listStyle[list.tagName][currentIndex]; setListStyle(list,currentStyle); parentLi.insertBefore(list, current); while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ li = current.nextSibling; list.appendChild(current); if(!li || domUtils.isTagNode(li,'ol ul')){ if(li){ while(li = li.firstChild){ if(li.tagName == 'LI'){ break; } } }else{ li = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); } break; } current = li; } adjustList(list,list.tagName.toLowerCase(),currentStyle); current = li; } } me.fireEvent('contentchange'); range.moveToBookmark(bk).select(); return true; } } }); function getLi(start){ while(start && !domUtils.isBody(start)){ if(start.nodeName == 'TABLE'){ return null; } if(start.nodeName == 'LI'){ return start } start = start.parentNode; } } /** * 有序列表,与“insertunorderedlist”命令互斥 * @command insertorderedlist * @method execCommand * @param { String } command 命令字符串 * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 * @example * ```javascript * editor.execCommand( 'insertorderedlist','decimal'); * ``` */ /** * 查询当前选区内容是否有序列表 * @command insertorderedlist * @method queryCommandState * @param { String } cmd 命令字符串 * @return { int } 如果当前选区是有序列表返回1,否则返回0 * @example * ```javascript * editor.queryCommandState( 'insertorderedlist' ); * ``` */ /** * 查询当前选区内容是否有序列表 * @command insertorderedlist * @method queryCommandValue * @param { String } cmd 命令字符串 * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 * @example * ```javascript * editor.queryCommandValue( 'insertorderedlist' ); * ``` */ /** * 无序列表,与“insertorderedlist”命令互斥 * @command insertunorderedlist * @method execCommand * @param { String } command 命令字符串 * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot * @example * ```javascript * editor.execCommand( 'insertunorderedlist','circle'); * ``` */ /** * 查询当前是否有word文档粘贴进来的图片 * @command insertunorderedlist * @method insertunorderedlist * @param { String } command 命令字符串 * @return { int } 如果当前选区是无序列表返回1,否则返回0 * @example * ```javascript * editor.queryCommandState( 'insertunorderedlist' ); * ``` */ /** * 查询当前选区内容是否有序列表 * @command insertunorderedlist * @method queryCommandValue * @param { String } command 命令字符串 * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot * @example * ```javascript * editor.queryCommandValue( 'insertunorderedlist' ); * ``` */ me.commands['insertorderedlist'] = me.commands['insertunorderedlist'] = { execCommand:function (command, style) { if (!style) { style = command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'; } var me = this, range = this.selection.getRange(), filterFn = function (node) { return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); }, tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul', frag = me.document.createDocumentFragment(); //去掉是因为会出现选到末尾,导致adjustmentBoundary缩到ol/ul的位置 //range.shrinkBoundary();//.adjustmentBoundary(); range.adjustmentBoundary().shrinkBoundary(); var bko = range.createBookmark(true), start = getLi(me.document.getElementById(bko.start)), modifyStart = 0, end = getLi(me.document.getElementById(bko.end)), modifyEnd = 0, startParent, endParent, list, tmp; if (start || end) { start && (startParent = start.parentNode); if (!bko.end) { end = start; } end && (endParent = end.parentNode); if (startParent === endParent) { while (start !== end) { tmp = start; start = start.nextSibling; if (!domUtils.isBlockElm(tmp.firstChild)) { var p = me.document.createElement('p'); while (tmp.firstChild) { p.appendChild(tmp.firstChild); } tmp.appendChild(p); } frag.appendChild(tmp); } tmp = me.document.createElement('span'); startParent.insertBefore(tmp, end); if (!domUtils.isBlockElm(end.firstChild)) { p = me.document.createElement('p'); while (end.firstChild) { p.appendChild(end.firstChild); } end.appendChild(p); } frag.appendChild(end); domUtils.breakParent(tmp, startParent); if (domUtils.isEmptyNode(tmp.previousSibling)) { domUtils.remove(tmp.previousSibling); } if (domUtils.isEmptyNode(tmp.nextSibling)) { domUtils.remove(tmp.nextSibling) } var nodeStyle = getStyle(startParent) || domUtils.getComputedStyle(startParent, 'list-style-type') || (command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'); if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) { for (var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); ci = frag.firstChild;) { if(domUtils.isTagNode(ci,'ol ul')){ // 删除时,子列表不处理 // utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){ // while(li.firstChild){ // tmpFrag.appendChild(li.firstChild); // } // // }); tmpFrag.appendChild(ci); }else{ while (ci.firstChild) { tmpFrag.appendChild(ci.firstChild); domUtils.remove(ci); } } } tmp.parentNode.insertBefore(tmpFrag, tmp); } else { list = me.document.createElement(tag); setListStyle(list,style); list.appendChild(frag); tmp.parentNode.insertBefore(list, tmp); } domUtils.remove(tmp); list && adjustList(list, tag, style); range.moveToBookmark(bko).select(); return; } //开始 if (start) { while (start) { tmp = start.nextSibling; if (domUtils.isTagNode(start, 'ol ul')) { frag.appendChild(start); } else { var tmpfrag = me.document.createDocumentFragment(), hasBlock = 0; while (start.firstChild) { if (domUtils.isBlockElm(start.firstChild)) { hasBlock = 1; } tmpfrag.appendChild(start.firstChild); } if (!hasBlock) { var tmpP = me.document.createElement('p'); tmpP.appendChild(tmpfrag); frag.appendChild(tmpP); } else { frag.appendChild(tmpfrag); } domUtils.remove(start); } start = tmp; } startParent.parentNode.insertBefore(frag, startParent.nextSibling); if (domUtils.isEmptyNode(startParent)) { range.setStartBefore(startParent); domUtils.remove(startParent); } else { range.setStartAfter(startParent); } modifyStart = 1; } if (end && domUtils.inDoc(endParent, me.document)) { //结束 start = endParent.firstChild; while (start && start !== end) { tmp = start.nextSibling; if (domUtils.isTagNode(start, 'ol ul')) { frag.appendChild(start); } else { tmpfrag = me.document.createDocumentFragment(); hasBlock = 0; while (start.firstChild) { if (domUtils.isBlockElm(start.firstChild)) { hasBlock = 1; } tmpfrag.appendChild(start.firstChild); } if (!hasBlock) { tmpP = me.document.createElement('p'); tmpP.appendChild(tmpfrag); frag.appendChild(tmpP); } else { frag.appendChild(tmpfrag); } domUtils.remove(start); } start = tmp; } var tmpDiv = domUtils.createElement(me.document, 'div', { 'tmpDiv':1 }); domUtils.moveChild(end, tmpDiv); frag.appendChild(tmpDiv); domUtils.remove(end); endParent.parentNode.insertBefore(frag, endParent); range.setEndBefore(endParent); if (domUtils.isEmptyNode(endParent)) { domUtils.remove(endParent); } modifyEnd = 1; } } if (!modifyStart) { range.setStartBefore(me.document.getElementById(bko.start)); } if (bko.end && !modifyEnd) { range.setEndAfter(me.document.getElementById(bko.end)); } range.enlarge(true, function (node) { return notExchange[node.tagName]; }); frag = me.document.createDocumentFragment(); var bk = range.createBookmark(), current = domUtils.getNextDomNode(bk.start, false, filterFn), tmpRange = range.cloneRange(), tmpNode, block = domUtils.isBlockElm; while (current && current !== bk.end && (domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING)) { if (current.nodeType == 3 || dtd.li[current.tagName]) { if (current.nodeType == 1 && dtd.$list[current.tagName]) { while (current.firstChild) { frag.appendChild(current.firstChild); } tmpNode = domUtils.getNextDomNode(current, false, filterFn); domUtils.remove(current); current = tmpNode; continue; } tmpNode = current; tmpRange.setStartBefore(current); while (current && current !== bk.end && (!block(current) || domUtils.isBookmarkNode(current) )) { tmpNode = current; current = domUtils.getNextDomNode(current, false, null, function (node) { return !notExchange[node.tagName]; }); } if (current && block(current)) { tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); if (tmp && domUtils.isBookmarkNode(tmp)) { current = domUtils.getNextDomNode(tmp, false, filterFn); tmpNode = tmp; } } tmpRange.setEndAfter(tmpNode); current = domUtils.getNextDomNode(tmpNode, false, filterFn); var li = range.document.createElement('li'); li.appendChild(tmpRange.extractContents()); if(domUtils.isEmptyNode(li)){ var tmpNode = range.document.createElement('p'); while(li.firstChild){ tmpNode.appendChild(li.firstChild) } li.appendChild(tmpNode); } frag.appendChild(li); } else { current = domUtils.getNextDomNode(current, true, filterFn); } } range.moveToBookmark(bk).collapse(true); list = me.document.createElement(tag); setListStyle(list,style); list.appendChild(frag); range.insertNode(list); //当前list上下看能否合并 adjustList(list, tag, style); //去掉冗余的tmpDiv for (var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, 'div'); ci = tmpDivs[i++];) { if (ci.getAttribute('tmpDiv')) { domUtils.remove(ci, true) } } range.moveToBookmark(bko).select(); }, queryCommandState:function (command) { var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; var path = this.selection.getStartElementPath(); for(var i= 0,ci;ci = path[i++];){ if(ci.nodeName == 'TABLE'){ return 0 } if(tag == ci.nodeName.toLowerCase()){ return 1 }; } return 0; }, queryCommandValue:function (command) { var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; var path = this.selection.getStartElementPath(), node; for(var i= 0,ci;ci = path[i++];){ if(ci.nodeName == 'TABLE'){ node = null; break; } if(tag == ci.nodeName.toLowerCase()){ node = ci; break; }; } return node ? getStyle(node) || domUtils.getComputedStyle(node, 'list-style-type') : null; } }; }; // plugins/source.js /** * 源码编辑插件 * @file * @since 1.2.6.1 */ (function (){ var sourceEditors = { textarea: function (editor, holder){ var textarea = holder.ownerDocument.createElement('textarea'); textarea.style.cssText = 'position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;'; // todo: IE下只有onresize属性可用... 很纠结 if (browser.ie && browser.version < 8) { textarea.style.width = holder.offsetWidth + 'px'; textarea.style.height = holder.offsetHeight + 'px'; holder.onresize = function (){ textarea.style.width = holder.offsetWidth + 'px'; textarea.style.height = holder.offsetHeight + 'px'; }; } holder.appendChild(textarea); return { setContent: function (content){ textarea.value = content; }, getContent: function (){ return textarea.value; }, select: function (){ var range; if (browser.ie) { range = textarea.createTextRange(); range.collapse(true); range.select(); } else { //todo: chrome下无法设置焦点 textarea.setSelectionRange(0, 0); textarea.focus(); } }, dispose: function (){ holder.removeChild(textarea); // todo holder.onresize = null; textarea = null; holder = null; } }; }, codemirror: function (editor, holder){ var codeEditor = window.CodeMirror(holder, { mode: "text/html", tabMode: "indent", lineNumbers: true, lineWrapping:true }); var dom = codeEditor.getWrapperElement(); dom.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'; codeEditor.getScrollerElement().style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;'; codeEditor.refresh(); return { getCodeMirror:function(){ return codeEditor; }, setContent: function (content){ codeEditor.setValue(content); }, getContent: function (){ return codeEditor.getValue(); }, select: function (){ codeEditor.focus(); }, dispose: function (){ holder.removeChild(dom); dom = null; codeEditor = null; } }; } }; UE.plugins['source'] = function (){ var me = this; var opt = this.options; var sourceMode = false; var sourceEditor; var orgSetContent; opt.sourceEditor = browser.ie ? 'textarea' : (opt.sourceEditor || 'codemirror'); me.setOpt({ sourceEditorFirst:false }); function createSourceEditor(holder){ return sourceEditors[opt.sourceEditor == 'codemirror' && window.CodeMirror ? 'codemirror' : 'textarea'](me, holder); } var bakCssText; //解决在源码模式下getContent不能得到最新的内容问题 var oldGetContent, bakAddress; /** * 切换源码模式和编辑模式 * @command source * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'source'); * ``` */ /** * 查询当前编辑区域的状态是源码模式还是可视化模式 * @command source * @method queryCommandState * @param { String } cmd 命令字符串 * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 * @example * ```javascript * editor.queryCommandState( 'source' ); * ``` */ me.commands['source'] = { execCommand: function (){ sourceMode = !sourceMode; if (sourceMode) { bakAddress = me.selection.getRange().createAddress(false,true); me.undoManger && me.undoManger.save(true); if(browser.gecko){ me.body.contentEditable = false; } bakCssText = me.iframe.style.cssText; me.iframe.style.cssText += 'position:absolute;left:-32768px;top:-32768px;'; me.fireEvent('beforegetcontent'); var root = UE.htmlparser(me.body.innerHTML); me.filterOutputRule(root); root.traversal(function (node) { if (node.type == 'element') { switch (node.tagName) { case 'td': case 'th': case 'caption': if(node.children && node.children.length == 1){ if(node.firstChild().tagName == 'br' ){ node.removeChild(node.firstChild()) } }; break; case 'pre': node.innerText(node.innerText().replace(/ /g,' ')) } } }); me.fireEvent('aftergetcontent'); var content = root.toHtml(true); sourceEditor = createSourceEditor(me.iframe.parentNode); sourceEditor.setContent(content); orgSetContent = me.setContent; me.setContent = function(html){ //这里暂时不触发事件,防止报错 var root = UE.htmlparser(html); me.filterInputRule(root); html = root.toHtml(); sourceEditor.setContent(html); }; setTimeout(function (){ sourceEditor.select(); me.addListener('fullscreenchanged', function(){ try{ sourceEditor.getCodeMirror().refresh() }catch(e){} }); }); //重置getContent,源码模式下取值也能是最新的数据 oldGetContent = me.getContent; me.getContent = function (){ return sourceEditor.getContent() || '

            ' + (browser.ie ? '' : '
            ')+'

            '; }; } else { me.iframe.style.cssText = bakCssText; var cont = sourceEditor.getContent() || '

            ' + (browser.ie ? '' : '
            ')+'

            '; //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 cont = cont.replace(new RegExp('[\\r\\t\\n ]*<\/?(\\w+)\\s*(?:[^>]*)>','g'), function(a,b){ if(b && !dtd.$inlineWithA[b.toLowerCase()]){ return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,''); } return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,'') }); me.setContent = orgSetContent; me.setContent(cont); sourceEditor.dispose(); sourceEditor = null; //还原getContent方法 me.getContent = oldGetContent; var first = me.body.firstChild; //trace:1106 都删除空了,下边会报错,所以补充一个p占位 if(!first){ me.body.innerHTML = '

            '+(browser.ie?'':'
            ')+'

            '; first = me.body.firstChild; } //要在ifm为显示时ff才能取到selection,否则报错 //这里不能比较位置了 me.undoManger && me.undoManger.save(true); if(browser.gecko){ var input = document.createElement('input'); input.style.cssText = 'position:absolute;left:0;top:-32768px'; document.body.appendChild(input); me.body.contentEditable = false; setTimeout(function(){ domUtils.setViewportOffset(input, { left: -32768, top: 0 }); input.focus(); setTimeout(function(){ me.body.contentEditable = true; me.selection.getRange().moveToAddress(bakAddress).select(true); domUtils.remove(input); }); }); }else{ //ie下有可能报错,比如在代码顶头的情况 try{ me.selection.getRange().moveToAddress(bakAddress).select(true); }catch(e){} } } this.fireEvent('sourcemodechanged', sourceMode); }, queryCommandState: function (){ return sourceMode|0; }, notNeedUndo : 1 }; var oldQueryCommandState = me.queryCommandState; me.queryCommandState = function (cmdName){ cmdName = cmdName.toLowerCase(); if (sourceMode) { //源码模式下可以开启的命令 return cmdName in { 'source' : 1, 'fullscreen' : 1 } ? 1 : -1 } return oldQueryCommandState.apply(this, arguments); }; if(opt.sourceEditor == "codemirror"){ me.addListener("ready",function(){ utils.loadFile(document,{ src : opt.codeMirrorJsUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js", tag : "script", type : "text/javascript", defer : "defer" },function(){ if(opt.sourceEditorFirst){ setTimeout(function(){ me.execCommand("source"); },0); } }); utils.loadFile(document,{ tag : "link", rel : "stylesheet", type : "text/css", href : opt.codeMirrorCssUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css" }); }); } }; })(); // plugins/enterkey.js ///import core ///import plugins/undo.js ///commands 设置回车标签p或br ///commandsName EnterKey ///commandsTitle 设置回车标签p或br /** * @description 处理回车 * @author zhanyi */ UE.plugins['enterkey'] = function() { var hTag, me = this, tag = me.options.enterTag; me.addListener('keyup', function(type, evt) { var keyCode = evt.keyCode || evt.which; if (keyCode == 13) { var range = me.selection.getRange(), start = range.startContainer, doSave; //修正在h1-h6里边回车后不能嵌套p的问题 if (!browser.ie) { if (/h\d/i.test(hTag)) { if (browser.gecko) { var h = domUtils.findParentByTagName(start, [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption','table'], true); if (!h) { me.document.execCommand('formatBlock', false, '

            '); doSave = 1; } } else { //chrome remove div if (start.nodeType == 1) { var tmp = me.document.createTextNode(''),div; range.insertNode(tmp); div = domUtils.findParentByTagName(tmp, 'div', true); if (div) { var p = me.document.createElement('p'); while (div.firstChild) { p.appendChild(div.firstChild); } div.parentNode.insertBefore(p, div); domUtils.remove(div); range.setStartBefore(tmp).setCursor(); doSave = 1; } domUtils.remove(tmp); } } if (me.undoManger && doSave) { me.undoManger.save(); } } //没有站位符,会出现多行的问题 browser.opera && range.select(); }else{ me.fireEvent('saveScene',true,true) } } }); me.addListener('keydown', function(type, evt) { var keyCode = evt.keyCode || evt.which; if (keyCode == 13) {//回车 if(me.fireEvent('beforeenterkeydown')){ domUtils.preventDefault(evt); return; } me.fireEvent('saveScene',true,true); hTag = ''; var range = me.selection.getRange(); if (!range.collapsed) { //跨td不能删 var start = range.startContainer, end = range.endContainer, startTd = domUtils.findParentByTagName(start, 'td', true), endTd = domUtils.findParentByTagName(end, 'td', true); if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) { evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); return; } } if (tag == 'p') { if (!browser.ie) { start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true); //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command //trace:2431 if (!start && !browser.opera) { me.document.execCommand('formatBlock', false, '

            '); if (browser.gecko) { range = me.selection.getRange(); start = domUtils.findParentByTagName(range.startContainer, 'p', true); start && domUtils.removeDirtyAttr(start); } } else { hTag = start.tagName; start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start); } } } else { evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); if (!range.collapsed) { range.deleteContents(); start = range.startContainer; if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) { while (start.nodeType == 1) { if (dtd.$empty[start.tagName]) { range.setStartBefore(start).setCursor(); if (me.undoManger) { me.undoManger.save(); } return false; } if (!start.firstChild) { var br = range.document.createElement('br'); start.appendChild(br); range.setStart(start, 0).setCursor(); if (me.undoManger) { me.undoManger.save(); } return false; } start = start.firstChild; } if (start === range.startContainer.childNodes[range.startOffset]) { br = range.document.createElement('br'); range.insertNode(br).setCursor(); } else { range.setStart(start, 0).setCursor(); } } else { br = range.document.createElement('br'); range.insertNode(br).setStartAfter(br).setCursor(); } } else { br = range.document.createElement('br'); range.insertNode(br); var parent = br.parentNode; if (parent.lastChild === br) { br.parentNode.insertBefore(br.cloneNode(true), br); range.setStartBefore(br); } else { range.setStartAfter(br); } range.setCursor(); } } } }); }; // plugins/keystrokes.js /* 处理特殊键的兼容性问题 */ UE.plugins['keystrokes'] = function() { var me = this; var collapsed = true; me.addListener('keydown', function(type, evt) { var keyCode = evt.keyCode || evt.which, rng = me.selection.getRange(); //处理全选的情况 if(!rng.collapsed && !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && (keyCode >= 65 && keyCode <=90 || keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 111 || { 13:1, 8:1, 46:1 }[keyCode]) ){ var tmpNode = rng.startContainer; if(domUtils.isFillChar(tmpNode)){ rng.setStartBefore(tmpNode) } tmpNode = rng.endContainer; if(domUtils.isFillChar(tmpNode)){ rng.setEndAfter(tmpNode) } rng.txtToElmBoundary(); //结束边界可能放到了br的前边,要把br包含进来 // x[xxx]
            if(rng.endContainer && rng.endContainer.nodeType == 1){ tmpNode = rng.endContainer.childNodes[rng.endOffset]; if(tmpNode && domUtils.isBr(tmpNode)){ rng.setEndAfter(tmpNode); } } if(rng.startOffset == 0){ tmpNode = rng.startContainer; if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ tmpNode = rng.endContainer; if(rng.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ me.fireEvent('saveScene'); me.body.innerHTML = '

            '+(browser.ie ? '' : '
            ')+'

            '; rng.setStart(me.body.firstChild,0).setCursor(false,true); me._selectionChange(); return; } } } } //处理backspace if (keyCode == keymap.Backspace) { rng = me.selection.getRange(); collapsed = rng.collapsed; if(me.fireEvent('delkeydown',evt)){ return; } var start,end; //避免按两次删除才能生效的问题 if(rng.collapsed && rng.inFillChar()){ start = rng.startContainer; if(domUtils.isFillChar(start)){ rng.setStartBefore(start).shrinkBoundary(true).collapse(true); domUtils.remove(start) }else{ start.nodeValue = start.nodeValue.replace(new RegExp('^' + domUtils.fillChar ),''); rng.startOffset--; rng.collapse(true).select(true) } } //解决选中control元素不能删除的问题 if (start = rng.getClosedNode()) { me.fireEvent('saveScene'); rng.setStartBefore(start); domUtils.remove(start); rng.setCursor(); me.fireEvent('saveScene'); domUtils.preventDefault(evt); return; } //阻止在table上的删除 if (!browser.ie) { start = domUtils.findParentByTagName(rng.startContainer, 'table', true); end = domUtils.findParentByTagName(rng.endContainer, 'table', true); if (start && !end || !start && end || start !== end) { evt.preventDefault(); return; } } } //处理tab键的逻辑 if (keyCode == keymap.Tab) { //不处理以下标签 var excludeTagNameForTabKey = { 'ol' : 1, 'ul' : 1, 'table':1 }; //处理组件里的tab按下事件 if(me.fireEvent('tabkeydown',evt)){ domUtils.preventDefault(evt); return; } var range = me.selection.getRange(); me.fireEvent('saveScene'); for (var i = 0,txt = '',tabSize = me.options.tabSize|| 4,tabNode = me.options.tabNode || ' '; i < tabSize; i++) { txt += tabNode; } var span = me.document.createElement('span'); span.innerHTML = txt + domUtils.fillChar; if (range.collapsed) { range.insertNode(span.cloneNode(true).firstChild).setCursor(true); } else { var filterFn = function(node) { return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()] }; //普通的情况 start = domUtils.findParent(range.startContainer, filterFn,true); end = domUtils.findParent(range.endContainer, filterFn,true); if (start && end && start === end) { range.deleteContents(); range.insertNode(span.cloneNode(true).firstChild).setCursor(true); } else { var bookmark = range.createBookmark(); range.enlarge(true); var bookmark2 = range.createBookmark(), current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); current = domUtils.getNextDomNode(current, false, filterFn); } range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); } } domUtils.preventDefault(evt) } //trace:1634 //ff的del键在容器空的时候,也会删除 if(browser.gecko && keyCode == 46){ range = me.selection.getRange(); if(range.collapsed){ start = range.startContainer; if(domUtils.isEmptyBlock(start)){ var parent = start.parentNode; while(domUtils.getChildCount(parent) == 1 && !domUtils.isBody(parent)){ start = parent; parent = parent.parentNode; } if(start === parent.lastChild) evt.preventDefault(); return; } } } }); me.addListener('keyup', function(type, evt) { var keyCode = evt.keyCode || evt.which, rng,me = this; if(keyCode == keymap.Backspace){ if(me.fireEvent('delkeyup')){ return; } rng = me.selection.getRange(); if(rng.collapsed){ var tmpNode, autoClearTagName = ['h1','h2','h3','h4','h5','h6']; if(tmpNode = domUtils.findParentByTagName(rng.startContainer,autoClearTagName,true)){ if(domUtils.isEmptyBlock(tmpNode)){ var pre = tmpNode.previousSibling; if(pre && pre.nodeName != 'TABLE'){ domUtils.remove(tmpNode); rng.setStartAtLast(pre).setCursor(false,true); return; }else{ var next = tmpNode.nextSibling; if(next && next.nodeName != 'TABLE'){ domUtils.remove(tmpNode); rng.setStartAtFirst(next).setCursor(false,true); return; } } } } //处理当删除到body时,要重新给p标签展位 if(domUtils.isBody(rng.startContainer)){ var tmpNode = domUtils.createElement(me.document,'p',{ 'innerHTML' : browser.ie ? domUtils.fillChar : '
            ' }); rng.insertNode(tmpNode).setStart(tmpNode,0).setCursor(false,true); } } //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 if( !collapsed && (rng.startContainer.nodeType == 3 || rng.startContainer.nodeType == 1 && domUtils.isEmptyBlock(rng.startContainer))){ if(browser.ie){ var span = rng.document.createElement('span'); rng.insertNode(span).setStartBefore(span).collapse(true); rng.select(); domUtils.remove(span) }else{ rng.select() } } } }) }; // plugins/fiximgclick.js ///import core ///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 ///commandsName FixImgClick ///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小 //修复chrome下图片不能点击的问题,出现八个角可改变大小 UE.plugins['fiximgclick'] = (function () { var elementUpdated = false; function Scale() { this.editor = null; this.resizer = null; this.cover = null; this.doc = document; this.prePos = {x: 0, y: 0}; this.startPos = {x: 0, y: 0}; } (function () { var rect = [ //[left, top, width, height] [0, 0, -1, -1], [0, 0, 0, -1], [0, 0, 1, -1], [0, 0, -1, 0], [0, 0, 1, 0], [0, 0, -1, 1], [0, 0, 0, 1], [0, 0, 1, 1] ]; Scale.prototype = { init: function (editor) { var me = this; me.editor = editor; me.startPos = this.prePos = {x: 0, y: 0}; me.dragId = -1; var hands = [], cover = me.cover = document.createElement('div'), resizer = me.resizer = document.createElement('div'); cover.id = me.editor.ui.id + '_imagescale_cover'; cover.style.cssText = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;'; domUtils.on(cover, 'mousedown click', function () { me.hide(); }); for (i = 0; i < 8; i++) { hands.push(''); } resizer.id = me.editor.ui.id + '_imagescale'; resizer.className = 'edui-editor-imagescale'; resizer.innerHTML = hands.join(''); resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';'; me.editor.ui.getDom().appendChild(cover); me.editor.ui.getDom().appendChild(resizer); me.initStyle(); me.initEvents(); }, initStyle: function () { utils.cssRule('imagescale', '.edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}' + '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}' + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}'); }, initEvents: function () { var me = this; me.startPos.x = me.startPos.y = 0; me.isDraging = false; }, _eventHandler: function (e) { var me = this; switch (e.type) { case 'mousedown': var hand = e.target || e.srcElement, hand; if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) { me.dragId = hand.className.slice(-1); me.startPos.x = me.prePos.x = e.clientX; me.startPos.y = me.prePos.y = e.clientY; domUtils.on(me.doc,'mousemove', me.proxy(me._eventHandler, me)); } break; case 'mousemove': if (me.dragId != -1) { me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); me.prePos.x = e.clientX; me.prePos.y = e.clientY; elementUpdated = true; me.updateTargetElement(); } break; case 'mouseup': if (me.dragId != -1) { me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); me.updateTargetElement(); if (me.target.parentNode) me.attachTo(me.target); me.dragId = -1; } domUtils.un(me.doc,'mousemove', me.proxy(me._eventHandler, me)); //修复只是点击挪动点,但没有改变大小,不应该触发contentchange if(elementUpdated){ elementUpdated = false; me.editor.fireEvent('contentchange'); } break; default: break; } }, updateTargetElement: function () { var me = this; domUtils.setStyles(me.target, { 'width': me.resizer.style.width, 'height': me.resizer.style.height }); me.target.width = parseInt(me.resizer.style.width); me.target.height = parseInt(me.resizer.style.height); me.attachTo(me.target); }, updateContainerStyle: function (dir, offset) { var me = this, dom = me.resizer, tmp; if (rect[dir][0] != 0) { tmp = parseInt(dom.style.left) + offset.x; dom.style.left = me._validScaledProp('left', tmp) + 'px'; } if (rect[dir][1] != 0) { tmp = parseInt(dom.style.top) + offset.y; dom.style.top = me._validScaledProp('top', tmp) + 'px'; } if (rect[dir][2] != 0) { tmp = dom.clientWidth + rect[dir][2] * offset.x; dom.style.width = me._validScaledProp('width', tmp) + 'px'; } if (rect[dir][3] != 0) { tmp = dom.clientHeight + rect[dir][3] * offset.y; dom.style.height = me._validScaledProp('height', tmp) + 'px'; } }, _validScaledProp: function (prop, value) { var ele = this.resizer, wrap = document; value = isNaN(value) ? 0 : value; switch (prop) { case 'left': return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; case 'top': return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; case 'width': return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; case 'height': return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; } }, hideCover: function () { this.cover.style.display = 'none'; }, showCover: function () { var me = this, editorPos = domUtils.getXY(me.editor.ui.getDom()), iframePos = domUtils.getXY(me.editor.iframe); domUtils.setStyles(me.cover, { 'width': me.editor.iframe.offsetWidth + 'px', 'height': me.editor.iframe.offsetHeight + 'px', 'top': iframePos.y - editorPos.y + 'px', 'left': iframePos.x - editorPos.x + 'px', 'position': 'absolute', 'display': '' }) }, show: function (targetObj) { var me = this; me.resizer.style.display = 'block'; if(targetObj) me.attachTo(targetObj); domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me)); domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); me.showCover(); me.editor.fireEvent('afterscaleshow', me); me.editor.fireEvent('saveScene'); }, hide: function () { var me = this; me.hideCover(); me.resizer.style.display = 'none'; domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me)); domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); me.editor.fireEvent('afterscalehide', me); }, proxy: function( fn, context ) { return function(e) { return fn.apply( context || this, arguments); }; }, attachTo: function (targetObj) { var me = this, target = me.target = targetObj, resizer = this.resizer, imgPos = domUtils.getXY(target), iframePos = domUtils.getXY(me.editor.iframe), editorPos = domUtils.getXY(resizer.parentNode); domUtils.setStyles(resizer, { 'width': target.width + 'px', 'height': target.height + 'px', 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px', 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px' }); } } })(); return function () { var me = this, imageScale; me.setOpt('imageScaleEnabled', true); if ( !browser.ie && me.options.imageScaleEnabled) { me.addListener('click', function (type, e) { var range = me.selection.getRange(), img = range.getClosedNode(); if (img && img.tagName == 'IMG' && me.body.contentEditable!="false") { if (img.className.indexOf("edui-faked-music") != -1 || img.getAttribute("anchorname") || domUtils.hasClass(img, 'loadingclass') || domUtils.hasClass(img, 'loaderrorclass')) { return } if (!imageScale) { imageScale = new Scale(); imageScale.init(me); me.ui.getDom().appendChild(imageScale.resizer); var _keyDownHandler = function (e) { imageScale.hide(); if(imageScale.target) me.selection.getRange().selectNode(imageScale.target).select(); }, _mouseDownHandler = function (e) { var ele = e.target || e.srcElement; if (ele && (ele.className===undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) { _keyDownHandler(e); } }, timer; me.addListener('afterscaleshow', function (e) { me.addListener('beforekeydown', _keyDownHandler); me.addListener('beforemousedown', _mouseDownHandler); domUtils.on(document, 'keydown', _keyDownHandler); domUtils.on(document,'mousedown', _mouseDownHandler); me.selection.getNative().removeAllRanges(); }); me.addListener('afterscalehide', function (e) { me.removeListener('beforekeydown', _keyDownHandler); me.removeListener('beforemousedown', _mouseDownHandler); domUtils.un(document, 'keydown', _keyDownHandler); domUtils.un(document,'mousedown', _mouseDownHandler); var target = imageScale.target; if (target.parentNode) { me.selection.getRange().selectNode(target).select(); } }); //TODO 有iframe的情况,mousedown不能往下传。。 domUtils.on(imageScale.resizer, 'mousedown', function (e) { me.selection.getNative().removeAllRanges(); var ele = e.target || e.srcElement; if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { timer = setTimeout(function () { imageScale.hide(); if(imageScale.target) me.selection.getRange().selectNode(ele).select(); }, 200); } }); domUtils.on(imageScale.resizer, 'mouseup', function (e) { var ele = e.target || e.srcElement; if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { clearTimeout(timer); } }); } imageScale.show(img); } else { if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide(); } }); } if (browser.webkit) { me.addListener('click', function (type, e) { if (e.target.tagName == 'IMG' && me.body.contentEditable!="false") { var range = new dom.Range(me.document); range.selectNode(e.target).select(); } }); } } })(); // plugins/autolink.js ///import core ///commands 为非ie浏览器自动添加a标签 ///commandsName AutoLink ///commandsTitle 自动增加链接 /** * @description 为非ie浏览器自动添加a标签 * @author zhanyi */ UE.plugin.register('autolink',function(){ var cont = 0; return !browser.ie ? { bindEvents:{ 'reset' : function(){ cont = 0; }, 'keydown':function(type, evt) { var me = this; var keyCode = evt.keyCode || evt.which; if (keyCode == 32 || keyCode == 13) { var sel = me.selection.getNative(), range = sel.getRangeAt(0).cloneRange(), offset, charCode; var start = range.startContainer; while (start.nodeType == 1 && range.startOffset > 0) { start = range.startContainer.childNodes[range.startOffset - 1]; if (!start){ break; } range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length); range.collapse(true); start = range.startContainer; } do{ if (range.startOffset == 0) { start = range.startContainer.previousSibling; while (start && start.nodeType == 1) { start = start.lastChild; } if (!start || domUtils.isFillChar(start)){ break; } offset = start.nodeValue.length; } else { start = range.startContainer; offset = range.startOffset; } range.setStart(start, offset - 1); charCode = range.toString().charCodeAt(0); } while (charCode != 160 && charCode != 32); if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) { while(range.toString().length){ if(/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())){ break; } try{ range.setStart(range.startContainer,range.startOffset+1); }catch(e){ //trace:2121 var start = range.startContainer; while(!(next = start.nextSibling)){ if(domUtils.isBody(start)){ return; } start = start.parentNode; } range.setStart(next,0); } } //range的开始边界已经在a标签里的不再处理 if(domUtils.findParentByTagName(range.startContainer,'a',true)){ return; } var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href; me.undoManger && me.undoManger.save(); a.appendChild(range.extractContents()); a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,''); href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar,'g'),''); href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://"+ href; a.setAttribute('_src',utils.html(href)); a.href = utils.html(href); range.insertNode(a); a.parentNode.insertBefore(text, a.nextSibling); range.setStart(text, 0); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); me.undoManger && me.undoManger.save(); } } } } }:{} },function(){ var keyCodes = { 37:1, 38:1, 39:1, 40:1, 13:1,32:1 }; function checkIsCludeLink(node){ if(node.nodeType == 3){ return null } if(node.nodeName == 'A'){ return node; } var lastChild = node.lastChild; while(lastChild){ if(lastChild.nodeName == 'A'){ return lastChild; } if(lastChild.nodeType == 3){ if(domUtils.isWhitespace(lastChild)){ lastChild = lastChild.previousSibling; continue; } return null } lastChild = lastChild.lastChild; } } browser.ie && this.addListener('keyup',function(cmd,evt){ var me = this,keyCode = evt.keyCode; if(keyCodes[keyCode]){ var rng = me.selection.getRange(); var start = rng.startContainer; if(keyCode == 13){ while(start && !domUtils.isBody(start) && !domUtils.isBlockElm(start)){ start = start.parentNode; } if(start && !domUtils.isBody(start) && start.nodeName == 'P'){ var pre = start.previousSibling; if(pre && pre.nodeType == 1){ var pre = checkIsCludeLink(pre); if(pre && !pre.getAttribute('_href')){ domUtils.remove(pre,true); } } } }else if(keyCode == 32 ){ if(start.nodeType == 3 && /^\s$/.test(start.nodeValue)){ start = start.previousSibling; if(start && start.nodeName == 'A' && !start.getAttribute('_href')){ domUtils.remove(start,true); } } }else { start = domUtils.findParentByTagName(start,'a',true); if(start && !start.getAttribute('_href')){ var bk = rng.createBookmark(); domUtils.remove(start,true); rng.moveToBookmark(bk).select(true) } } } }); } ); // plugins/autoheight.js ///import core ///commands 当输入内容超过编辑器高度时,编辑器自动增高 ///commandsName AutoHeight,autoHeightEnabled ///commandsTitle 自动增高 /** * @description 自动伸展 * @author zhanyi */ UE.plugins['autoheight'] = function () { var me = this; //提供开关,就算加载也可以关闭 me.autoHeightEnabled = me.options.autoHeightEnabled !== false; if (!me.autoHeightEnabled) { return; } var bakOverflow, lastHeight = 0, options = me.options, currentHeight, timer; function adjustHeight() { var me = this; clearTimeout(timer); if(isFullscreen)return; if (!me.queryCommandState || me.queryCommandState && me.queryCommandState('source') != 1) { timer = setTimeout(function(){ var node = me.body.lastChild; while(node && node.nodeType != 1){ node = node.previousSibling; } if(node && node.nodeType == 1){ node.style.clear = 'both'; currentHeight = Math.max(domUtils.getXY(node).y + node.offsetHeight + 25 ,Math.max(options.minFrameHeight, options.initialFrameHeight)) ; if (currentHeight != lastHeight) { if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) { me.iframe.parentNode.style.height = currentHeight + 'px'; } me.body.style.height = currentHeight + 'px'; lastHeight = currentHeight; } domUtils.removeStyle(node,'clear'); } },50) } } var isFullscreen; me.addListener('fullscreenchanged',function(cmd,f){ isFullscreen = f }); me.addListener('destroy', function () { me.removeListener('contentchange afterinserthtml keyup mouseup',adjustHeight) }); me.enableAutoHeight = function () { var me = this; if (!me.autoHeightEnabled) { return; } var doc = me.document; me.autoHeightEnabled = true; bakOverflow = doc.body.style.overflowY; doc.body.style.overflowY = 'hidden'; me.addListener('contentchange afterinserthtml keyup mouseup',adjustHeight); //ff不给事件算得不对 setTimeout(function () { adjustHeight.call(me); }, browser.gecko ? 100 : 0); me.fireEvent('autoheightchanged', me.autoHeightEnabled); }; me.disableAutoHeight = function () { me.body.style.overflowY = bakOverflow || ''; me.removeListener('contentchange', adjustHeight); me.removeListener('keyup', adjustHeight); me.removeListener('mouseup', adjustHeight); me.autoHeightEnabled = false; me.fireEvent('autoheightchanged', me.autoHeightEnabled); }; me.on('setHeight',function(){ me.disableAutoHeight() }); me.addListener('ready', function () { me.enableAutoHeight(); //trace:1764 var timer; domUtils.on(browser.ie ? me.body : me.document, browser.webkit ? 'dragover' : 'drop', function () { clearTimeout(timer); timer = setTimeout(function () { //trace:3681 adjustHeight.call(me); }, 100); }); //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 var lastScrollY; window.onscroll = function(){ if(lastScrollY === null){ lastScrollY = this.scrollY }else if(this.scrollY == 0 && lastScrollY != 0){ me.window.scrollTo(0,0); lastScrollY = null; } } }); }; // plugins/autofloat.js ///import core ///commands 悬浮工具栏 ///commandsName AutoFloat,autoFloatEnabled ///commandsTitle 悬浮工具栏 /** * modified by chengchao01 * 注意: 引入此功能后,在IE6下会将body的背景图片覆盖掉! */ UE.plugins['autofloat'] = function() { var me = this, lang = me.getLang(); me.setOpt({ topOffset:0 }); var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false, topOffset = me.options.topOffset; //如果不固定toolbar的位置,则直接退出 if(!optsAutoFloatEnabled){ return; } var uiUtils = UE.ui.uiUtils, LteIE6 = browser.ie && browser.version <= 6, quirks = browser.quirks; function checkHasUI(){ if(!UE.ui){ alert(lang.autofloatMsg); return 0; } return 1; } function fixIE6FixedPos(){ var docStyle = document.body.style; docStyle.backgroundImage = 'url("about:blank")'; docStyle.backgroundAttachment = 'fixed'; } var bakCssText, placeHolder = document.createElement('div'), toolbarBox,orgTop, getPosition, flag =true; //ie7模式下需要偏移 function setFloating(){ var toobarBoxPos = domUtils.getXY(toolbarBox), origalFloat = domUtils.getComputedStyle(toolbarBox,'position'), origalLeft = domUtils.getComputedStyle(toolbarBox,'left'); toolbarBox.style.width = toolbarBox.offsetWidth + 'px'; toolbarBox.style.zIndex = me.options.zIndex * 1 + 1; toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); if (LteIE6 || (quirks && browser.ie)) { if(toolbarBox.style.position != 'absolute'){ toolbarBox.style.position = 'absolute'; } toolbarBox.style.top = (document.body.scrollTop||document.documentElement.scrollTop) - orgTop + topOffset + 'px'; } else { if (browser.ie7Compat && flag) { flag = false; toolbarBox.style.left = domUtils.getXY(toolbarBox).x - document.documentElement.getBoundingClientRect().left+2 + 'px'; } if(toolbarBox.style.position != 'fixed'){ toolbarBox.style.position = 'fixed'; toolbarBox.style.top = topOffset +"px"; ((origalFloat == 'absolute' || origalFloat == 'relative') && parseFloat(origalLeft)) && (toolbarBox.style.left = toobarBoxPos.x + 'px'); } } } function unsetFloating(){ flag = true; if(placeHolder.parentNode){ placeHolder.parentNode.removeChild(placeHolder); } toolbarBox.style.cssText = bakCssText; } function updateFloating(){ var rect3 = getPosition(me.container); var offset=me.options.toolbarTopOffset||0; if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) { setFloating(); }else{ unsetFloating(); } } var defer_updateFloating = utils.defer(function(){ updateFloating(); },browser.ie ? 200 : 100,true); me.addListener('destroy',function(){ domUtils.un(window, ['scroll','resize'], updateFloating); me.removeListener('keydown', defer_updateFloating); }); me.addListener('ready', function(){ if(checkHasUI(me)){ //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 if(!me.ui){ return; } getPosition = uiUtils.getClientRect; toolbarBox = me.ui.getDom('toolbarbox'); orgTop = getPosition(toolbarBox).top; bakCssText = toolbarBox.style.cssText; placeHolder.style.height = toolbarBox.offsetHeight + 'px'; if(LteIE6){ fixIE6FixedPos(); } domUtils.on(window, ['scroll','resize'], updateFloating); me.addListener('keydown', defer_updateFloating); me.addListener('beforefullscreenchange', function (t, enabled){ if (enabled) { unsetFloating(); } }); me.addListener('fullscreenchanged', function (t, enabled){ if (!enabled) { updateFloating(); } }); me.addListener('sourcemodechanged', function (t, enabled){ setTimeout(function (){ updateFloating(); },0); }); me.addListener("clearDoc",function(){ setTimeout(function(){ updateFloating(); },0); }) } }); }; // plugins/video.js /** * video插件, 为UEditor提供视频插入支持 * @file * @since 1.2.6.1 */ UE.plugins['video'] = function (){ var me =this; /** * 创建插入视频字符窜 * @param url 视频地址 * @param width 视频宽度 * @param height 视频高度 * @param align 视频对齐 * @param toEmbed 是否以flash代替显示 * @param addParagraph 是否需要添加P 标签 */ function creatInsertStr(url,width,height,id,align,classname,type){ url = utils.unhtmlForUrl(url); align = utils.unhtml(align); classname = utils.unhtml(classname); width = parseInt(width, 10) || 0; height = parseInt(height, 10) || 0; var str; switch (type){ case 'image': str = '' break; case 'embed': str = ''; break; case 'video': var ext = url.substr(url.lastIndexOf('.') + 1); if(ext == 'ogv') ext = 'ogg'; str = '' + ''; break; } return str; } function switchImgAndVideo(root,img2video){ utils.each(root.getNodesByTagName(img2video ? 'img' : 'embed video'),function(node){ var className = node.getAttr('class'); if(className && className.indexOf('edui-faked-video') != -1){ var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'embed':'image'); node.parentNode.replaceChild(UE.uNode.createElement(html),node); } if(className && className.indexOf('edui-upload-video') != -1){ var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'video':'image'); node.parentNode.replaceChild(UE.uNode.createElement(html),node); } }) } me.addOutputRule(function(root){ switchImgAndVideo(root,true) }); me.addInputRule(function(root){ switchImgAndVideo(root) }); /** * 插入视频 * @command insertvideo * @method execCommand * @param { String } cmd 命令字符串 * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 * @example * ```javascript * * var videoAttr = { * //视频地址 * url: 'http://www.youku.com/xxx', * //视频宽高值, 单位px * width: 200, * height: 100 * }; * * //editor 是编辑器实例 * //向编辑器插入单个视频 * editor.execCommand( 'insertvideo', videoAttr ); * ``` */ /** * 插入视频 * @command insertvideo * @method execCommand * @param { String } cmd 命令字符串 * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 * @example * ```javascript * * var videoAttr1 = { * //视频地址 * url: 'http://www.youku.com/xxx', * //视频宽高值, 单位px * width: 200, * height: 100 * }, * videoAttr2 = { * //视频地址 * url: 'http://www.youku.com/xxx', * //视频宽高值, 单位px * width: 200, * height: 100 * } * * //editor 是编辑器实例 * //该方法将会向编辑器内插入两个视频 * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); * ``` */ /** * 查询当前光标所在处是否是一个视频 * @command insertvideo * @method queryCommandState * @param { String } cmd 需要查询的命令字符串 * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 * @example * ```javascript * * //editor 是编辑器实例 * editor.queryCommandState( 'insertvideo' ); * ``` */ me.commands["insertvideo"] = { execCommand: function (cmd, videoObjs, type){ videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs]; var html = [],id = 'tmpVedio', cl; for(var i=0,vi,len = videoObjs.length;i 0) { return 0; } for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i)) { if (node.getElementsByTagName(i).length) { return 0; } } return 1; }; UETable.getWidth = function (cell) { if (!cell)return 0; return parseInt(domUtils.getComputedStyle(cell, "width"), 10); }; /** * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null */ UETable.getTableCellAlignState = function ( cells ) { !utils.isArray( cells ) && ( cells = [cells] ); var result = {}, status = ['align', 'valign'], tempStatus = null, isSame = true;//状态是否相同 utils.each( cells, function( cellNode ){ utils.each( status, function( currentState ){ tempStatus = cellNode.getAttribute( currentState ); if( !result[ currentState ] && tempStatus ) { result[ currentState ] = tempStatus; } else if( !result[ currentState ] || ( tempStatus !== result[ currentState ] ) ) { isSame = false; return false; } } ); return isSame; }); return isSame ? result : null; }; /** * 根据当前选区获取相关的table信息 * @return {Object} */ UETable.getTableItemsByRange = function (editor) { var start = editor.selection.getStart(); //ff下会选中bookmark if( start && start.id && start.id.indexOf('_baidu_bookmark_start_') === 0 && start.nextSibling) { start = start.nextSibling; } //在table或者td边缘有可能存在选中tr的情况 var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), tr = cell && cell.parentNode, caption = start && domUtils.findParentByTagName(start, 'caption', true), table = caption ? caption.parentNode : tr && tr.parentNode.parentNode; return { cell:cell, tr:tr, table:table, caption:caption } }; UETable.getUETableBySelected = function (editor) { var table = UETable.getTableItemsByRange(editor).table; if (table && table.ueTable && table.ueTable.selectedTds.length) { return table.ueTable; } return null; }; UETable.getDefaultValue = function (editor, table) { var borderMap = { thin:'0px', medium:'1px', thick:'2px' }, tableBorder, tdPadding, tdBorder, tmpValue; if (!table) { table = editor.document.createElement('table'); table.insertRow(0).insertCell(0).innerHTML = 'xxx'; editor.body.appendChild(table); var td = table.getElementsByTagName('td')[0]; tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); tmpValue = domUtils.getComputedStyle(td, 'padding-left'); tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); domUtils.remove(table); return { tableBorder:tableBorder, tdPadding:tdPadding, tdBorder:tdBorder }; } else { td = table.getElementsByTagName('td')[0]; tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); tmpValue = domUtils.getComputedStyle(td, 'padding-left'); tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); return { tableBorder:tableBorder, tdPadding:tdPadding, tdBorder:tdBorder }; } }; /** * 根据当前点击的td或者table获取索引对象 * @param tdOrTable */ UETable.getUETable = function (tdOrTable) { var tag = tdOrTable.tagName.toLowerCase(); tdOrTable = (tag == "td" || tag == "th" || tag == 'caption') ? domUtils.findParentByTagName(tdOrTable, "table", true) : tdOrTable; if (!tdOrTable.ueTable) { tdOrTable.ueTable = new UETable(tdOrTable); } return tdOrTable.ueTable; }; UETable.cloneCell = function(cell,ignoreMerge,keepPro){ if (!cell || utils.isString(cell)) { return this.table.ownerDocument.createElement(cell || 'td'); } var flag = domUtils.hasClass(cell, "selectTdClass"); flag && domUtils.removeClasses(cell, "selectTdClass"); var tmpCell = cell.cloneNode(true); if (ignoreMerge) { tmpCell.rowSpan = tmpCell.colSpan = 1; } //去掉宽高 !keepPro && domUtils.removeAttributes(tmpCell,'width height'); !keepPro && domUtils.removeAttributes(tmpCell,'style'); tmpCell.style.borderLeftStyle = ""; tmpCell.style.borderTopStyle = ""; tmpCell.style.borderLeftColor = cell.style.borderRightColor; tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; tmpCell.style.borderTopColor = cell.style.borderBottomColor; tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; flag && domUtils.addClass(cell, "selectTdClass"); return tmpCell; } UETable.prototype = { getMaxRows:function () { var rows = this.table.rows, maxLen = 1; for (var i = 0, row; row = rows[i]; i++) { var currentMax = 1; for (var j = 0, cj; cj = row.cells[j++];) { currentMax = Math.max(cj.rowSpan || 1, currentMax); } maxLen = Math.max(currentMax + i, maxLen); } return maxLen; }, /** * 获取当前表格的最大列数 */ getMaxCols:function () { var rows = this.table.rows, maxLen = 0, cellRows = {}; for (var i = 0, row; row = rows[i]; i++) { var cellsNum = 0; for (var j = 0, cj; cj = row.cells[j++];) { cellsNum += (cj.colSpan || 1); if (cj.rowSpan && cj.rowSpan > 1) { for (var k = 1; k < cj.rowSpan; k++) { if (!cellRows['row_' + (i + k)]) { cellRows['row_' + (i + k)] = (cj.colSpan || 1); } else { cellRows['row_' + (i + k)]++ } } } } cellsNum += cellRows['row_' + i] || 0; maxLen = Math.max(cellsNum, maxLen); } return maxLen; }, getCellColIndex:function (cell) { }, /** * 获取当前cell旁边的单元格, * @param cell * @param right */ getHSideCell:function (cell, right) { try { var cellInfo = this.getCellInfo(cell), previewRowIndex, previewColIndex; var len = this.selectedTds.length, range = this.cellsRange; //首行或者首列没有前置单元格 if ((!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (right && (!len ? (cellInfo.colIndex == (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; previewColIndex = !right ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) : ( !len ? cellInfo.colIndex + 1 : range.endColIndex + 1); return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); } catch (e) { showError(e); } }, getTabNextCell:function (cell, preRowIndex) { var cellInfo = this.getCellInfo(cell), rowIndex = preRowIndex || cellInfo.rowIndex, colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), nextCell; try { nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); } catch (e) { try { rowIndex = rowIndex * 1 + 1; colIndex = 0; nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); } catch (e) { } } return nextCell; }, /** * 获取视觉上的后置单元格 * @param cell * @param bottom */ getVSideCell:function (cell, bottom, ignoreRange) { try { var cellInfo = this.getCellInfo(cell), nextRowIndex, nextColIndex; var len = this.selectedTds.length && !ignoreRange, range = this.cellsRange; //末行或者末列没有后置单元格 if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); } catch (e) { showError(e); } }, /** * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 */ getSameEndPosCells:function (cell, xOrY) { try { var flag = (xOrY.toLowerCase() === "x"), end = domUtils.getXY(cell)[flag ? 'x' : 'y'] + cell["offset" + (flag ? 'Width' : 'Height')], rows = this.table.rows, cells = null, returns = []; for (var i = 0; i < this.rowsNum; i++) { cells = rows[i].cells; for (var j = 0, tmpCell; tmpCell = cells[j++];) { var tmpEnd = domUtils.getXY(tmpCell)[flag ? 'x' : 'y'] + tmpCell["offset" + (flag ? 'Width' : 'Height')]; //对应行的td已经被上面行rowSpan了 if (tmpEnd > end && flag) break; if (cell == tmpCell || end == tmpEnd) { //只获取单一的单元格 //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { returns.push(tmpCell); } if (flag) break; } } } return returns; } catch (e) { showError(e); } }, setCellContent:function (cell, content) { cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
            "); }, cloneCell:UETable.cloneCell, /** * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 */ getSameStartPosXCells:function (cell) { try { var start = domUtils.getXY(cell).x + cell.offsetWidth, rows = this.table.rows, cells , returns = []; for (var i = 0; i < this.rowsNum; i++) { cells = rows[i].cells; for (var j = 0, tmpCell; tmpCell = cells[j++];) { var tmpStart = domUtils.getXY(tmpCell).x; if (tmpStart > start) break; if (tmpStart == start && tmpCell.colSpan == 1) { returns.push(tmpCell); break; } } } return returns; } catch (e) { showError(e); } }, /** * 更新table对应的索引表 */ update:function (table) { this.table = table || this.table; this.selectedTds = []; this.cellsRange = {}; this.indexTable = []; var rows = this.table.rows, rowsNum = this.getMaxRows(), dNum = rowsNum - rows.length, colsNum = this.getMaxCols(); while (dNum--) { this.table.insertRow(rows.length); } this.rowsNum = rowsNum; this.colsNum = colsNum; for (var i = 0, len = rows.length; i < len; i++) { this.indexTable[i] = new Array(colsNum); } //填充索引表 for (var rowIndex = 0, row; row = rows[rowIndex]; rowIndex++) { for (var cellIndex = 0, cell, cells = row.cells; cell = cells[cellIndex]; cellIndex++) { //修正整行被rowSpan时导致的行数计算错误 if (cell.rowSpan > rowsNum) { cell.rowSpan = rowsNum; } var colIndex = cellIndex, rowSpan = cell.rowSpan || 1, colSpan = cell.colSpan || 1; //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 while (this.indexTable[rowIndex][colIndex]) colIndex++; for (var j = 0; j < rowSpan; j++) { for (var k = 0; k < colSpan; k++) { this.indexTable[rowIndex + j][colIndex + k] = { rowIndex:rowIndex, cellIndex:cellIndex, colIndex:colIndex, rowSpan:rowSpan, colSpan:colSpan } } } } } //修复残缺td for (j = 0; j < rowsNum; j++) { for (k = 0; k < colsNum; k++) { if (this.indexTable[j][k] === undefined) { row = rows[j]; cell = row.cells[row.cells.length - 1]; cell = cell ? cell.cloneNode(true) : this.table.ownerDocument.createElement("td"); this.setCellContent(cell); if (cell.colSpan !== 1)cell.colSpan = 1; if (cell.rowSpan !== 1)cell.rowSpan = 1; row.appendChild(cell); this.indexTable[j][k] = { rowIndex:j, cellIndex:cell.cellIndex, colIndex:k, rowSpan:1, colSpan:1 } } } } //当框选后删除行或者列后撤销,需要重建选区。 var tds = domUtils.getElementsByTagName(this.table, "td"), selectTds = []; utils.each(tds, function (td) { if (domUtils.hasClass(td, "selectTdClass")) { selectTds.push(td); } }); if (selectTds.length) { var start = selectTds[0], end = selectTds[selectTds.length - 1], startInfo = this.getCellInfo(start), endInfo = this.getCellInfo(end); this.selectedTds = selectTds; this.cellsRange = { beginRowIndex:startInfo.rowIndex, beginColIndex:startInfo.colIndex, endRowIndex:endInfo.rowIndex + endInfo.rowSpan - 1, endColIndex:endInfo.colIndex + endInfo.colSpan - 1 }; } //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 if(!domUtils.hasClass(this.table.rows[0], "firstRow")) { domUtils.addClass(this.table.rows[0], "firstRow"); for(var i = 1; i< this.table.rows.length; i++) { domUtils.removeClasses(this.table.rows[i], "firstRow"); } } }, /** * 获取单元格的索引信息 */ getCellInfo:function (cell) { if (!cell) return; var cellIndex = cell.cellIndex, rowIndex = cell.parentNode.rowIndex, rowInfo = this.indexTable[rowIndex], numCols = this.colsNum; for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { var cellInfo = rowInfo[colIndex]; if (cellInfo.rowIndex === rowIndex && cellInfo.cellIndex === cellIndex) { return cellInfo; } } }, /** * 根据行列号获取单元格 */ getCell:function (rowIndex, cellIndex) { return rowIndex < this.rowsNum && this.table.rows[rowIndex].cells[cellIndex] || null; }, /** * 删除单元格 */ deleteCell:function (cell, rowIndex) { rowIndex = typeof rowIndex == 'number' ? rowIndex : cell.parentNode.rowIndex; var row = this.table.rows[rowIndex]; row.deleteCell(cell.cellIndex); }, /** * 根据始末两个单元格获取被框选的所有单元格范围 */ getCellsRange:function (cellA, cellB) { function checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex) { var tmpBeginRowIndex = beginRowIndex, tmpBeginColIndex = beginColIndex, tmpEndRowIndex = endRowIndex, tmpEndColIndex = endColIndex, cellInfo, colIndex, rowIndex; // 通过indexTable检查是否存在超出TableRange上边界的情况 if (beginRowIndex > 0) { for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { cellInfo = me.indexTable[beginRowIndex][colIndex]; rowIndex = cellInfo.rowIndex; if (rowIndex < beginRowIndex) { tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); } } } // 通过indexTable检查是否存在超出TableRange右边界的情况 if (endColIndex < me.colsNum) { for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { cellInfo = me.indexTable[rowIndex][endColIndex]; colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; if (colIndex > endColIndex) { tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); } } } // 检查是否有超出TableRange下边界的情况 if (endRowIndex < me.rowsNum) { for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { cellInfo = me.indexTable[endRowIndex][colIndex]; rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; if (rowIndex > endRowIndex) { tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); } } } // 检查是否有超出TableRange左边界的情况 if (beginColIndex > 0) { for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { cellInfo = me.indexTable[rowIndex][beginColIndex]; colIndex = cellInfo.colIndex; if (colIndex < beginColIndex) { tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); } } } //递归调用直至所有完成所有框选单元格的扩展 if (tmpBeginRowIndex != beginRowIndex || tmpBeginColIndex != beginColIndex || tmpEndRowIndex != endRowIndex || tmpEndColIndex != endColIndex) { return checkRange(tmpBeginRowIndex, tmpBeginColIndex, tmpEndRowIndex, tmpEndColIndex); } else { // 不需要扩展TableRange的情况 return { beginRowIndex:beginRowIndex, beginColIndex:beginColIndex, endRowIndex:endRowIndex, endColIndex:endColIndex }; } } try { var me = this, cellAInfo = me.getCellInfo(cellA); if (cellA === cellB) { return { beginRowIndex:cellAInfo.rowIndex, beginColIndex:cellAInfo.colIndex, endRowIndex:cellAInfo.rowIndex + cellAInfo.rowSpan - 1, endColIndex:cellAInfo.colIndex + cellAInfo.colSpan - 1 }; } var cellBInfo = me.getCellInfo(cellB); // 计算TableRange的四个边 var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), endRowIndex = Math.max(cellAInfo.rowIndex + cellAInfo.rowSpan - 1, cellBInfo.rowIndex + cellBInfo.rowSpan - 1), endColIndex = Math.max(cellAInfo.colIndex + cellAInfo.colSpan - 1, cellBInfo.colIndex + cellBInfo.colSpan - 1); return checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex); } catch (e) { //throw e; } }, /** * 依据cellsRange获取对应的单元格集合 */ getCells:function (range) { //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 this.clearSelected(); var beginRowIndex = range.beginRowIndex, beginColIndex = range.beginColIndex, endRowIndex = range.endRowIndex, endColIndex = range.endColIndex, cellInfo, rowIndex, colIndex, tdHash = {}, returnTds = []; for (var i = beginRowIndex; i <= endRowIndex; i++) { for (var j = beginColIndex; j <= endColIndex; j++) { cellInfo = this.indexTable[i][j]; rowIndex = cellInfo.rowIndex; colIndex = cellInfo.colIndex; // 如果Cells里已经包含了此Cell则跳过 var key = rowIndex + '|' + colIndex; if (tdHash[key]) continue; tdHash[key] = 1; if (rowIndex < i || colIndex < j || rowIndex + cellInfo.rowSpan - 1 > endRowIndex || colIndex + cellInfo.colSpan - 1 > endColIndex) { return null; } returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); } } return returnTds; }, /** * 清理已经选中的单元格 */ clearSelected:function () { UETable.removeSelectedClass(this.selectedTds); this.selectedTds = []; this.cellsRange = {}; }, /** * 根据range设置已经选中的单元格 */ setSelected:function (range) { var cells = this.getCells(range); UETable.addSelectedClass(cells); this.selectedTds = cells; this.cellsRange = range; }, isFullRow:function () { var range = this.cellsRange; return (range.endColIndex - range.beginColIndex + 1) == this.colsNum; }, isFullCol:function () { var range = this.cellsRange, table = this.table, ths = table.getElementsByTagName("th"), rows = range.endRowIndex - range.beginRowIndex + 1; return !ths.length ? rows == this.rowsNum : rows == this.rowsNum || (rows == this.rowsNum - 1); }, /** * 获取视觉上的前置单元格,默认是左边,top传入时 * @param cell * @param top */ getNextCell:function (cell, bottom, ignoreRange) { try { var cellInfo = this.getCellInfo(cell), nextRowIndex, nextColIndex; var len = this.selectedTds.length && !ignoreRange, range = this.cellsRange; //末行或者末列没有后置单元格 if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); } catch (e) { showError(e); } }, getPreviewCell:function (cell, top) { try { var cellInfo = this.getCellInfo(cell), previewRowIndex, previewColIndex; var len = this.selectedTds.length, range = this.cellsRange; //首行或者首列没有前置单元格 if ((!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (top && (!len ? (cellInfo.rowIndex > (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; previewRowIndex = !top ? ( !len ? cellInfo.rowIndex : range.beginRowIndex ) : ( !len ? (cellInfo.rowIndex < 1 ? 0 : (cellInfo.rowIndex - 1)) : range.beginRowIndex); previewColIndex = !top ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) : ( !len ? cellInfo.colIndex : range.endColIndex + 1); return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); } catch (e) { showError(e); } }, /** * 移动单元格中的内容 */ moveContent:function (cellTo, cellFrom) { if (UETable.isEmptyBlock(cellFrom)) return; if (UETable.isEmptyBlock(cellTo)) { cellTo.innerHTML = cellFrom.innerHTML; return; } var child = cellTo.lastChild; if (child.nodeType == 3 || !dtd.$block[child.tagName]) { cellTo.appendChild(cellTo.ownerDocument.createElement('br')) } while (child = cellFrom.firstChild) { cellTo.appendChild(child); } }, /** * 向右合并单元格 */ mergeRight:function (cell) { var cellInfo = this.getCellInfo(cell), rightColIndex = cellInfo.colIndex + cellInfo.colSpan, rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], rightCell = this.getCell(rightCellInfo.rowIndex, rightCellInfo.cellIndex); //合并 cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; //被合并的单元格不应存在宽度属性 cell.removeAttribute("width"); //移动内容 this.moveContent(cell, rightCell); //删掉被合并的Cell this.deleteCell(rightCell, rightCellInfo.rowIndex); this.update(); }, /** * 向下合并单元格 */ mergeDown:function (cell) { var cellInfo = this.getCellInfo(cell), downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; cell.removeAttribute("height"); this.moveContent(cell, downCell); this.deleteCell(downCell, downCellInfo.rowIndex); this.update(); }, /** * 合并整个range中的内容 */ mergeRange:function () { //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 var range = this.cellsRange, leftTopCell = this.getCell(range.beginRowIndex, this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex); if (leftTopCell.tagName == "TH" && range.endRowIndex !== range.beginRowIndex) { var index = this.indexTable, info = this.getCellInfo(leftTopCell); leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); range = this.getCellsRange(leftTopCell, this.getCell(index[this.rowsNum - 1][info.colIndex].rowIndex, index[this.rowsNum - 1][info.colIndex].cellIndex)); } // 删除剩余的Cells var cells = this.getCells(range); for(var i= 0,ci;ci=cells[i++];){ if (ci !== leftTopCell) { this.moveContent(leftTopCell, ci); this.deleteCell(ci); } } // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { leftTopCell.colSpan = 1; } if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { var rowIndex = leftTopCell.parentNode.rowIndex; //解决IE下的表格操作问题 if( this.table.deleteRow ) { for (var i = rowIndex+ 1, curIndex=rowIndex+ 1, len=leftTopCell.rowSpan; i < len; i++) { this.table.deleteRow(curIndex); } } else { for (var i = 0, len=leftTopCell.rowSpan - 1; i < len; i++) { var row = this.table.rows[rowIndex + 1]; row.parentNode.removeChild(row); } } leftTopCell.rowSpan = 1; } this.update(); }, /** * 插入一行单元格 */ insertRow:function (rowIndex, sourceCell) { var numCols = this.colsNum, table = this.table, row = table.insertRow(rowIndex), cell, isInsertTitle = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; function replaceTdToTh(colIndex, cell, tableRow) { if (colIndex == 0) { var tr = tableRow.nextSibling || tableRow.previousSibling, th = tr.cells[colIndex]; if (th.tagName == 'TH') { th = cell.ownerDocument.createElement("th"); th.appendChild(cell.firstChild); tableRow.insertBefore(th, cell); domUtils.remove(cell) } }else{ if (cell.tagName == 'TH') { var td = cell.ownerDocument.createElement("td"); td.appendChild(cell.firstChild); tableRow.insertBefore(td, cell); domUtils.remove(cell) } } } //首行直接插入,无需考虑部分单元格被rowspan的情况 if (rowIndex == 0 || rowIndex == this.rowsNum) { for (var colIndex = 0; colIndex < numCols; colIndex++) { cell = this.cloneCell(sourceCell, true); this.setCellContent(cell); cell.getAttribute('vAlign') && cell.setAttribute('vAlign', cell.getAttribute('vAlign')); row.appendChild(cell); if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); } } else { var infoRow = this.indexTable[rowIndex], cellIndex = 0; for (colIndex = 0; colIndex < numCols; colIndex++) { var cellInfo = infoRow[colIndex]; //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 if (cellInfo.rowIndex < rowIndex) { cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); cell.rowSpan = cellInfo.rowSpan + 1; } else { cell = this.cloneCell(sourceCell, true); this.setCellContent(cell); row.appendChild(cell); } if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); } } //框选时插入不触发contentchange,需要手动更新索引。 this.update(); return row; }, /** * 删除一行单元格 * @param rowIndex */ deleteRow:function (rowIndex) { var row = this.table.rows[rowIndex], infoRow = this.indexTable[rowIndex], colsNum = this.colsNum, count = 0; //处理计数 for (var colIndex = 0; colIndex < colsNum;) { var cellInfo = infoRow[colIndex], cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); if (cell.rowSpan > 1) { if (cellInfo.rowIndex == rowIndex) { var clone = cell.cloneNode(true); clone.rowSpan = cell.rowSpan - 1; clone.innerHTML = ""; cell.rowSpan = 1; var nextRowIndex = rowIndex + 1, nextRow = this.table.rows[nextRowIndex], insertCellIndex, preMerged = this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; if (preMerged < colIndex) { insertCellIndex = colIndex - preMerged - 1; //nextRow.insertCell(insertCellIndex); domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); } else { if (nextRow.cells.length) nextRow.insertBefore(clone, nextRow.cells[0]) } count += 1; //cell.parentNode.removeChild(cell); } } colIndex += cell.colSpan || 1; } var deleteTds = [], cacheMap = {}; for (colIndex = 0; colIndex < colsNum; colIndex++) { var tmpRowIndex = infoRow[colIndex].rowIndex, tmpCellIndex = infoRow[colIndex].cellIndex, key = tmpRowIndex + "_" + tmpCellIndex; if (cacheMap[key])continue; cacheMap[key] = 1; cell = this.getCell(tmpRowIndex, tmpCellIndex); deleteTds.push(cell); } var mergeTds = []; utils.each(deleteTds, function (td) { if (td.rowSpan == 1) { td.parentNode.removeChild(td); } else { mergeTds.push(td); } }); utils.each(mergeTds, function (td) { td.rowSpan--; }); row.parentNode.removeChild(row); //浏览器方法本身存在bug,采用自定义方法删除 //this.table.deleteRow(rowIndex); this.update(); }, insertCol:function (colIndex, sourceCell, defaultValue) { var rowsNum = this.rowsNum, rowIndex = 0, tableRow, cell, backWidth = parseInt((this.table.offsetWidth - (this.colsNum + 1) * 20 - (this.colsNum + 1)) / (this.colsNum + 1), 10), isInsertTitleCol = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; function replaceTdToTh(rowIndex, cell, tableRow) { if (rowIndex == 0) { var th = cell.nextSibling || cell.previousSibling; if (th.tagName == 'TH') { th = cell.ownerDocument.createElement("th"); th.appendChild(cell.firstChild); tableRow.insertBefore(th, cell); domUtils.remove(cell) } }else{ if (cell.tagName == 'TH') { var td = cell.ownerDocument.createElement("td"); td.appendChild(cell.firstChild); tableRow.insertBefore(td, cell); domUtils.remove(cell) } } } var preCell; if (colIndex == 0 || colIndex == this.colsNum) { for (; rowIndex < rowsNum; rowIndex++) { tableRow = this.table.rows[rowIndex]; preCell = tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); this.setCellContent(cell); cell.setAttribute('vAlign', cell.getAttribute('vAlign')); preCell && cell.setAttribute('width', preCell.getAttribute('width')); if (!colIndex) { tableRow.insertBefore(cell, tableRow.cells[0]); } else { domUtils.insertAfter(tableRow.cells[tableRow.cells.length - 1], cell); } if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow) } } else { for (; rowIndex < rowsNum; rowIndex++) { var cellInfo = this.indexTable[rowIndex][colIndex]; if (cellInfo.colIndex < colIndex) { cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); cell.colSpan = cellInfo.colSpan + 1; } else { tableRow = this.table.rows[rowIndex]; preCell = tableRow.cells[cellInfo.cellIndex]; cell = this.cloneCell(sourceCell, true);//tableRow.insertCell(cellInfo.cellIndex); this.setCellContent(cell); cell.setAttribute('vAlign', cell.getAttribute('vAlign')); preCell && cell.setAttribute('width', preCell.getAttribute('width')); //防止IE下报错 preCell ? tableRow.insertBefore(cell, preCell) : tableRow.appendChild(cell); } if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); } } //框选时插入不触发contentchange,需要手动更新索引 this.update(); this.updateWidth(backWidth, defaultValue || {tdPadding:10, tdBorder:1}); }, updateWidth:function (width, defaultValue) { var table = this.table, tmpWidth = UETable.getWidth(table) - defaultValue.tdPadding * 2 - defaultValue.tdBorder + width; if (tmpWidth < table.ownerDocument.body.offsetWidth) { table.setAttribute("width", tmpWidth); return; } var tds = domUtils.getElementsByTagName(this.table, "td th"); utils.each(tds, function (td) { td.setAttribute("width", width); }) }, deleteCol:function (colIndex) { var indexTable = this.indexTable, tableRows = this.table.rows, backTableWidth = this.table.getAttribute("width"), backTdWidth = 0, rowsNum = this.rowsNum, cacheMap = {}; for (var rowIndex = 0; rowIndex < rowsNum;) { var infoRow = indexTable[rowIndex], cellInfo = infoRow[colIndex], key = cellInfo.rowIndex + '_' + cellInfo.colIndex; // 跳过已经处理过的Cell if (cacheMap[key])continue; cacheMap[key] = 1; var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); if (!backTdWidth) backTdWidth = cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell if (cell.colSpan > 1) { cell.colSpan--; } else { tableRows[rowIndex].deleteCell(cellInfo.cellIndex); } rowIndex += cellInfo.rowSpan || 1; } this.table.setAttribute("width", backTableWidth - backTdWidth); this.update(); }, splitToCells:function (cell) { var me = this, cells = this.splitToRows(cell); utils.each(cells, function (cell) { me.splitToCols(cell); }) }, splitToRows:function (cell) { var cellInfo = this.getCellInfo(cell), rowIndex = cellInfo.rowIndex, colIndex = cellInfo.colIndex, results = []; // 修改Cell的rowSpan cell.rowSpan = 1; results.push(cell); // 补齐单元格 for (var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; i < endRow; i++) { if (i == rowIndex)continue; var tableRow = this.table.rows[i], tmpCell = tableRow.insertCell(colIndex - this.getPreviewMergedCellsNum(i, colIndex)); tmpCell.colSpan = cellInfo.colSpan; this.setCellContent(tmpCell); tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); tmpCell.setAttribute('align', cell.getAttribute('align')); if (cell.style.cssText) { tmpCell.style.cssText = cell.style.cssText; } results.push(tmpCell); } this.update(); return results; }, getPreviewMergedCellsNum:function (rowIndex, colIndex) { var indexRow = this.indexTable[rowIndex], num = 0; for (var i = 0; i < colIndex;) { var colSpan = indexRow[i].colSpan, tmpRowIndex = indexRow[i].rowIndex; num += (colSpan - (tmpRowIndex == rowIndex ? 1 : 0)); i += colSpan; } return num; }, splitToCols:function (cell) { var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), cellInfo = this.getCellInfo(cell), rowIndex = cellInfo.rowIndex, colIndex = cellInfo.colIndex, results = []; // 修改Cell的rowSpan cell.colSpan = 1; cell.setAttribute("width", backWidth); results.push(cell); // 补齐单元格 for (var j = colIndex, endCol = colIndex + cellInfo.colSpan; j < endCol; j++) { if (j == colIndex)continue; var tableRow = this.table.rows[rowIndex], tmpCell = tableRow.insertCell(this.indexTable[rowIndex][j].cellIndex + 1); tmpCell.rowSpan = cellInfo.rowSpan; this.setCellContent(tmpCell); tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); tmpCell.setAttribute('align', cell.getAttribute('align')); tmpCell.setAttribute('width', backWidth); if (cell.style.cssText) { tmpCell.style.cssText = cell.style.cssText; } //处理th的情况 if (cell.tagName == 'TH') { var th = cell.ownerDocument.createElement('th'); th.appendChild(tmpCell.firstChild); th.setAttribute('vAlign', cell.getAttribute('vAlign')); th.rowSpan = tmpCell.rowSpan; tableRow.insertBefore(th, tmpCell); domUtils.remove(tmpCell); } results.push(tmpCell); } this.update(); return results; }, isLastCell:function (cell, rowsNum, colsNum) { rowsNum = rowsNum || this.rowsNum; colsNum = colsNum || this.colsNum; var cellInfo = this.getCellInfo(cell); return ((cellInfo.rowIndex + cellInfo.rowSpan) == rowsNum) && ((cellInfo.colIndex + cellInfo.colSpan) == colsNum); }, getLastCell:function (cells) { cells = cells || this.table.getElementsByTagName("td"); var firstInfo = this.getCellInfo(cells[0]); var me = this, last = cells[0], tr = last.parentNode, cellsNum = 0, cols = 0, rows; utils.each(cells, function (cell) { if (cell.parentNode == tr)cols += cell.colSpan || 1; cellsNum += cell.rowSpan * cell.colSpan || 1; }); rows = cellsNum / cols; utils.each(cells, function (cell) { if (me.isLastCell(cell, rows, cols)) { last = cell; return false; } }); return last; }, selectRow:function (rowIndex) { var indexRow = this.indexTable[rowIndex], start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), end = this.getCell(indexRow[this.colsNum - 1].rowIndex, indexRow[this.colsNum - 1].cellIndex), range = this.getCellsRange(start, end); this.setSelected(range); }, selectTable:function () { var tds = this.table.getElementsByTagName("td"), range = this.getCellsRange(tds[0], tds[tds.length - 1]); this.setSelected(range); }, setBackground:function (cells, value) { if (typeof value === "string") { utils.each(cells, function (cell) { cell.style.backgroundColor = value; }) } else if (typeof value === "object") { value = utils.extend({ repeat:true, colorList:["#ddd", "#fff"] }, value); var rowIndex = this.getCellInfo(cells[0]).rowIndex, count = 0, colors = value.colorList, getColor = function (list, index, repeat) { return list[index] ? list[index] : repeat ? list[index % list.length] : ""; }; for (var i = 0, cell; cell = cells[i++];) { var cellInfo = this.getCellInfo(cell); cell.style.backgroundColor = getColor(colors, ((rowIndex + count) == cellInfo.rowIndex) ? count : ++count, value.repeat); } } }, removeBackground:function (cells) { utils.each(cells, function (cell) { cell.style.backgroundColor = ""; }) } }; function showError(e) { } })(); // plugins/table.cmds.js /** * Created with JetBrains PhpStorm. * User: taoqili * Date: 13-2-20 * Time: 下午6:25 * To change this template use File | Settings | File Templates. */ ; (function () { var UT = UE.UETable, getTableItemsByRange = function (editor) { return UT.getTableItemsByRange(editor); }, getUETableBySelected = function (editor) { return UT.getUETableBySelected(editor) }, getDefaultValue = function (editor, table) { return UT.getDefaultValue(editor, table); }, getUETable = function (tdOrTable) { return UT.getUETable(tdOrTable); }; UE.commands['inserttable'] = { queryCommandState: function () { return getTableItemsByRange(this).table ? -1 : 0; }, execCommand: function (cmd, opt) { function createTable(opt, tdWidth) { var html = [], rowsNum = opt.numRows, colsNum = opt.numCols; for (var r = 0; r < rowsNum; r++) { html.push(''); for (var c = 0; c < colsNum; c++) { html.push('
          • ' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '
            ') + '
            ' + html.join('') + '
            ' return '' + html.join('') + '
            ' } if (!opt) { opt = utils.extend({}, { numCols: this.options.defaultCols, numRows: this.options.defaultRows, tdvalign: this.options.tdvalign }) } var me = this; var range = this.selection.getRange(), start = range.startContainer, firstParentBlock = domUtils.findParent(start, function (node) { return domUtils.isBlockElm(node); }, true) || me.body; var defaultValue = getDefaultValue(me), tableWidth = firstParentBlock.offsetWidth, tdWidth = Math.floor(tableWidth / opt.numCols - defaultValue.tdPadding * 2 - defaultValue.tdBorder); //todo其他属性 !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); me.execCommand("inserthtml", createTable(opt, tdWidth)); } }; UE.commands['insertparagraphbeforetable'] = { queryCommandState: function () { return getTableItemsByRange(this).cell ? 0 : -1; }, execCommand: function () { var table = getTableItemsByRange(this).table; if (table) { var p = this.document.createElement("p"); p.innerHTML = browser.ie ? ' ' : '
            '; table.parentNode.insertBefore(p, table); this.selection.getRange().setStart(p, 0).setCursor(); } } }; UE.commands['deletetable'] = { queryCommandState: function () { var rng = this.selection.getRange(); return domUtils.findParentByTagName(rng.startContainer, 'table', true) ? 0 : -1; }, execCommand: function (cmd, table) { var rng = this.selection.getRange(); table = table || domUtils.findParentByTagName(rng.startContainer, 'table', true); if (table) { var next = table.nextSibling; if (!next) { next = domUtils.createElement(this.document, 'p', { 'innerHTML': browser.ie ? domUtils.fillChar : '
            ' }); table.parentNode.insertBefore(next, table); } domUtils.remove(table); rng = this.selection.getRange(); if (next.nodeType == 3) { rng.setStartBefore(next) } else { rng.setStart(next, 0) } rng.setCursor(false, true) this.fireEvent("tablehasdeleted") } } }; UE.commands['cellalign'] = { queryCommandState: function () { return getSelectedArr(this).length ? 0 : -1 }, execCommand: function (cmd, align) { var selectedTds = getSelectedArr(this); if (selectedTds.length) { for (var i = 0, ci; ci = selectedTds[i++];) { ci.setAttribute('align', align); } } } }; UE.commands['cellvalign'] = { queryCommandState: function () { return getSelectedArr(this).length ? 0 : -1; }, execCommand: function (cmd, valign) { var selectedTds = getSelectedArr(this); if (selectedTds.length) { for (var i = 0, ci; ci = selectedTds[i++];) { ci.setAttribute('vAlign', valign); } } } }; UE.commands['insertcaption'] = { queryCommandState: function () { var table = getTableItemsByRange(this).table; if (table) { return table.getElementsByTagName('caption').length == 0 ? 1 : -1; } return -1; }, execCommand: function () { var table = getTableItemsByRange(this).table; if (table) { var caption = this.document.createElement('caption'); caption.innerHTML = browser.ie ? domUtils.fillChar : '
            '; table.insertBefore(caption, table.firstChild); var range = this.selection.getRange(); range.setStart(caption, 0).setCursor(); } } }; UE.commands['deletecaption'] = { queryCommandState: function () { var rng = this.selection.getRange(), table = domUtils.findParentByTagName(rng.startContainer, 'table'); if (table) { return table.getElementsByTagName('caption').length == 0 ? -1 : 1; } return -1; }, execCommand: function () { var rng = this.selection.getRange(), table = domUtils.findParentByTagName(rng.startContainer, 'table'); if (table) { domUtils.remove(table.getElementsByTagName('caption')[0]); var range = this.selection.getRange(); range.setStart(table.rows[0].cells[0], 0).setCursor(); } } }; UE.commands['inserttitle'] = { queryCommandState: function () { var table = getTableItemsByRange(this).table; if (table) { var firstRow = table.rows[0]; return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() != 'th' ? 0 : -1 } return -1; }, execCommand: function () { var table = getTableItemsByRange(this).table; if (table) { getUETable(table).insertRow(0, 'th'); } var th = table.getElementsByTagName('th')[0]; this.selection.getRange().setStart(th, 0).setCursor(false, true); } }; UE.commands['deletetitle'] = { queryCommandState: function () { var table = getTableItemsByRange(this).table; if (table) { var firstRow = table.rows[0]; return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() == 'th' ? 0 : -1 } return -1; }, execCommand: function () { var table = getTableItemsByRange(this).table; if (table) { domUtils.remove(table.rows[0]) } var td = table.getElementsByTagName('td')[0]; this.selection.getRange().setStart(td, 0).setCursor(false, true); } }; UE.commands['inserttitlecol'] = { queryCommandState: function () { var table = getTableItemsByRange(this).table; if (table) { var lastRow = table.rows[table.rows.length-1]; return lastRow.getElementsByTagName('th').length ? -1 : 0; } return -1; }, execCommand: function (cmd) { var table = getTableItemsByRange(this).table; if (table) { getUETable(table).insertCol(0, 'th'); } resetTdWidth(table, this); var th = table.getElementsByTagName('th')[0]; this.selection.getRange().setStart(th, 0).setCursor(false, true); } }; UE.commands['deletetitlecol'] = { queryCommandState: function () { var table = getTableItemsByRange(this).table; if (table) { var lastRow = table.rows[table.rows.length-1]; return lastRow.getElementsByTagName('th').length ? 0 : -1; } return -1; }, execCommand: function () { var table = getTableItemsByRange(this).table; if (table) { for(var i = 0; i< table.rows.length; i++ ){ domUtils.remove(table.rows[i].children[0]) } } resetTdWidth(table, this); var td = table.getElementsByTagName('td')[0]; this.selection.getRange().setStart(td, 0).setCursor(false, true); } }; UE.commands["mergeright"] = { queryCommandState: function (cmd) { var tableItems = getTableItemsByRange(this), table = tableItems.table, cell = tableItems.cell; if (!table || !cell) return -1; var ut = getUETable(table); if (ut.selectedTds.length) return -1; var cellInfo = ut.getCellInfo(cell), rightColIndex = cellInfo.colIndex + cellInfo.colSpan; if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], rightCell = table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 return (rightCellInfo.rowIndex == cellInfo.rowIndex && rightCellInfo.rowSpan == cellInfo.rowSpan) ? 0 : -1; }, execCommand: function (cmd) { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); ut.mergeRight(cell); rng.moveToBookmark(bk).select(); } }; UE.commands["mergedown"] = { queryCommandState: function (cmd) { var tableItems = getTableItemsByRange(this), table = tableItems.table, cell = tableItems.cell; if (!table || !cell) return -1; var ut = getUETable(table); if (ut.selectedTds.length)return -1; var cellInfo = ut.getCellInfo(cell), downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], downCell = table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 return (downCellInfo.colIndex == cellInfo.colIndex && downCellInfo.colSpan == cellInfo.colSpan) ? 0 : -1; }, execCommand: function () { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); ut.mergeDown(cell); rng.moveToBookmark(bk).select(); } }; UE.commands["mergecells"] = { queryCommandState: function () { return getUETableBySelected(this) ? 0 : -1; }, execCommand: function () { var ut = getUETableBySelected(this); if (ut && ut.selectedTds.length) { var cell = ut.selectedTds[0]; ut.mergeRange(); var rng = this.selection.getRange(); if (domUtils.isEmptyBlock(cell)) { rng.setStart(cell, 0).collapse(true) } else { rng.selectNodeContents(cell) } rng.select(); } } }; UE.commands["insertrow"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this), cell = tableItems.cell; return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && tableItems.tr !== tableItems.table.rows[0])) && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; }, execCommand: function () { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var tableItems = getTableItemsByRange(this), cell = tableItems.cell, table = tableItems.table, ut = getUETable(table), cellInfo = ut.getCellInfo(cell); //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); if (!ut.selectedTds.length) { ut.insertRow(cellInfo.rowIndex, cell); } else { var range = ut.cellsRange; for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { ut.insertRow(range.beginRowIndex, cell); } } rng.moveToBookmark(bk).select(); if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); } }; //后插入行 UE.commands["insertrownext"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this), cell = tableItems.cell; return cell && (cell.tagName == "TD") && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; }, execCommand: function () { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var tableItems = getTableItemsByRange(this), cell = tableItems.cell, table = tableItems.table, ut = getUETable(table), cellInfo = ut.getCellInfo(cell); //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); if (!ut.selectedTds.length) { ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); } else { var range = ut.cellsRange; for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { ut.insertRow(range.endRowIndex + 1, cell); } } rng.moveToBookmark(bk).select(); if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); } }; UE.commands["deleterow"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this); return tableItems.cell ? 0 : -1; }, execCommand: function () { var cell = getTableItemsByRange(this).cell, ut = getUETable(cell), cellsRange = ut.cellsRange, cellInfo = ut.getCellInfo(cell), preCell = ut.getVSideCell(cell), nextCell = ut.getVSideCell(cell, true), rng = this.selection.getRange(); if (utils.isEmptyObject(cellsRange)) { ut.deleteRow(cellInfo.rowIndex); } else { for (var i = cellsRange.beginRowIndex; i < cellsRange.endRowIndex + 1; i++) { ut.deleteRow(cellsRange.beginRowIndex); } } var table = ut.table; if (!table.getElementsByTagName('td').length) { var nextSibling = table.nextSibling; domUtils.remove(table); if (nextSibling) { rng.setStart(nextSibling, 0).setCursor(false, true); } } else { if (cellInfo.rowSpan == 1 || cellInfo.rowSpan == cellsRange.endRowIndex - cellsRange.beginRowIndex + 1) { if (nextCell || preCell) rng.selectNodeContents(nextCell || preCell).setCursor(false, true); } else { var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex); if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); } } if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); } }; UE.commands["insertcol"] = { queryCommandState: function (cmd) { var tableItems = getTableItemsByRange(this), cell = tableItems.cell; return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; }, execCommand: function (cmd) { var rng = this.selection.getRange(), bk = rng.createBookmark(true); if (this.queryCommandState(cmd) == -1)return; var cell = getTableItemsByRange(this).cell, ut = getUETable(cell), cellInfo = ut.getCellInfo(cell); //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); if (!ut.selectedTds.length) { ut.insertCol(cellInfo.colIndex, cell); } else { var range = ut.cellsRange; for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { ut.insertCol(range.beginColIndex, cell); } } rng.moveToBookmark(bk).select(true); } }; UE.commands["insertcolnext"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this), cell = tableItems.cell; return cell && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; }, execCommand: function () { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var cell = getTableItemsByRange(this).cell, ut = getUETable(cell), cellInfo = ut.getCellInfo(cell); //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); if (!ut.selectedTds.length) { ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); } else { var range = ut.cellsRange; for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { ut.insertCol(range.endColIndex + 1, cell); } } rng.moveToBookmark(bk).select(); } }; UE.commands["deletecol"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this); return tableItems.cell ? 0 : -1; }, execCommand: function () { var cell = getTableItemsByRange(this).cell, ut = getUETable(cell), range = ut.cellsRange, cellInfo = ut.getCellInfo(cell), preCell = ut.getHSideCell(cell), nextCell = ut.getHSideCell(cell, true); if (utils.isEmptyObject(range)) { ut.deleteCol(cellInfo.colIndex); } else { for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { ut.deleteCol(range.beginColIndex); } } var table = ut.table, rng = this.selection.getRange(); if (!table.getElementsByTagName('td').length) { var nextSibling = table.nextSibling; domUtils.remove(table); if (nextSibling) { rng.setStart(nextSibling, 0).setCursor(false, true); } } else { if (domUtils.inDoc(cell, this.document)) { rng.setStart(cell, 0).setCursor(false, true); } else { if (nextCell && domUtils.inDoc(nextCell, this.document)) { rng.selectNodeContents(nextCell).setCursor(false, true); } else { if (preCell && domUtils.inDoc(preCell, this.document)) { rng.selectNodeContents(preCell).setCursor(true, true); } } } } } }; UE.commands["splittocells"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this), cell = tableItems.cell; if (!cell) return -1; var ut = getUETable(tableItems.table); if (ut.selectedTds.length > 0) return -1; return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; }, execCommand: function () { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); ut.splitToCells(cell); rng.moveToBookmark(bk).select(); } }; UE.commands["splittorows"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this), cell = tableItems.cell; if (!cell) return -1; var ut = getUETable(tableItems.table); if (ut.selectedTds.length > 0) return -1; return cell && cell.rowSpan > 1 ? 0 : -1; }, execCommand: function () { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); ut.splitToRows(cell); rng.moveToBookmark(bk).select(); } }; UE.commands["splittocols"] = { queryCommandState: function () { var tableItems = getTableItemsByRange(this), cell = tableItems.cell; if (!cell) return -1; var ut = getUETable(tableItems.table); if (ut.selectedTds.length > 0) return -1; return cell && cell.colSpan > 1 ? 0 : -1; }, execCommand: function () { var rng = this.selection.getRange(), bk = rng.createBookmark(true); var cell = getTableItemsByRange(this).cell, ut = getUETable(cell); ut.splitToCols(cell); rng.moveToBookmark(bk).select(); } }; UE.commands["adaptbytext"] = UE.commands["adaptbywindow"] = { queryCommandState: function () { return getTableItemsByRange(this).table ? 0 : -1 }, execCommand: function (cmd) { var tableItems = getTableItemsByRange(this), table = tableItems.table; if (table) { if (cmd == 'adaptbywindow') { resetTdWidth(table, this); } else { var cells = domUtils.getElementsByTagName(table, "td th"); utils.each(cells, function (cell) { cell.removeAttribute("width"); }); table.removeAttribute("width"); } } } }; //平均分配各列 UE.commands['averagedistributecol'] = { queryCommandState: function () { var ut = getUETableBySelected(this); if (!ut) return -1; return ut.isFullRow() || ut.isFullCol() ? 0 : -1; }, execCommand: function (cmd) { var me = this, ut = getUETableBySelected(me); function getAverageWidth() { var tb = ut.table, averageWidth, sumWidth = 0, colsNum = 0, tbAttr = getDefaultValue(me, tb); if (ut.isFullRow()) { sumWidth = tb.offsetWidth; colsNum = ut.colsNum; } else { var begin = ut.cellsRange.beginColIndex, end = ut.cellsRange.endColIndex, node; for (var i = begin; i <= end;) { node = ut.selectedTds[i]; sumWidth += node.offsetWidth; i += node.colSpan; colsNum += 1; } } averageWidth = Math.ceil(sumWidth / colsNum) - tbAttr.tdBorder * 2 - tbAttr.tdPadding * 2; return averageWidth; } function setAverageWidth(averageWidth) { utils.each(domUtils.getElementsByTagName(ut.table, "th"), function (node) { node.setAttribute("width", ""); }); var cells = ut.isFullRow() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; utils.each(cells, function (node) { if (node.colSpan == 1) { node.setAttribute("width", averageWidth); } }); } if (ut && ut.selectedTds.length) { setAverageWidth(getAverageWidth()); } } }; //平均分配各行 UE.commands['averagedistributerow'] = { queryCommandState: function () { var ut = getUETableBySelected(this); if (!ut) return -1; if (ut.selectedTds && /th/ig.test(ut.selectedTds[0].tagName)) return -1; return ut.isFullRow() || ut.isFullCol() ? 0 : -1; }, execCommand: function (cmd) { var me = this, ut = getUETableBySelected(me); function getAverageHeight() { var averageHeight, rowNum, sumHeight = 0, tb = ut.table, tbAttr = getDefaultValue(me, tb), tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName('td')[0], "padding-top")); if (ut.isFullCol()) { var captionArr = domUtils.getElementsByTagName(tb, "caption"), thArr = domUtils.getElementsByTagName(tb, "th"), captionHeight, thHeight; if (captionArr.length > 0) { captionHeight = captionArr[0].offsetHeight; } if (thArr.length > 0) { thHeight = thArr[0].offsetHeight; } sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); rowNum = thArr.length == 0 ? ut.rowsNum : (ut.rowsNum - 1); } else { var begin = ut.cellsRange.beginRowIndex, end = ut.cellsRange.endRowIndex, count = 0, trs = domUtils.getElementsByTagName(tb, "tr"); for (var i = begin; i <= end; i++) { sumHeight += trs[i].offsetHeight; count += 1; } rowNum = count; } //ie8下是混杂模式 if (browser.ie && browser.version < 9) { averageHeight = Math.ceil(sumHeight / rowNum); } else { averageHeight = Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; } return averageHeight; } function setAverageHeight(averageHeight) { var cells = ut.isFullCol() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; utils.each(cells, function (node) { if (node.rowSpan == 1) { node.setAttribute("height", averageHeight); } }); } if (ut && ut.selectedTds.length) { setAverageHeight(getAverageHeight()); } } }; //单元格对齐方式 UE.commands['cellalignment'] = { queryCommandState: function () { return getTableItemsByRange(this).table ? 0 : -1 }, execCommand: function (cmd, data) { var me = this, ut = getUETableBySelected(me); if (!ut) { var start = me.selection.getStart(), cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); if (!/caption/ig.test(cell.tagName)) { domUtils.setAttributes(cell, data); } else { cell.style.textAlign = data.align; cell.style.verticalAlign = data.vAlign; } me.selection.getRange().setCursor(true); } else { utils.each(ut.selectedTds, function (cell) { domUtils.setAttributes(cell, data); }); } }, /** * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 * @see UE.UETable.getTableCellAlignState */ queryCommandValue: function (cmd) { var activeMenuCell = getTableItemsByRange( this).cell; if( !activeMenuCell ) { activeMenuCell = getSelectedArr(this)[0]; } if (!activeMenuCell) { return null; } else { //获取同时选中的其他单元格 var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; !cells.length && ( cells = activeMenuCell ); return UE.UETable.getTableCellAlignState(cells); } } }; //表格对齐方式 UE.commands['tablealignment'] = { queryCommandState: function () { if (browser.ie && browser.version < 8) { return -1; } return getTableItemsByRange(this).table ? 0 : -1 }, execCommand: function (cmd, value) { var me = this, start = me.selection.getStart(), table = start && domUtils.findParentByTagName(start, ["table"], true); if (table) { table.setAttribute("align",value); } } }; //表格属性 UE.commands['edittable'] = { queryCommandState: function () { return getTableItemsByRange(this).table ? 0 : -1 }, execCommand: function (cmd, color) { var rng = this.selection.getRange(), table = domUtils.findParentByTagName(rng.startContainer, 'table'); if (table) { var arr = domUtils.getElementsByTagName(table, "td").concat( domUtils.getElementsByTagName(table, "th"), domUtils.getElementsByTagName(table, "caption") ); utils.each(arr, function (node) { node.style.borderColor = color; }); } } }; //单元格属性 UE.commands['edittd'] = { queryCommandState: function () { return getTableItemsByRange(this).table ? 0 : -1 }, execCommand: function (cmd, bkColor) { var me = this, ut = getUETableBySelected(me); if (!ut) { var start = me.selection.getStart(), cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); if (cell) { cell.style.backgroundColor = bkColor; } } else { utils.each(ut.selectedTds, function (cell) { cell.style.backgroundColor = bkColor; }); } } }; UE.commands["settablebackground"] = { queryCommandState: function () { return getSelectedArr(this).length > 1 ? 0 : -1; }, execCommand: function (cmd, value) { var cells, ut; cells = getSelectedArr(this); ut = getUETable(cells[0]); ut.setBackground(cells, value); } }; UE.commands["cleartablebackground"] = { queryCommandState: function () { var cells = getSelectedArr(this); if (!cells.length)return -1; for (var i = 0, cell; cell = cells[i++];) { if (cell.style.backgroundColor !== "") return 0; } return -1; }, execCommand: function () { var cells = getSelectedArr(this), ut = getUETable(cells[0]); ut.removeBackground(cells); } }; UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { queryCommandState: function (cmd) { var table = getTableItemsByRange(this).table; if (!table) return -1; var interlaced = table.getAttribute("interlaced"); if (cmd == "interlacetable") { //TODO 待定 //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 return (interlaced === "enabled") ? -1 : 0; } else { return (!interlaced || interlaced === "disabled") ? -1 : 0; } }, execCommand: function (cmd, classList) { var table = getTableItemsByRange(this).table; if (cmd == "interlacetable") { table.setAttribute("interlaced", "enabled"); this.fireEvent("interlacetable", table, classList); } else { table.setAttribute("interlaced", "disabled"); this.fireEvent("uninterlacetable", table); } } }; UE.commands["setbordervisible"] = { queryCommandState: function (cmd) { var table = getTableItemsByRange(this).table; if (!table) return -1; return 0; }, execCommand: function () { var table = getTableItemsByRange(this).table; utils.each(domUtils.getElementsByTagName(table,'td'),function(td){ td.style.borderWidth = '1px'; td.style.borderStyle = 'solid'; }) } }; function resetTdWidth(table, editor) { var tds = domUtils.getElementsByTagName(table,'td th'); utils.each(tds, function (td) { td.removeAttribute("width"); }); table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table))); var tdsWidths = []; setTimeout(function () { utils.each(tds, function (td) { (td.colSpan == 1) && tdsWidths.push(td.offsetWidth) }) utils.each(tds, function (td,i) { (td.colSpan == 1) && td.setAttribute("width", tdsWidths[i] + ""); }) }, 0); } function getTableWidth(editor, needIEHack, defaultValue) { var body = editor.body; return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); } function getSelectedArr(editor) { var cell = getTableItemsByRange(editor).cell; if (cell) { var ut = getUETable(cell); return ut.selectedTds.length ? ut.selectedTds : [cell]; } else { return []; } } })(); // plugins/table.action.js /** * Created with JetBrains PhpStorm. * User: taoqili * Date: 12-10-12 * Time: 上午10:05 * To change this template use File | Settings | File Templates. */ UE.plugins['table'] = function () { var me = this, tabTimer = null, //拖动计时器 tableDragTimer = null, //双击计时器 tableResizeTimer = null, //单元格最小宽度 cellMinWidth = 5, isInResizeBuffer = false, //单元格边框大小 cellBorderWidth = 5, //鼠标偏移距离 offsetOfTableCell = 10, //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 singleClickState = 0, userActionStatus = null, //双击允许的时间范围 dblclickTime = 360, UT = UE.UETable, getUETable = function (tdOrTable) { return UT.getUETable(tdOrTable); }, getUETableBySelected = function (editor) { return UT.getUETableBySelected(editor); }, getDefaultValue = function (editor, table) { return UT.getDefaultValue(editor, table); }, removeSelectedClass = function (cells) { return UT.removeSelectedClass(cells); }; function showError(e) { // throw e; } me.ready(function(){ var me = this; var orgGetText = me.selection.getText; me.selection.getText = function(){ var table = getUETableBySelected(me); if(table){ var str = ''; utils.each(table.selectedTds,function(td){ str += td[browser.ie?'innerText':'textContent']; }) return str; }else{ return orgGetText.call(me.selection) } } }) //处理拖动及框选相关方法 var startTd = null, //鼠标按下时的锚点td currentTd = null, //当前鼠标经过时的td onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 dragButton = null, dragOver = false, dragLine = null, //模拟的拖动线 dragTd = null; //发生拖动的目标td var mousedown = false, //todo 判断混乱模式 needIEHack = true; me.setOpt({ 'maxColNum':20, 'maxRowNum':100, 'defaultCols':5, 'defaultRows':5, 'tdvalign':'top', 'cursorpath':me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_", 'tableDragable':false, 'classList':["ue-table-interlace-color-single","ue-table-interlace-color-double"] }); me.getUETable = getUETable; var commands = { 'deletetable':1, 'inserttable':1, 'cellvalign':1, 'insertcaption':1, 'deletecaption':1, 'inserttitle':1, 'deletetitle':1, "mergeright":1, "mergedown":1, "mergecells":1, "insertrow":1, "insertrownext":1, "deleterow":1, "insertcol":1, "insertcolnext":1, "deletecol":1, "splittocells":1, "splittorows":1, "splittocols":1, "adaptbytext":1, "adaptbywindow":1, "adaptbycustomer":1, "insertparagraph":1, "insertparagraphbeforetable":1, "averagedistributecol":1, "averagedistributerow":1 }; me.ready(function () { utils.cssRule('table', //选中的td上的样式 '.selectTdClass{background-color:#edf5fa !important}' + 'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' + //插入的表格的默认样式 'table{margin-bottom:10px;border-collapse:collapse;display:table;}' + 'td,th{padding: 5px 10px;border: 1px solid #DDD;}' + 'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + 'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' + 'table tr.firstRow th{border-top-width:2px;}' + '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' + 'td p{margin:0;padding:0;}', me.document); var tableCopyList, isFullCol, isFullRow; //注册del/backspace事件 me.addListener('keydown', function (cmd, evt) { var me = this; var keyCode = evt.keyCode || evt.which; if (keyCode == 8) { var ut = getUETableBySelected(me); if (ut && ut.selectedTds.length) { if (ut.isFullCol()) { me.execCommand('deletecol') } else if (ut.isFullRow()) { me.execCommand('deleterow') } else { me.fireEvent('delcells'); } domUtils.preventDefault(evt); } var caption = domUtils.findParentByTagName(me.selection.getStart(), 'caption', true), range = me.selection.getRange(); if (range.collapsed && caption && isEmptyBlock(caption)) { me.fireEvent('saveScene'); var table = caption.parentNode; domUtils.remove(caption); if (table) { range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); } me.fireEvent('saveScene'); } } if (keyCode == 46) { ut = getUETableBySelected(me); if (ut) { me.fireEvent('saveScene'); for (var i = 0, ci; ci = ut.selectedTds[i++];) { domUtils.fillNode(me.document, ci) } me.fireEvent('saveScene'); domUtils.preventDefault(evt); } } if (keyCode == 13) { var rng = me.selection.getRange(), caption = domUtils.findParentByTagName(rng.startContainer, 'caption', true); if (caption) { var table = domUtils.findParentByTagName(caption, 'table'); if (!rng.collapsed) { rng.deleteContents(); me.fireEvent('saveScene'); } else { if (caption) { rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); } } domUtils.preventDefault(evt); return; } if (rng.collapsed) { var table = domUtils.findParentByTagName(rng.startContainer, 'table'); if (table) { var cell = table.rows[0].cells[0], start = domUtils.findParentByTagName(me.selection.getStart(), ['td', 'th'], true), preNode = table.previousSibling; if (cell === start && (!preNode || preNode.nodeType == 1 && preNode.tagName == 'TABLE' ) && domUtils.isStartInblock(rng)) { var first = domUtils.findParent(me.selection.getStart(), function(n){return domUtils.isBlockElm(n)}, true); if(first && ( /t(h|d)/i.test(first.tagName) || first === start.firstChild )){ me.execCommand('insertparagraphbeforetable'); domUtils.preventDefault(evt); } } } } } if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') { tableCopyList = null; var ut = getUETableBySelected(me); if (ut) { var tds = ut.selectedTds; isFullCol = ut.isFullCol(); isFullRow = ut.isFullRow(); tableCopyList = [ [ut.cloneCell(tds[0],null,true)] ]; for (var i = 1, ci; ci = tds[i]; i++) { if (ci.parentNode !== tds[i - 1].parentNode) { tableCopyList.push([ut.cloneCell(ci,null,true)]); } else { tableCopyList[tableCopyList.length - 1].push(ut.cloneCell(ci,null,true)); } } } } }); me.addListener("tablehasdeleted",function(){ toggleDraggableState(this, false, "", null); if (dragButton)domUtils.remove(dragButton); }); me.addListener('beforepaste', function (cmd, html) { var me = this; var rng = me.selection.getRange(); if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) { var div = me.document.createElement("div"); div.innerHTML = html.html; //trace:3729 html.html = div[browser.ie9below ? 'innerText' : 'textContent']; return; } var table = getUETableBySelected(me); if (tableCopyList) { me.fireEvent('saveScene'); var rng = me.selection.getRange(); var td = domUtils.findParentByTagName(rng.startContainer, ['td', 'th'], true), tmpNode, preNode; if (td) { var ut = getUETable(td); if (isFullRow) { var rowIndex = ut.getCellInfo(td).rowIndex; if (td.tagName == 'TH') { rowIndex++; } for (var i = 0, ci; ci = tableCopyList[i++];) { var tr = ut.insertRow(rowIndex++, "td"); for (var j = 0, cj; cj = ci[j]; j++) { var cell = tr.cells[j]; if (!cell) { cell = tr.insertCell(j) } cell.innerHTML = cj.innerHTML; cj.getAttribute('width') && cell.setAttribute('width', cj.getAttribute('width')); cj.getAttribute('vAlign') && cell.setAttribute('vAlign', cj.getAttribute('vAlign')); cj.getAttribute('align') && cell.setAttribute('align', cj.getAttribute('align')); cj.style.cssText && (cell.style.cssText = cj.style.cssText) } for (var j = 0, cj; cj = tr.cells[j]; j++) { if (!ci[j]) break; cj.innerHTML = ci[j].innerHTML; ci[j].getAttribute('width') && cj.setAttribute('width', ci[j].getAttribute('width')); ci[j].getAttribute('vAlign') && cj.setAttribute('vAlign', ci[j].getAttribute('vAlign')); ci[j].getAttribute('align') && cj.setAttribute('align', ci[j].getAttribute('align')); ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText) } } } else { if (isFullCol) { cellInfo = ut.getCellInfo(td); var maxColNum = 0; for (var j = 0, ci = tableCopyList[0], cj; cj = ci[j++];) { maxColNum += cj.colSpan || 1; } me.__hasEnterExecCommand = true; for (i = 0; i < maxColNum; i++) { me.execCommand('insertcol'); } me.__hasEnterExecCommand = false; td = ut.table.rows[0].cells[cellInfo.cellIndex]; if (td.tagName == 'TH') { td = ut.table.rows[1].cells[cellInfo.cellIndex]; } } for (var i = 0, ci; ci = tableCopyList[i++];) { tmpNode = td; for (var j = 0, cj; cj = ci[j++];) { if (td) { td.innerHTML = cj.innerHTML; //todo 定制处理 cj.getAttribute('width') && td.setAttribute('width', cj.getAttribute('width')); cj.getAttribute('vAlign') && td.setAttribute('vAlign', cj.getAttribute('vAlign')); cj.getAttribute('align') && td.setAttribute('align', cj.getAttribute('align')); cj.style.cssText && (td.style.cssText = cj.style.cssText); preNode = td; td = td.nextSibling; } else { var cloneTd = cj.cloneNode(true); domUtils.removeAttributes(cloneTd, ['class', 'rowSpan', 'colSpan']); preNode.parentNode.appendChild(cloneTd) } } td = ut.getNextCell(tmpNode, true, true); if (!tableCopyList[i]) break; if (!td) { var cellInfo = ut.getCellInfo(tmpNode); ut.table.insertRow(ut.table.rows.length); ut.update(); td = ut.getVSideCell(tmpNode, true); } } } ut.update(); } else { table = me.document.createElement('table'); for (var i = 0, ci; ci = tableCopyList[i++];) { var tr = table.insertRow(table.rows.length); for (var j = 0, cj; cj = ci[j++];) { cloneTd = UT.cloneCell(cj,null,true); domUtils.removeAttributes(cloneTd, ['class']); tr.appendChild(cloneTd) } if (j == 2 && cloneTd.rowSpan > 1) { cloneTd.rowSpan = 1; } } var defaultValue = getDefaultValue(me), width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0); me.execCommand('insertHTML', '' + table.innerHTML.replace(/>\s*<').replace(/\bth\b/gi, "td") + '
            ') } me.fireEvent('contentchange'); me.fireEvent('saveScene'); html.html = ''; return true; } else { var div = me.document.createElement("div"), tables; div.innerHTML = html.html; tables = div.getElementsByTagName("table"); if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) { utils.each(tables, function (t) { domUtils.remove(t) }); if (domUtils.findParentByTagName(me.selection.getStart(), 'caption', true)) { div.innerHTML = div[browser.ie ? 'innerText' : 'textContent']; } } else { utils.each(tables, function (table) { removeStyleSize(table, true); domUtils.removeAttributes(table, ['style', 'border']); utils.each(domUtils.getElementsByTagName(table, "td"), function (td) { if (isEmptyBlock(td)) { domUtils.fillNode(me.document, td); } removeStyleSize(td, true); // domUtils.removeAttributes(td, ['style']) }); }); } html.html = div.innerHTML; } }); me.addListener('afterpaste', function () { utils.each(domUtils.getElementsByTagName(me.body, "table"), function (table) { if (table.offsetWidth > me.body.offsetWidth) { var defaultValue = getDefaultValue(me, table); table.style.width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0) + 'px' } }) }); me.addListener('blur', function () { tableCopyList = null; }); var timer; me.addListener('keydown', function () { clearTimeout(timer); timer = setTimeout(function () { var rng = me.selection.getRange(), cell = domUtils.findParentByTagName(rng.startContainer, ['th', 'td'], true); if (cell) { var table = cell.parentNode.parentNode.parentNode; if (table.offsetWidth > table.getAttribute("width")) { cell.style.wordBreak = "break-all"; } } }, 100); }); me.addListener("selectionchange", function () { toggleDraggableState(me, false, "", null); }); //内容变化时触发索引更新 //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 me.addListener("contentchange", function () { var me = this; //尽可能排除一些不需要更新的状况 hideDragLine(me); if (getUETableBySelected(me))return; var rng = me.selection.getRange(); var start = rng.startContainer; start = domUtils.findParentByTagName(start, ['td', 'th'], true); utils.each(domUtils.getElementsByTagName(me.document, 'table'), function (table) { if (me.fireEvent("excludetable", table) === true) return; table.ueTable = new UT(table); //trace:3742 // utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { // // if (domUtils.isEmptyBlock(td) && td !== start) { // domUtils.fillNode(me.document, td); // if (browser.ie && browser.version == 6) { // td.innerHTML = ' ' // } // } // }); // utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { // if (domUtils.isEmptyBlock(th) && th !== start) { // domUtils.fillNode(me.document, th); // if (browser.ie && browser.version == 6) { // th.innerHTML = ' ' // } // } // }); table.onmouseover = function () { me.fireEvent('tablemouseover', table); }; table.onmousemove = function () { me.fireEvent('tablemousemove', table); me.options.tableDragable && toggleDragButton(true, this, me); utils.defer(function(){ me.fireEvent('contentchange',50) },true) }; table.onmouseout = function () { me.fireEvent('tablemouseout', table); toggleDraggableState(me, false, "", null); hideDragLine(me); }; table.onclick = function (evt) { evt = me.window.event || evt; var target = getParentTdOrTh(evt.target || evt.srcElement); if (!target)return; var ut = getUETable(target), table = ut.table, cellInfo = ut.getCellInfo(target), cellsRange, rng = me.selection.getRange(); // if ("topLeft" == inPosition(table, mouseCoords(evt))) { // cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); // ut.setSelected(cellsRange); // return; // } // if ("bottomRight" == inPosition(table, mouseCoords(evt))) { // // return; // } if (inTableSide(table, target, evt, true)) { var endTdCol = ut.getCell(ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex); if (evt.shiftKey && ut.selectedTds.length) { if (ut.selectedTds[0] !== endTdCol) { cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); ut.setSelected(cellsRange); } else { rng && rng.selectNodeContents(endTdCol).select(); } } else { if (target !== endTdCol) { cellsRange = ut.getCellsRange(target, endTdCol); ut.setSelected(cellsRange); } else { rng && rng.selectNodeContents(endTdCol).select(); } } return; } if (inTableSide(table, target, evt)) { var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex); if (evt.shiftKey && ut.selectedTds.length) { if (ut.selectedTds[0] !== endTdRow) { cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); ut.setSelected(cellsRange); } else { rng && rng.selectNodeContents(endTdRow).select(); } } else { if (target !== endTdRow) { cellsRange = ut.getCellsRange(target, endTdRow); ut.setSelected(cellsRange); } else { rng && rng.selectNodeContents(endTdRow).select(); } } } }; }); switchBorderColor(me, true); }); domUtils.on(me.document, "mousemove", mouseMoveEvent); domUtils.on(me.document, "mouseout", function (evt) { var target = evt.target || evt.srcElement; if (target.tagName == "TABLE") { toggleDraggableState(me, false, "", null); } }); /** * 表格隔行变色 */ me.addListener("interlacetable",function(type,table,classList){ if(!table) return; var me = this, rows = table.rows, len = rows.length, getClass = function(list,index,repeat){ return list[index] ? list[index] : repeat ? list[index % list.length]: ""; }; for(var i = 0;i 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex; var nextCell = ua.getTabNextCell(cell, currentRowIndex); if (nextCell) { if (isEmptyBlock(nextCell)) { range.setStart(nextCell, 0).setCursor(false, true) } else { range.selectNodeContents(nextCell).select() } } else { me.fireEvent('saveScene'); me.__hasEnterExecCommand = true; this.execCommand('insertrownext'); me.__hasEnterExecCommand = false; range = this.selection.getRange(); range.setStart(table.rows[table.rows.length - 1].cells[0], 0).setCursor(); me.fireEvent('saveScene'); } } return true; } }); browser.ie && me.addListener('selectionchange', function () { toggleDraggableState(this, false, "", null); }); me.addListener("keydown", function (type, evt) { var me = this; //处理在表格的最后一个输入tab产生新的表格 var keyCode = evt.keyCode || evt.which; if (keyCode == 8 || keyCode == 46) { return; } var notCtrlKey = !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); var ut = getUETableBySelected(me); if (!ut) return; notCtrlKey && ut.clearSelected(); }); me.addListener("beforegetcontent", function () { switchBorderColor(this, false); browser.ie && utils.each(this.document.getElementsByTagName('caption'), function (ci) { if (domUtils.isEmptyNode(ci)) { ci.innerHTML = ' ' } }); }); me.addListener("aftergetcontent", function () { switchBorderColor(this, true); }); me.addListener("getAllHtml", function () { removeSelectedClass(me.document.getElementsByTagName("td")); }); //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 me.addListener("fullscreenchanged", function (type, fullscreen) { if (!fullscreen) { var ratio = this.body.offsetWidth / document.body.offsetWidth, tables = domUtils.getElementsByTagName(this.body, "table"); utils.each(tables, function (table) { if (table.offsetWidth < me.body.offsetWidth) return false; var tds = domUtils.getElementsByTagName(table, "td"), backWidths = []; utils.each(tds, function (td) { backWidths.push(td.offsetWidth); }); for (var i = 0, td; td = tds[i]; i++) { td.setAttribute("width", Math.floor(backWidths[i] * ratio)); } table.setAttribute("width", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me)))) }); } }); //重写execCommand命令,用于处理框选时的处理 var oldExecCommand = me.execCommand; me.execCommand = function (cmd, datatat) { var me = this, args = arguments; cmd = cmd.toLowerCase(); var ut = getUETableBySelected(me), tds, range = new dom.Range(me.document), cmdFun = me.commands[cmd] || UE.commands[cmd], result; if (!cmdFun) return; if (ut && !commands[cmd] && !cmdFun.notNeedUndo && !me.__hasEnterExecCommand) { me.__hasEnterExecCommand = true; me.fireEvent("beforeexeccommand", cmd); tds = ut.selectedTds; var lastState = -2, lastValue = -2, value, state; for (var i = 0, td; td = tds[i]; i++) { if (isEmptyBlock(td)) { range.setStart(td, 0).setCursor(false, true) } else { range.selectNode(td).select(true); } state = me.queryCommandState(cmd); value = me.queryCommandValue(cmd); if (state != -1) { if (lastState !== state || lastValue !== value) { me._ignoreContentChange = true; result = oldExecCommand.apply(me, arguments); me._ignoreContentChange = false; } lastState = me.queryCommandState(cmd); lastValue = me.queryCommandValue(cmd); if (domUtils.isEmptyBlock(td)) { domUtils.fillNode(me.document, td) } } } range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); me.fireEvent('contentchange'); me.fireEvent("afterexeccommand", cmd); me.__hasEnterExecCommand = false; me._selectionChange(); } else { result = oldExecCommand.apply(me, arguments); } return result; }; }); /** * 删除obj的宽高style,改成属性宽高 * @param obj * @param replaceToProperty */ function removeStyleSize(obj, replaceToProperty) { removeStyle(obj, "width", true); removeStyle(obj, "height", true); } function removeStyle(obj, styleName, replaceToProperty) { if (obj.style[styleName]) { replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); obj.style[styleName] = ""; } } function getParentTdOrTh(ele) { if (ele.tagName == "TD" || ele.tagName == "TH") return ele; var td; if (td = domUtils.findParentByTagName(ele, "td", true) || domUtils.findParentByTagName(ele, "th", true)) return td; return null; } function isEmptyBlock(node) { var reg = new RegExp(domUtils.fillChar, 'g'); if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) { return 0; } for (var n in dtd.$isNotEmpty) { if (node.getElementsByTagName(n).length) { return 0; } } return 1; } function mouseCoords(evt) { if (evt.pageX || evt.pageY) { return { x:evt.pageX, y:evt.pageY }; } return { x:evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, y:evt.clientY + me.document.body.scrollTop - me.document.body.clientTop }; } function mouseMoveEvent(evt) { if( isEditorDisabled() ) { return; } try { //普通状态下鼠标移动 var target = getParentTdOrTh(evt.target || evt.srcElement), pos; //区分用户的行为是拖动还是双击 if( isInResizeBuffer ) { me.body.style.webkitUserSelect = 'none'; if( Math.abs( userActionStatus.x - evt.clientX ) > offsetOfTableCell || Math.abs( userActionStatus.y - evt.clientY ) > offsetOfTableCell ) { clearTableDragTimer(); isInResizeBuffer = false; singleClickState = 0; //drag action tableBorderDrag(evt); } } //修改单元格大小时的鼠标移动 if (onDrag && dragTd) { singleClickState = 0; me.body.style.webkitUserSelect = 'none'; me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); pos = mouseCoords(evt); toggleDraggableState(me, true, onDrag, pos, target); if (onDrag == "h") { dragLine.style.left = getPermissionX(dragTd, evt) + "px"; } else if (onDrag == "v") { dragLine.style.top = getPermissionY(dragTd, evt) + "px"; } return; } //当鼠标处于table上时,修改移动过程中的光标状态 if (target) { //针对使用table作为容器的组件不触发拖拽效果 if (me.fireEvent('excludetable', target) === true) return; pos = mouseCoords(evt); var state = getRelation(target, pos), table = domUtils.findParentByTagName(target, "table", true); if (inTableSide(table, target, evt, true)) { if (me.fireEvent("excludetable", table) === true) return; me.body.style.cursor = "url(" + me.options.cursorpath + "h.png),pointer"; } else if (inTableSide(table, target, evt)) { if (me.fireEvent("excludetable", table) === true) return; me.body.style.cursor = "url(" + me.options.cursorpath + "v.png),pointer"; } else { me.body.style.cursor = "text"; var curCell = target; if (/\d/.test(state)) { state = state.replace(/\d/, ''); target = getUETable(target).getPreviewCell(target, state == "v"); } //位于第一行的顶部或者第一列的左边时不可拖动 toggleDraggableState(me, target ? !!state : false, target ? state : '', pos, target); } } else { toggleDragButton(false, table, me); } } catch (e) { showError(e); } } var dragButtonTimer; function toggleDragButton(show, table, editor) { if (!show) { if (dragOver)return; dragButtonTimer = setTimeout(function () { !dragOver && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton); }, 2000); } else { createDragButton(table, editor); } } function createDragButton(table, editor) { var pos = domUtils.getXY(table), doc = table.ownerDocument; if (dragButton && dragButton.parentNode)return dragButton; dragButton = doc.createElement("div"); dragButton.contentEditable = false; dragButton.innerHTML = ""; dragButton.style.cssText = "width:15px;height:15px;background-image:url(" + editor.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (pos.y - 15) + "px;left:" + (pos.x) + "px;"; domUtils.unSelectable(dragButton); dragButton.onmouseover = function (evt) { dragOver = true; }; dragButton.onmouseout = function (evt) { dragOver = false; }; domUtils.on(dragButton, 'click', function (type, evt) { doClick(evt, this); }); domUtils.on(dragButton, 'dblclick', function (type, evt) { doDblClick(evt); }); domUtils.on(dragButton, 'dragstart', function (type, evt) { domUtils.preventDefault(evt); }); var timer; function doClick(evt, button) { // 部分浏览器下需要清理 clearTimeout(timer); timer = setTimeout(function () { editor.fireEvent("tableClicked", table, button); }, 300); } function doDblClick(evt) { clearTimeout(timer); var ut = getUETable(table), start = table.rows[0].cells[0], end = ut.getLastCell(), range = ut.getCellsRange(start, end); editor.selection.getRange().setStart(start, 0).setCursor(false, true); ut.setSelected(range); } doc.body.appendChild(dragButton); } // function inPosition(table, pos) { // var tablePos = domUtils.getXY(table), // width = table.offsetWidth, // height = table.offsetHeight; // if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { // return "topLeft"; // } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { // return "bottomRight"; // } // } function inTableSide(table, cell, evt, top) { var pos = mouseCoords(evt), state = getRelation(cell, pos); if (top) { var caption = table.getElementsByTagName("caption")[0], capHeight = caption ? caption.offsetHeight : 0; return (state == "v1") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8); } else { return (state == "h1") && ((pos.x - domUtils.getXY(table).x) < 8); } } /** * 获取拖动时允许的X轴坐标 * @param dragTd * @param evt */ function getPermissionX(dragTd, evt) { var ut = getUETable(dragTd); if (ut) { var preTd = ut.getSameEndPosCells(dragTd, "x")[0], nextTd = ut.getSameStartPosXCells(dragTd)[0], mouseX = mouseCoords(evt).x, left = (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20 , right = nextTd ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 : (me.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(me.body, "width"), 10)); left += cellMinWidth; right -= cellMinWidth; return mouseX < left ? left : mouseX > right ? right : mouseX; } } /** * 获取拖动时允许的Y轴坐标 */ function getPermissionY(dragTd, evt) { try { var top = domUtils.getXY(dragTd).y, mousePosY = mouseCoords(evt).y; return mousePosY < top ? top : mousePosY; } catch (e) { showError(e); } } /** * 移动状态切换 */ function toggleDraggableState(editor, draggable, dir, mousePos, cell) { try { editor.body.style.cursor = dir == "h" ? "col-resize" : dir == "v" ? "row-resize" : "text"; if (browser.ie) { if (dir && !mousedown && !getUETableBySelected(editor)) { getDragLine(editor, editor.document); showDragLineAt(dir, cell); } else { hideDragLine(editor) } } onBorder = draggable; } catch (e) { showError(e); } } /** * 获取与UETable相关的resize line * @param uetable UETable对象 */ function getResizeLineByUETable() { var lineId = '_UETableResizeLine', line = this.document.getElementById( lineId ); if( !line ) { line = this.document.createElement("div"); line.id = lineId; line.contnetEditable = false; line.setAttribute("unselectable", "on"); var styles = { width: 2*cellBorderWidth + 1 + 'px', position: 'absolute', 'z-index': 100000, cursor: 'col-resize', background: 'red', display: 'none' }; //切换状态 line.onmouseout = function(){ this.style.display = 'none'; }; utils.extend( line.style, styles ); this.document.body.appendChild( line ); } return line; } /** * 更新resize-line */ function updateResizeLine( cell, uetable ) { var line = getResizeLineByUETable.call( this ), table = uetable.table, styles = { top: domUtils.getXY( table ).y + 'px', left: domUtils.getXY( cell).x + cell.offsetWidth - cellBorderWidth + 'px', display: 'block', height: table.offsetHeight + 'px' }; utils.extend( line.style, styles ); } /** * 显示resize-line */ function showResizeLine( cell ) { var uetable = getUETable( cell ); updateResizeLine.call( this, cell, uetable ); } /** * 获取鼠标与当前单元格的相对位置 * @param ele * @param mousePos */ function getRelation(ele, mousePos) { var elePos = domUtils.getXY(ele); if( !elePos ) { return ''; } if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { return "h"; } if (mousePos.x - elePos.x < cellBorderWidth) { return 'h1' } if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { return "v"; } if (mousePos.y - elePos.y < cellBorderWidth) { return 'v1' } return ''; } function mouseDownEvent(type, evt) { if( isEditorDisabled() ) { return ; } userActionStatus = { x: evt.clientX, y: evt.clientY }; //右键菜单单独处理 if (evt.button == 2) { var ut = getUETableBySelected(me), flag = false; if (ut) { var td = getTargetTd(me, evt); utils.each(ut.selectedTds, function (ti) { if (ti === td) { flag = true; } }); if (!flag) { removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); ut.clearSelected() } else { td = ut.selectedTds[0]; setTimeout(function () { me.selection.getRange().setStart(td, 0).setCursor(false, true); }, 0); } } } else { tableClickHander( evt ); } } //清除表格的计时器 function clearTableTimer() { tabTimer && clearTimeout( tabTimer ); tabTimer = null; } //双击收缩 function tableDbclickHandler(evt) { singleClickState = 0; evt = evt || me.window.event; var target = getParentTdOrTh(evt.target || evt.srcElement); if (target) { var h; if (h = getRelation(target, mouseCoords(evt))) { hideDragLine( me ); if (h == 'h1') { h = 'h'; if (inTableSide(domUtils.findParentByTagName(target, "table"), target, evt)) { me.execCommand('adaptbywindow'); } else { target = getUETable(target).getPreviewCell(target); if (target) { var rng = me.selection.getRange(); rng.selectNodeContents(target).setCursor(true, true) } } } if (h == 'h') { var ut = getUETable(target), table = ut.table, cells = getCellsByMoveBorder( target, table, true ); cells = extractArray( cells, 'left' ); ut.width = ut.offsetWidth; var oldWidth = [], newWidth = []; utils.each( cells, function( cell ){ oldWidth.push( cell.offsetWidth ); } ); utils.each( cells, function( cell ){ cell.removeAttribute("width"); } ); window.setTimeout( function(){ //是否允许改变 var changeable = true; utils.each( cells, function( cell, index ){ var width = cell.offsetWidth; if( width > oldWidth[index] ) { changeable = false; return false; } newWidth.push( width ); } ); var change = changeable ? newWidth : oldWidth; utils.each( cells, function( cell, index ){ cell.width = change[index] - getTabcellSpace(); } ); }, 0 ); // minWidth -= cellMinWidth; // // table.removeAttribute("width"); // utils.each(cells, function (cell) { // cell.style.width = ""; // cell.width -= minWidth; // }); } } } } function tableClickHander( evt ) { removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); //trace:3113 //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 utils.each(me.document.getElementsByTagName('table'), function (t) { t.ueTable = null; }); startTd = getTargetTd(me, evt); if( !startTd ) return; var table = domUtils.findParentByTagName(startTd, "table", true); ut = getUETable(table); ut && ut.clearSelected(); //判断当前鼠标状态 if (!onBorder) { me.document.body.style.webkitUserSelect = ''; mousedown = true; me.addListener('mouseover', mouseOverEvent); } else { //边框上的动作处理 borderActionHandler( evt ); } } //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 function borderActionHandler( evt ) { if ( browser.ie ) { evt = reconstruct(evt ); } clearTableDragTimer(); //是否正在等待resize的缓冲中 isInResizeBuffer = true; tableDragTimer = setTimeout(function(){ tableBorderDrag( evt ); }, dblclickTime); } function extractArray( originArr, key ) { var result = [], tmp = null; for( var i = 0, len = originArr.length; i 0 && singleClickState--; }, dblclickTime ); if( singleClickState === 2 ) { singleClickState = 0; tableDbclickHandler(evt); return; } } if (evt.button == 2)return; var me = this; //清除表格上原生跨选问题 var range = me.selection.getRange(), start = domUtils.findParentByTagName(range.startContainer, 'table', true), end = domUtils.findParentByTagName(range.endContainer, 'table', true); if (start || end) { if (start === end) { start = domUtils.findParentByTagName(range.startContainer, ['td', 'th', 'caption'], true); end = domUtils.findParentByTagName(range.endContainer, ['td', 'th', 'caption'], true); if (start !== end) { me.selection.clearRange() } } else { me.selection.clearRange() } } mousedown = false; me.document.body.style.webkitUserSelect = ''; //拖拽状态下的mouseUP if ( onDrag && dragTd ) { me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); singleClickState = 0; dragLine = me.document.getElementById('ue_tableDragLine'); // trace 3973 if (dragLine) { var dragTdPos = domUtils.getXY(dragTd), dragLinePos = domUtils.getXY(dragLine); switch (onDrag) { case "h": changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); break; case "v": changeRowHeight(dragTd, dragLinePos.y - dragTdPos.y - dragTd.offsetHeight); break; default: } onDrag = ""; dragTd = null; hideDragLine(me); me.fireEvent('saveScene'); return; } } //正常状态下的mouseup if (!startTd) { var target = domUtils.findParentByTagName(evt.target || evt.srcElement, "td", true); if (!target) target = domUtils.findParentByTagName(evt.target || evt.srcElement, "th", true); if (target && (target.tagName == "TD" || target.tagName == "TH")) { if (me.fireEvent("excludetable", target) === true) return; range = new dom.Range(me.document); range.setStart(target, 0).setCursor(false, true); } } else { var ut = getUETable(startTd), cell = ut ? ut.selectedTds[0] : null; if (cell) { range = new dom.Range(me.document); if (domUtils.isEmptyBlock(cell)) { range.setStart(cell, 0).setCursor(false, true); } else { range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true); } } else { range = me.selection.getRange().shrinkBoundary(); if (!range.collapsed) { var start = domUtils.findParentByTagName(range.startContainer, ['td', 'th'], true), end = domUtils.findParentByTagName(range.endContainer, ['td', 'th'], true); //在table里边的不能清除 if (start && !end || !start && end || start && end && start !== end) { range.setCursor(false, true); } } } startTd = null; me.removeListener('mouseover', mouseOverEvent); } me._selectionChange(250, evt); } function mouseOverEvent(type, evt) { if( isEditorDisabled() ) { return; } var me = this, tar = evt.target || evt.srcElement; currentTd = domUtils.findParentByTagName(tar, "td", true) || domUtils.findParentByTagName(tar, "th", true); //需要判断两个TD是否位于同一个表格内 if (startTd && currentTd && ((startTd.tagName == "TD" && currentTd.tagName == "TD") || (startTd.tagName == "TH" && currentTd.tagName == "TH")) && domUtils.findParentByTagName(startTd, 'table') == domUtils.findParentByTagName(currentTd, 'table')) { var ut = getUETable(currentTd); if (startTd != currentTd) { me.document.body.style.webkitUserSelect = 'none'; me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); var range = ut.getCellsRange(startTd, currentTd); ut.setSelected(range); } else { me.document.body.style.webkitUserSelect = ''; ut.clearSelected(); } } evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); } function setCellHeight(cell, height, backHeight) { var lineHight = parseInt(domUtils.getComputedStyle(cell, "line-height"), 10), tmpHeight = backHeight + height; height = tmpHeight < lineHight ? lineHight : tmpHeight; if (cell.style.height) cell.style.height = ""; cell.rowSpan == 1 ? cell.setAttribute("height", height) : (cell.removeAttribute && cell.removeAttribute("height")); } function getWidth(cell) { if (!cell)return 0; return parseInt(domUtils.getComputedStyle(cell, "width"), 10); } function changeColWidth(cell, changeValue) { var ut = getUETable(cell); if (ut) { //根据当前移动的边框获取相关的单元格 var table = ut.table, cells = getCellsByMoveBorder( cell, table ); table.style.width = ""; table.removeAttribute("width"); //修正改变量 changeValue = correctChangeValue( changeValue, cell, cells ); if (cell.nextSibling) { var i=0; utils.each( cells, function( cellGroup ){ cellGroup.left.width = (+cellGroup.left.width)+changeValue; cellGroup.right && ( cellGroup.right.width = (+cellGroup.right.width)-changeValue ); } ); } else { utils.each( cells, function( cellGroup ){ cellGroup.left.width -= -changeValue; } ); } } } function isEditorDisabled() { return me.body.contentEditable === "false"; } function changeRowHeight(td, changeValue) { if (Math.abs(changeValue) < 10) return; var ut = getUETable(td); if (ut) { var cells = ut.getSameEndPosCells(td, "y"), //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 backHeight = cells[0] ? cells[0].offsetHeight : 0; for (var i = 0, cell; cell = cells[i++];) { setCellHeight(cell, changeValue, backHeight); } } } /** * 获取调整单元格大小的相关单元格 * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 */ function getCellsByMoveBorder( cell, table, isContainMergeCell ) { if( !table ) { table = domUtils.findParentByTagName( cell, 'table' ); } if( !table ) { return null; } //获取到该单元格所在行的序列号 var index = domUtils.getNodeIndex( cell ), temp = cell, rows = table.rows, colIndex = 0; while( temp ) { //获取到当前单元格在未发生单元格合并时的序列 if( temp.nodeType === 1 ) { colIndex += (temp.colSpan || 1); } temp = temp.previousSibling; } temp = null; //记录想关的单元格 var borderCells = []; utils.each(rows, function( tabRow ){ var cells = tabRow.cells, currIndex = 0; utils.each( cells, function( tabCell ){ currIndex += (tabCell.colSpan || 1); if( currIndex === colIndex ) { borderCells.push({ left: tabCell, right: tabCell.nextSibling || null }); return false; } else if( currIndex > colIndex ) { if( isContainMergeCell ) { borderCells.push({ left: tabCell }); } return false; } } ); }); return borderCells; } /** * 通过给定的单元格集合获取最小的单元格width */ function getMinWidthByTableCells( cells ) { var minWidth = Number.MAX_VALUE; for( var i = 0, curCell; curCell = cells[ i ] ; i++ ) { minWidth = Math.min( minWidth, curCell.width || getTableCellWidth( curCell ) ); } return minWidth; } function correctChangeValue( changeValue, relatedCell, cells ) { //为单元格的paading预留空间 changeValue -= getTabcellSpace(); if( changeValue < 0 ) { return 0; } changeValue -= getTableCellWidth( relatedCell ); //确定方向 var direction = changeValue < 0 ? 'left':'right'; changeValue = Math.abs(changeValue); //只关心非最后一个单元格就可以 utils.each( cells, function( cellGroup ){ var curCell = cellGroup[direction]; //为单元格保留最小空间 if( curCell ) { changeValue = Math.min( changeValue, getTableCellWidth( curCell )-cellMinWidth ); } } ); //修正越界 changeValue = changeValue < 0 ? 0 : changeValue; return direction === 'left' ? -changeValue : changeValue; } function getTableCellWidth( cell ) { var width = 0, //偏移纠正量 offset = 0, width = cell.offsetWidth - getTabcellSpace(); //最后一个节点纠正一下 if( !cell.nextSibling ) { width -= getTableCellOffset( cell ); } width = width < 0 ? 0 : width; try { cell.width = width; } catch(e) { } return width; } /** * 获取单元格所在表格的最末单元格的偏移量 */ function getTableCellOffset( cell ) { tab = domUtils.findParentByTagName( cell, "table", false); if( tab.offsetVal === undefined ) { var prev = cell.previousSibling; if( prev ) { //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth ? UT.borderWidth : 0; } else { tab.offsetVal = 0; } } return tab.offsetVal; } function getTabcellSpace() { if( UT.tabcellSpace === undefined ) { var cell = null, tab = me.document.createElement("table"), tbody = me.document.createElement("tbody"), trow = me.document.createElement("tr"), tabcell = me.document.createElement("td"), mirror = null; tabcell.style.cssText = 'border: 0;'; tabcell.width = 1; trow.appendChild( tabcell ); trow.appendChild( mirror = tabcell.cloneNode( false ) ); tbody.appendChild( trow ); tab.appendChild( tbody ); tab.style.cssText = "visibility: hidden;"; me.body.appendChild( tab ); UT.paddingSpace = tabcell.offsetWidth - 1; var tmpTabWidth = tab.offsetWidth; tabcell.style.cssText = ''; mirror.style.cssText = ''; UT.borderWidth = ( tab.offsetWidth - tmpTabWidth ) / 3; UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; me.body.removeChild( tab ); } getTabcellSpace = function(){ return UT.tabcellSpace; }; return UT.tabcellSpace; } function getDragLine(editor, doc) { if (mousedown)return; dragLine = editor.document.createElement("div"); domUtils.setAttributes(dragLine, { id:"ue_tableDragLine", unselectable:'on', contenteditable:false, 'onresizestart':'return false', 'ondragstart':'return false', 'onselectstart':'return false', style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" }); editor.body.appendChild(dragLine); } function hideDragLine(editor) { if (mousedown)return; var line; while (line = editor.document.getElementById('ue_tableDragLine')) { domUtils.remove(line) } } /** * 依据state(v|h)在cell位置显示横线 * @param state * @param cell */ function showDragLineAt(state, cell) { if (!cell) return; var table = domUtils.findParentByTagName(cell, "table"), caption = table.getElementsByTagName('caption'), width = table.offsetWidth, height = table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), tablePos = domUtils.getXY(table), cellPos = domUtils.getXY(cell), css; switch (state) { case "h": css = 'height:' + height + 'px;top:' + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + 'px;left:' + (cellPos.x + cell.offsetWidth); dragLine.style.cssText = css + 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)'; break; case "v": css = 'width:' + width + 'px;left:' + tablePos.x + 'px;top:' + (cellPos.y + cell.offsetHeight ); //必须加上border:0和color:blue,否则低版ie不支持背景色显示 dragLine.style.cssText = css + 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)'; break; default: } } /** * 当表格边框颜色为白色时设置为虚线,true为添加虚线 * @param editor * @param flag */ function switchBorderColor(editor, flag) { var tableArr = domUtils.getElementsByTagName(editor.body, "table"), color; for (var i = 0, node; node = tableArr[i++];) { var td = domUtils.getElementsByTagName(node, "td"); if (td[0]) { if (flag) { color = (td[0].style.borderColor).replace(/\s/g, ""); if (/(#ffffff)|(rgb\(255,255,255\))/ig.test(color)) domUtils.addClass(node, "noBorderTable") } else { domUtils.removeClasses(node, "noBorderTable") } } } } function getTableWidth(editor, needIEHack, defaultValue) { var body = editor.body; return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); } /** * 获取当前拖动的单元格 */ function getTargetTd(editor, evt) { var target = domUtils.findParentByTagName(evt.target || evt.srcElement, ["td", "th"], true), dir = null; if( !target ) { return null; } dir = getRelation( target, mouseCoords( evt ) ); //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td if( !target ) { return null; } if( dir === 'h1' && target.previousSibling ) { var position = domUtils.getXY( target), cellWidth = target.offsetWidth; if( Math.abs( position.x + cellWidth - evt.clientX ) > cellWidth / 3 ) { target = target.previousSibling; } } else if( dir === 'v1' && target.parentNode.previousSibling ) { var position = domUtils.getXY( target), cellHeight = target.offsetHeight; if( Math.abs( position.y + cellHeight - evt.clientY ) > cellHeight / 3 ) { target = target.parentNode.previousSibling.firstChild; } } //排除了非td内部以及用于代码高亮部分的td return target && !(editor.fireEvent("excludetable", target) === true) ? target : null; } }; // plugins/table.sort.js /** * Created with JetBrains PhpStorm. * User: Jinqn * Date: 13-10-12 * Time: 上午10:20 * To change this template use File | Settings | File Templates. */ UE.UETable.prototype.sortTable = function (sortByCellIndex, compareFn) { var table = this.table, rows = table.rows, trArray = [], flag = rows[0].cells[0].tagName === "TH", lastRowIndex = 0; if(this.selectedTds.length){ var range = this.cellsRange, len = range.endRowIndex + 1; for (var i = range.beginRowIndex; i < len; i++) { trArray[i] = rows[i]; } trArray.splice(0,range.beginRowIndex); lastRowIndex = (range.endRowIndex +1) === this.rowsNum ? 0 : range.endRowIndex +1; }else{ for (var i = 0,len = rows.length; i < len; i++) { trArray[i] = rows[i]; } } var Fn = { 'reversecurrent': function(td1,td2){ return 1; }, 'orderbyasc': function(td1,td2){ var value1 = td1.innerText||td1.textContent, value2 = td2.innerText||td2.textContent; return value1.localeCompare(value2); }, 'reversebyasc': function(td1,td2){ var value1 = td1.innerHTML, value2 = td2.innerHTML; return value2.localeCompare(value1); }, 'orderbynum': function(td1,td2){ var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); if(value1) value1 = +value1[0]; if(value2) value2 = +value2[0]; return (value1||0) - (value2||0); }, 'reversebynum': function(td1,td2){ var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); if(value1) value1 = +value1[0]; if(value2) value2 = +value2[0]; return (value2||0) - (value1||0); } }; //对表格设置排序的标记data-sort-type table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); //th不参与排序 flag && trArray.splice(0, 1); trArray = utils.sort(trArray,function (tr1, tr2) { var result; if (compareFn && typeof compareFn === "function") { result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); } else if (compareFn && typeof compareFn === "number") { result = 1; } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); } else { result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); } return result; }); var fragment = table.ownerDocument.createDocumentFragment(); for (var j = 0, len = trArray.length; j < len; j++) { fragment.appendChild(trArray[j]); } var tbody = table.getElementsByTagName("tbody")[0]; if(!lastRowIndex){ tbody.appendChild(fragment); }else{ tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) } }; UE.plugins['tablesort'] = function () { var me = this, UT = UE.UETable, getUETable = function (tdOrTable) { return UT.getUETable(tdOrTable); }, getTableItemsByRange = function (editor) { return UT.getTableItemsByRange(editor); }; me.ready(function () { //添加表格可排序的样式 utils.cssRule('tablesort', 'table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;' + ' background-image:url(' + me.options.themePath + me.options.theme + '/images/sortable.png);}', me.document); //做单元格合并操作时,清除可排序标识 me.addListener("afterexeccommand", function (type, cmd) { if( cmd == 'mergeright' || cmd == 'mergedown' || cmd == 'mergecells') { this.execCommand('disablesort'); } }); }); //表格排序 UE.commands['sorttable'] = { queryCommandState: function () { var me = this, tableItems = getTableItemsByRange(me); if (!tableItems.cell) return -1; var table = tableItems.table, cells = table.getElementsByTagName("td"); for (var i = 0, cell; cell = cells[i++];) { if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; } return 0; }, execCommand: function (cmd, fn) { var me = this, range = me.selection.getRange(), bk = range.createBookmark(true), tableItems = getTableItemsByRange(me), cell = tableItems.cell, ut = getUETable(tableItems.table), cellInfo = ut.getCellInfo(cell); ut.sortTable(cellInfo.cellIndex, fn); range.moveToBookmark(bk); try{ range.select(); }catch(e){} } }; //设置表格可排序,清除表格可排序 UE.commands["enablesort"] = UE.commands["disablesort"] = { queryCommandState: function (cmd) { var table = getTableItemsByRange(this).table; if(table && cmd=='enablesort') { var cells = domUtils.getElementsByTagName(table, 'th td'); for(var i = 0; i1 || cells[i].getAttribute('rowspan')>1) return -1; } } return !table ? -1: cmd=='enablesort' ^ table.getAttribute('data-sort')!='sortEnabled' ? -1:0; }, execCommand: function (cmd) { var table = getTableItemsByRange(this).table; table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled"); table.setAttribute("style", "border-collapse:collapse;"); cmd == "enablesort" ? domUtils.addClass(table,"sortEnabled"):domUtils.removeClasses(table,"sortEnabled"); } }; }; // plugins/contextmenu.js ///import core ///commands 右键菜单 ///commandsName ContextMenu ///commandsTitle 右键菜单 /** * 右键菜单 * @function * @name baidu.editor.plugins.contextmenu * @author zhanyi */ UE.plugins['contextmenu'] = function () { var me = this; me.setOpt('enableContextMenu',true); if(me.getOpt('enableContextMenu') === false){ return; } var lang = me.getLang( "contextMenu" ), menu, items = me.options.contextMenu || [ {label:lang['selectall'], cmdName:'selectall'}, { label:lang.cleardoc, cmdName:'cleardoc', exec:function () { if ( confirm( lang.confirmclear ) ) { this.execCommand( 'cleardoc' ); } } }, '-', { label:lang.unlink, cmdName:'unlink' }, '-', { group:lang.paragraph, icon:'justifyjustify', subMenu:[ { label:lang.justifyleft, cmdName:'justify', value:'left' }, { label:lang.justifyright, cmdName:'justify', value:'right' }, { label:lang.justifycenter, cmdName:'justify', value:'center' }, { label:lang.justifyjustify, cmdName:'justify', value:'justify' } ] }, '-', { group:lang.table, icon:'table', subMenu:[ { label:lang.inserttable, cmdName:'inserttable' }, { label:lang.deletetable, cmdName:'deletetable' }, '-', { label:lang.deleterow, cmdName:'deleterow' }, { label:lang.deletecol, cmdName:'deletecol' }, { label:lang.insertcol, cmdName:'insertcol' }, { label:lang.insertcolnext, cmdName:'insertcolnext' }, { label:lang.insertrow, cmdName:'insertrow' }, { label:lang.insertrownext, cmdName:'insertrownext' }, '-', { label:lang.insertcaption, cmdName:'insertcaption' }, { label:lang.deletecaption, cmdName:'deletecaption' }, { label:lang.inserttitle, cmdName:'inserttitle' }, { label:lang.deletetitle, cmdName:'deletetitle' }, { label:lang.inserttitlecol, cmdName:'inserttitlecol' }, { label:lang.deletetitlecol, cmdName:'deletetitlecol' }, '-', { label:lang.mergecells, cmdName:'mergecells' }, { label:lang.mergeright, cmdName:'mergeright' }, { label:lang.mergedown, cmdName:'mergedown' }, '-', { label:lang.splittorows, cmdName:'splittorows' }, { label:lang.splittocols, cmdName:'splittocols' }, { label:lang.splittocells, cmdName:'splittocells' }, '-', { label:lang.averageDiseRow, cmdName:'averagedistributerow' }, { label:lang.averageDisCol, cmdName:'averagedistributecol' }, '-', { label:lang.edittd, cmdName:'edittd', exec:function () { if ( UE.ui['edittd'] ) { new UE.ui['edittd']( this ); } this.getDialog('edittd').open(); } }, { label:lang.edittable, cmdName:'edittable', exec:function () { if ( UE.ui['edittable'] ) { new UE.ui['edittable']( this ); } this.getDialog('edittable').open(); } }, { label:lang.setbordervisible, cmdName:'setbordervisible' } ] }, { group:lang.tablesort, icon:'tablesort', subMenu:[ { label:lang.enablesort, cmdName:'enablesort' }, { label:lang.disablesort, cmdName:'disablesort' }, '-', { label:lang.reversecurrent, cmdName:'sorttable', value:'reversecurrent' }, { label:lang.orderbyasc, cmdName:'sorttable', value:'orderbyasc' }, { label:lang.reversebyasc, cmdName:'sorttable', value:'reversebyasc' }, { label:lang.orderbynum, cmdName:'sorttable', value:'orderbynum' }, { label:lang.reversebynum, cmdName:'sorttable', value:'reversebynum' } ] }, { group:lang.borderbk, icon:'borderBack', subMenu:[ { label:lang.setcolor, cmdName:"interlacetable", exec:function(){ this.execCommand("interlacetable"); } }, { label:lang.unsetcolor, cmdName:"uninterlacetable", exec:function(){ this.execCommand("uninterlacetable"); } }, { label:lang.setbackground, cmdName:"settablebackground", exec:function(){ this.execCommand("settablebackground",{repeat:true,colorList:["#bbb","#ccc"]}); } }, { label:lang.unsetbackground, cmdName:"cleartablebackground", exec:function(){ this.execCommand("cleartablebackground"); } }, { label:lang.redandblue, cmdName:"settablebackground", exec:function(){ this.execCommand("settablebackground",{repeat:true,colorList:["red","blue"]}); } }, { label:lang.threecolorgradient, cmdName:"settablebackground", exec:function(){ this.execCommand("settablebackground",{repeat:true,colorList:["#aaa","#bbb","#ccc"]}); } } ] }, { group:lang.aligntd, icon:'aligntd', subMenu:[ { cmdName:'cellalignment', value:{align:'left',vAlign:'top'} }, { cmdName:'cellalignment', value:{align:'center',vAlign:'top'} }, { cmdName:'cellalignment', value:{align:'right',vAlign:'top'} }, { cmdName:'cellalignment', value:{align:'left',vAlign:'middle'} }, { cmdName:'cellalignment', value:{align:'center',vAlign:'middle'} }, { cmdName:'cellalignment', value:{align:'right',vAlign:'middle'} }, { cmdName:'cellalignment', value:{align:'left',vAlign:'bottom'} }, { cmdName:'cellalignment', value:{align:'center',vAlign:'bottom'} }, { cmdName:'cellalignment', value:{align:'right',vAlign:'bottom'} } ] }, { group:lang.aligntable, icon:'aligntable', subMenu:[ { cmdName:'tablealignment', className: 'left', label:lang.tableleft, value:"left" }, { cmdName:'tablealignment', className: 'center', label:lang.tablecenter, value:"center" }, { cmdName:'tablealignment', className: 'right', label:lang.tableright, value:"right" } ] }, '-', { label:lang.insertparagraphbefore, cmdName:'insertparagraph', value:true }, { label:lang.insertparagraphafter, cmdName:'insertparagraph' }, { label:lang['copy'], cmdName:'copy' }, { label:lang['paste'], cmdName:'paste' } ]; if ( !items.length ) { return; } var uiUtils = UE.ui.uiUtils; me.addListener( 'contextmenu', function ( type, evt ) { var offset = uiUtils.getViewportOffsetByEvent( evt ); me.fireEvent( 'beforeselectionchange' ); if ( menu ) { menu.destroy(); } for ( var i = 0, ti, contextItems = []; ti = items[i]; i++ ) { var last; (function ( item ) { if ( item == '-' ) { if ( (last = contextItems[contextItems.length - 1 ] ) && last !== '-' ) { contextItems.push( '-' ); } } else if ( item.hasOwnProperty( "group" ) ) { for ( var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++ ) { (function ( subItem ) { if ( subItem == '-' ) { if ( (last = subMenu[subMenu.length - 1 ] ) && last !== '-' ) { subMenu.push( '-' ); }else{ subMenu.splice(subMenu.length-1); } } else { if ( (me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) && (subItem.query ? subItem.query() : me.queryCommandState( subItem.cmdName )) > -1 ) { subMenu.push( { 'label':subItem.label || me.getLang( "contextMenu." + subItem.cmdName + (subItem.value || '') )||"", 'className':'edui-for-' +subItem.cmdName + ( subItem.className ? ( ' edui-for-' + subItem.cmdName + '-' + subItem.className ) : '' ), onclick:subItem.exec ? function () { subItem.exec.call( me ); } : function () { me.execCommand( subItem.cmdName, subItem.value ); } } ); } } })( cj ); } if ( subMenu.length ) { function getLabel(){ switch (item.icon){ case "table": return me.getLang( "contextMenu.table" ); case "justifyjustify": return me.getLang( "contextMenu.paragraph" ); case "aligntd": return me.getLang("contextMenu.aligntd"); case "aligntable": return me.getLang("contextMenu.aligntable"); case "tablesort": return lang.tablesort; case "borderBack": return lang.borderbk; default : return ''; } } contextItems.push( { //todo 修正成自动获取方式 'label':getLabel(), className:'edui-for-' + item.icon, 'subMenu':{ items:subMenu, editor:me } } ); } } else { //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 if ( (me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) && (item.query ? item.query.call(me) : me.queryCommandState( item.cmdName )) > -1 ) { contextItems.push( { 'label':item.label || me.getLang( "contextMenu." + item.cmdName ), className:'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')), onclick:item.exec ? function () { item.exec.call( me ); } : function () { me.execCommand( item.cmdName, item.value ); } } ); } } })( ti ); } if ( contextItems[contextItems.length - 1] == '-' ) { contextItems.pop(); } menu = new UE.ui.Menu( { items:contextItems, className:"edui-contextmenu", editor:me } ); menu.render(); menu.showAt( offset ); me.fireEvent("aftershowcontextmenu",menu); domUtils.preventDefault( evt ); if ( browser.ie ) { var ieRange; try { ieRange = me.selection.getNative().createRange(); } catch ( e ) { return; } if ( ieRange.item ) { var range = new dom.Range( me.document ); range.selectNode( ieRange.item( 0 ) ).select( true, true ); } } }); // 添加复制的flash按钮 me.addListener('aftershowcontextmenu', function(type, menu) { if (me.zeroclipboard) { var items = menu.items; for (var key in items) { if (items[key].className == 'edui-for-copy') { me.zeroclipboard.clip(items[key].getDom()); } } } }); }; // plugins/shortcutmenu.js ///import core ///commands 弹出菜单 // commandsName popupmenu ///commandsTitle 弹出菜单 /** * 弹出菜单 * @function * @name baidu.editor.plugins.popupmenu * @author xuheng */ UE.plugins['shortcutmenu'] = function () { var me = this, menu, items = me.options.shortcutMenu || []; if (!items.length) { return; } me.addListener ('contextmenu mouseup' , function (type , e) { var me = this, customEvt = { type : type , target : e.target || e.srcElement , screenX : e.screenX , screenY : e.screenY , clientX : e.clientX , clientY : e.clientY }; setTimeout (function () { var rng = me.selection.getRange (); if (rng.collapsed === false || type == "contextmenu") { if (!menu) { menu = new baidu.editor.ui.ShortCutMenu ({ editor : me , items : items , theme : me.options.theme , className : 'edui-shortcutmenu' }); menu.render (); me.fireEvent ("afterrendershortcutmenu" , menu); } menu.show (customEvt , !!UE.plugins['contextmenu']); } }); if (type == 'contextmenu') { domUtils.preventDefault (e); if (browser.ie9below) { var ieRange; try { ieRange = me.selection.getNative().createRange(); } catch (e) { return; } if (ieRange.item) { var range = new dom.Range (me.document); range.selectNode (ieRange.item (0)).select (true , true); } } } }); me.addListener ('keydown' , function (type) { if (type == "keydown") { menu && !menu.isHidden && menu.hide (); } }); }; // plugins/basestyle.js /** * B、I、sub、super命令支持 * @file * @since 1.2.6.1 */ UE.plugins['basestyle'] = function(){ /** * 字体加粗 * @command bold * @param { String } cmd 命令字符串 * @remind 对已加粗的文本内容执行该命令, 将取消加粗 * @method execCommand * @example * ```javascript * //editor是编辑器实例 * //对当前选中的文本内容执行加粗操作 * //第一次执行, 文本内容加粗 * editor.execCommand( 'bold' ); * * //第二次执行, 文本内容取消加粗 * editor.execCommand( 'bold' ); * ``` */ /** * 字体倾斜 * @command italic * @method execCommand * @param { String } cmd 命令字符串 * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 * @example * ```javascript * //editor是编辑器实例 * //对当前选中的文本内容执行斜体操作 * //第一次操作, 文本内容将变成斜体 * editor.execCommand( 'italic' ); * * //再次对同一文本内容执行, 则文本内容将恢复正常 * editor.execCommand( 'italic' ); * ``` */ /** * 下标文本,与“superscript”命令互斥 * @command subscript * @method execCommand * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 * @param { String } cmd 命令字符串 * @example * ```javascript * //editor是编辑器实例 * //对当前选中的文本内容执行下标操作 * //第一次操作, 文本内容将变成下标文本 * editor.execCommand( 'subscript' ); * * //再次对同一文本内容执行, 则文本内容将恢复正常 * editor.execCommand( 'subscript' ); * ``` */ /** * 上标文本,与“subscript”命令互斥 * @command superscript * @method execCommand * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 * @param { String } cmd 命令字符串 * @example * ```javascript * //editor是编辑器实例 * //对当前选中的文本内容执行上标操作 * //第一次操作, 文本内容将变成上标文本 * editor.execCommand( 'superscript' ); * * //再次对同一文本内容执行, 则文本内容将恢复正常 * editor.execCommand( 'superscript' ); * ``` */ var basestyles = { 'bold':['strong','b'], 'italic':['em','i'], 'subscript':['sub'], 'superscript':['sup'] }, getObj = function(editor,tagNames){ return domUtils.filterNodeList(editor.selection.getStartElementPath(),tagNames); }, me = this; //添加快捷键 me.addshortcutkey({ "Bold" : "ctrl+66",//^B "Italic" : "ctrl+73", //^I "Underline" : "ctrl+85"//^U }); me.addInputRule(function(root){ utils.each(root.getNodesByTagName('b i'),function(node){ switch (node.tagName){ case 'b': node.tagName = 'strong'; break; case 'i': node.tagName = 'em'; } }); }); for ( var style in basestyles ) { (function( cmd, tagNames ) { me.commands[cmd] = { execCommand : function( cmdName ) { var range = me.selection.getRange(),obj = getObj(this,tagNames); if ( range.collapsed ) { if ( obj ) { var tmpText = me.document.createTextNode(''); range.insertNode( tmpText ).removeInlineStyle( tagNames ); range.setStartBefore(tmpText); domUtils.remove(tmpText); } else { var tmpNode = range.document.createElement( tagNames[0] ); if(cmdName == 'superscript' || cmdName == 'subscript'){ tmpText = me.document.createTextNode(''); range.insertNode(tmpText) .removeInlineStyle(['sub','sup']) .setStartBefore(tmpText) .collapse(true); } range.insertNode( tmpNode ).setStart( tmpNode, 0 ); } range.collapse( true ); } else { if(cmdName == 'superscript' || cmdName == 'subscript'){ if(!obj || obj.tagName.toLowerCase() != cmdName){ range.removeInlineStyle(['sub','sup']); } } obj ? range.removeInlineStyle( tagNames ) : range.applyInlineStyle( tagNames[0] ); } range.select(); }, queryCommandState : function() { return getObj(this,tagNames) ? 1 : 0; } }; })( style, basestyles[style] ); } }; // plugins/elementpath.js /** * 选取路径命令 * @file */ UE.plugins['elementpath'] = function(){ var currentLevel, tagNames, me = this; me.setOpt('elementPathEnabled',true); if(!me.options.elementPathEnabled){ return; } me.commands['elementpath'] = { execCommand : function( cmdName, level ) { var start = tagNames[level], range = me.selection.getRange(); currentLevel = level*1; range.selectNode(start).select(); }, queryCommandValue : function() { //产生一个副本,不能修改原来的startElementPath; var parents = [].concat(this.selection.getStartElementPath()).reverse(), names = []; tagNames = parents; for(var i=0,ci;ci=parents[i];i++){ if(ci.nodeType == 3) { continue; } var name = ci.tagName.toLowerCase(); if(name == 'img' && ci.getAttribute('anchorname')){ name = 'anchor'; } names[i] = name; if(currentLevel == i){ currentLevel = -1; break; } } return names; } }; }; // plugins/formatmatch.js /** * 格式刷,只格式inline的 * @file * @since 1.2.6.1 */ /** * 格式刷 * @command formatmatch * @method execCommand * @remind 该操作不能复制段落格式 * @param { String } cmd 命令字符串 * @example * ```javascript * //editor是编辑器实例 * //获取格式刷 * editor.execCommand( 'formatmatch' ); * ``` */ UE.plugins['formatmatch'] = function(){ var me = this, list = [],img, flag = 0; me.addListener('reset',function(){ list = []; flag = 0; }); function addList(type,evt){ if(browser.webkit){ var target = evt.target.tagName == 'IMG' ? evt.target : null; } function addFormat(range){ if(text){ range.selectNode(text); } return range.applyInlineStyle(list[list.length-1].tagName,null,list); } me.undoManger && me.undoManger.save(); var range = me.selection.getRange(), imgT = target || range.getClosedNode(); if(img && imgT && imgT.tagName == 'IMG'){ //trace:964 imgT.style.cssText += ';float:' + (img.style.cssFloat || img.style.styleFloat ||'none') + ';display:' + (img.style.display||'inline'); img = null; }else{ if(!img){ var collapsed = range.collapsed; if(collapsed){ var text = me.document.createTextNode('match'); range.insertNode(text).select(); } me.__hasEnterExecCommand = true; //不能把block上的属性干掉 //trace:1553 var removeFormatAttributes = me.options.removeFormatAttributes; me.options.removeFormatAttributes = ''; me.execCommand('removeformat'); me.options.removeFormatAttributes = removeFormatAttributes; me.__hasEnterExecCommand = false; //trace:969 range = me.selection.getRange(); if(list.length){ addFormat(range); } if(text){ range.setStartBefore(text).collapse(true); } range.select(); text && domUtils.remove(text); } } me.undoManger && me.undoManger.save(); me.removeListener('mouseup',addList); flag = 0; } me.commands['formatmatch'] = { execCommand : function( cmdName ) { if(flag){ flag = 0; list = []; me.removeListener('mouseup',addList); return; } var range = me.selection.getRange(); img = range.getClosedNode(); if(!img || img.tagName != 'IMG'){ range.collapse(true).shrinkBoundary(); var start = range.startContainer; list = domUtils.findParents(start,true,function(node){ return !domUtils.isBlockElm(node) && node.nodeType == 1; }); //a不能加入格式刷, 并且克隆节点 for(var i=0,ci;ci=list[i];i++){ if(ci.tagName == 'A'){ list.splice(i,1); break; } } } me.addListener('mouseup',addList); flag = 1; }, queryCommandState : function() { return flag; }, notNeedUndo : 1 }; }; // plugins/searchreplace.js ///import core ///commands 查找替换 ///commandsName SearchReplace ///commandsTitle 查询替换 ///commandsDialog dialogs\searchreplace /** * @description 查找替换 * @author zhanyi */ UE.plugin.register('searchreplace',function(){ var me = this; var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1}; function findTextInString(textContent,opt,currentIndex){ var str = opt.searchStr; if(opt.dir == -1){ textContent = textContent.split('').reverse().join(''); str = str.split('').reverse().join(''); currentIndex = textContent.length - currentIndex; } var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match; while(match = reg.exec(textContent)){ if(match.index >= currentIndex){ return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index; } } return -1 } function findTextBlockElm(node,currentIndex,opt){ var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode'; if(domUtils.isBody(node)){ node = node.firstChild; } var first = 1; while(node){ textContent = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']; index = findTextInString(textContent,opt,currentIndex ); first = 0; if(index!=-1){ return { 'node':node, 'index':index } } node = domUtils[methodName](node); while(node && _blockElm[node.nodeName.toLowerCase()]){ node = domUtils[methodName](node,true); } if(node){ currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']).length : 0; } } } function findNTextInBlockElm(node,index,str){ var currentIndex = 0, currentNode = node.firstChild, currentNodeLength = 0, result; while(currentNode){ if(currentNode.nodeType == 3){ currentNodeLength = currentNode.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length; currentIndex += currentNodeLength; if(currentIndex >= index){ return { 'node':currentNode, 'index': currentNodeLength - (currentIndex - index) } } }else if(!dtd.$empty[currentNode.tagName]){ currentNodeLength = currentNode[browser.ie ? 'innerText' : 'textContent'].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length currentIndex += currentNodeLength; if(currentIndex >= index){ result = findNTextInBlockElm(currentNode,currentNodeLength - (currentIndex - index),str); if(result){ return result; } } } currentNode = domUtils.getNextDomNode(currentNode); } } function searchReplace(me,opt){ var rng = me.selection.getRange(), startBlockNode, searchStr = opt.searchStr, span = me.document.createElement('span'); span.innerHTML = '$$ueditor_searchreplace_key$$'; rng.shrinkBoundary(true); //判断是不是第一次选中 if(!rng.collapsed){ rng.select(); var rngText = me.selection.getText(); if(new RegExp('^' + opt.searchStr + '$',(opt.casesensitive ? '' : 'i')).test(rngText)){ if(opt.replaceStr != undefined){ replaceText(rng,opt.replaceStr); rng.select(); return true; }else{ rng.collapse(opt.dir == -1) } } } rng.insertNode(span); rng.enlargeToBlockElm(true); startBlockNode = rng.startContainer; var currentIndex = startBlockNode[browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$'); rng.setStartBefore(span); domUtils.remove(span); var result = findTextBlockElm(startBlockNode,currentIndex,opt); if(result){ var rngStart = findNTextInBlockElm(result.node,result.index,searchStr); var rngEnd = findNTextInBlockElm(result.node,result.index + searchStr.length,searchStr); rng.setStart(rngStart.node,rngStart.index).setEnd(rngEnd.node,rngEnd.index); if(opt.replaceStr !== undefined){ replaceText(rng,opt.replaceStr) } rng.select(); return true; }else{ rng.setCursor() } } function replaceText(rng,str){ str = me.document.createTextNode(str); rng.deleteContents().insertNode(str); } return { commands:{ 'searchreplace':{ execCommand:function(cmdName,opt){ utils.extend(opt,{ all : false, casesensitive : false, dir : 1 },true); var num = 0; if(opt.all){ var rng = me.selection.getRange(), first = me.body.firstChild; if(first && first.nodeType == 1){ rng.setStart(first,0); rng.shrinkBoundary(true); }else if(first.nodeType == 3){ rng.setStartBefore(first) } rng.collapse(true).select(true); if(opt.replaceStr !== undefined){ me.fireEvent('saveScene'); } while(searchReplace(this,opt)){ num++; } if(num){ me.fireEvent('saveScene'); } }else{ if(opt.replaceStr !== undefined){ me.fireEvent('saveScene'); } if(searchReplace(this,opt)){ num++ } if(num){ me.fireEvent('saveScene'); } } return num; }, notNeedUndo:1 } } } }); // plugins/customstyle.js /** * 自定义样式 * @file * @since 1.2.6.1 */ /** * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 * @command customstyle * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand( 'customstyle' ); * ``` */ UE.plugins['customstyle'] = function() { var me = this; me.setOpt({ 'customstyle':[ {tag:'h1',name:'tc', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, {tag:'h1',name:'tl', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;'}, {tag:'span',name:'im', style:'font-size:16px;font-style:italic;font-weight:bold;line-height:18px;'}, {tag:'span',name:'hi', style:'font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;'} ]}); me.commands['customstyle'] = { execCommand : function(cmdName, obj) { var me = this, tagName = obj.tag, node = domUtils.findParent(me.selection.getStart(), function(node) { return node.getAttribute('label'); }, true), range,bk,tmpObj = {}; for (var p in obj) { if(obj[p]!==undefined) tmpObj[p] = obj[p]; } delete tmpObj.tag; if (node && node.getAttribute('label') == obj.label) { range = this.selection.getRange(); bk = range.createBookmark(); if (range.collapsed) { //trace:1732 删掉自定义标签,要有p来回填站位 if(dtd.$block[node.tagName]){ var fillNode = me.document.createElement('p'); domUtils.moveChild(node, fillNode); node.parentNode.insertBefore(fillNode, node); domUtils.remove(node); }else{ domUtils.remove(node,true); } } else { var common = domUtils.getCommonAncestor(bk.start, bk.end), nodes = domUtils.getElementsByTagName(common, tagName); if(new RegExp(tagName,'i').test(common.tagName)){ nodes.push(common); } for (var i = 0,ni; ni = nodes[i++];) { if (ni.getAttribute('label') == obj.label) { var ps = domUtils.getPosition(ni, bk.start),pe = domUtils.getPosition(ni, bk.end); if ((ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) && (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) ) if (dtd.$block[tagName]) { var fillNode = me.document.createElement('p'); domUtils.moveChild(ni, fillNode); ni.parentNode.insertBefore(fillNode, ni); } domUtils.remove(ni, true); } } node = domUtils.findParent(common, function(node) { return node.getAttribute('label') == obj.label; }, true); if (node) { domUtils.remove(node, true); } } range.moveToBookmark(bk).select(); } else { if (dtd.$block[tagName]) { this.execCommand('paragraph', tagName, tmpObj,'customstyle'); range = me.selection.getRange(); if (!range.collapsed) { range.collapse(); node = domUtils.findParent(me.selection.getStart(), function(node) { return node.getAttribute('label') == obj.label; }, true); var pNode = me.document.createElement('p'); domUtils.insertAfter(node, pNode); domUtils.fillNode(me.document, pNode); range.setStart(pNode, 0).setCursor(); } } else { range = me.selection.getRange(); if (range.collapsed) { node = me.document.createElement(tagName); domUtils.setAttributes(node, tmpObj); range.insertNode(node).setStart(node, 0).setCursor(); return; } bk = range.createBookmark(); range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); } } }, queryCommandValue : function() { var parent = domUtils.filterNodeList( this.selection.getStartElementPath(), function(node){return node.getAttribute('label')} ); return parent ? parent.getAttribute('label') : ''; } }; //当去掉customstyle是,如果是块元素,用p代替 me.addListener('keyup', function(type, evt) { var keyCode = evt.keyCode || evt.which; if (keyCode == 32 || keyCode == 13) { var range = me.selection.getRange(); if (range.collapsed) { var node = domUtils.findParent(me.selection.getStart(), function(node) { return node.getAttribute('label'); }, true); if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { var p = me.document.createElement('p'); domUtils.insertAfter(node, p); domUtils.fillNode(me.document, p); domUtils.remove(node); range.setStart(p, 0).setCursor(); } } } }); }; // plugins/catchremoteimage.js ///import core ///commands 远程图片抓取 ///commandsName catchRemoteImage,catchremoteimageenable ///commandsTitle 远程图片抓取 /** * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 */ UE.plugins['catchremoteimage'] = function () { var me = this, ajax = UE.ajax; /* 设置默认值 */ if (me.options.catchRemoteImageEnable === false) return; me.setOpt({ catchRemoteImageEnable: false }); me.addListener("afterpaste", function () { me.fireEvent("catchRemoteImage"); }); me.addListener("catchRemoteImage", function () { var catcherLocalDomain = me.getOpt('catcherLocalDomain'), catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')), catcherUrlPrefix = me.getOpt('catcherUrlPrefix'), catcherFieldName = me.getOpt('catcherFieldName'); var remoteImages = [], imgs = domUtils.getElementsByTagName(me.document, "img"), test = function (src, urls) { if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { return true; } if (urls) { for (var j = 0, url; url = urls[j++];) { if (src.indexOf(url) !== -1) { return true; } } } return false; }; for (var i = 0, ci; ci = imgs[i++];) { if (ci.getAttribute("word_img")) { continue; } var src = ci.getAttribute("_src") || ci.src || ""; if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { remoteImages.push(src); } } if (remoteImages.length) { catchremoteimage(remoteImages, { //成功抓取 success: function (r) { try { var info = r.state !== undefined ? r:eval("(" + r.responseText + ")"); } catch (e) { return; } /* 获取源路径和新路径 */ var i, j, ci, cj, oldSrc, newSrc, list = info.list; for (i = 0; ci = imgs[i++];) { oldSrc = ci.getAttribute("_src") || ci.src || ""; for (j = 0; cj = list[j++];) { if (oldSrc == htmlspecialchars_decode(cj.source) && cj.state == "SUCCESS") { //抓取失败时不做替换处理 newSrc = catcherUrlPrefix + cj.url; domUtils.setAttributes(ci, { "src": newSrc, "_src": newSrc }); break; } } } me.fireEvent('catchremotesuccess') }, //回调失败,本次请求超时 error: function () { me.fireEvent("catchremoteerror"); } }); } function htmlspecialchars_decode(str){ str = str.replace(/&/g, '&'); str = str.replace(/</g, '<'); str = str.replace(/>/g, '>'); str = str.replace(/"/g, "''"); str = str.replace(/'/g, "'"); return str; } function catchremoteimage(imgs, callbacks) { var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', url = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf('?') == -1 ? '?':'&') + params), isJsonp = utils.isCrossDomainUrl(url), opt = { 'method': 'POST', 'dataType': isJsonp ? 'jsonp':'', 'timeout': 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 'onsuccess': callbacks["success"], 'onerror': callbacks["error"] }; opt[catcherFieldName] = imgs; ajax.request(url, opt); } }); }; // plugins/snapscreen.js /** * 截屏插件,为UEditor提供插入支持 * @file * @since 1.4.2 */ UE.plugin.register('snapscreen', function (){ var me = this; var snapplugin; function getLocation(url){ var search, a = document.createElement('a'), params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; a.href = url; if (browser.ie) { a.href = a.href; } search = a.search; if (params) { search = search + (search.indexOf('?') == -1 ? '?':'&')+ params; search = search.replace(/[&]+/ig, '&'); } return { 'port': a.port, 'hostname': a.hostname, 'path': a.pathname + search || + a.hash } } return { commands:{ /** * 字体背景颜色 * @command snapscreen * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand('snapscreen'); * ``` */ 'snapscreen':{ execCommand:function (cmd) { var url, local, res; var lang = me.getLang("snapScreen_plugin"); if(!snapplugin){ var container = me.container; var doc = me.container.ownerDocument || me.container.document; snapplugin = doc.createElement("object"); try{snapplugin.type = "application/x-pluginbaidusnap";}catch(e){ return; } snapplugin.style.cssText = "position:absolute;left:-9999px;width:0;height:0;"; snapplugin.setAttribute("width","0"); snapplugin.setAttribute("height","0"); container.appendChild(snapplugin); } function onSuccess(rs){ try{ rs = eval("("+ rs +")"); if(rs.state == 'SUCCESS'){ var opt = me.options; me.execCommand('insertimage', { src: opt.snapscreenUrlPrefix + rs.url, _src: opt.snapscreenUrlPrefix + rs.url, alt: rs.title || '', floatStyle: opt.snapscreenImgAlign }); } else { alert(rs.state); } }catch(e){ alert(lang.callBackErrorMsg); } } url = me.getActionUrl(me.getOpt('snapscreenActionName')); local = getLocation(url); setTimeout(function () { try{ res =snapplugin.saveSnapshot(local.hostname, local.path, local.port); }catch(e){ me.ui._dialogs['snapscreenDialog'].open(); return; } onSuccess(res); }, 50); }, queryCommandState: function(){ return (navigator.userAgent.indexOf("Windows",0) != -1) ? 0:-1; } } } } }); // plugins/insertparagraph.js /** * 插入段落 * @file * @since 1.2.6.1 */ /** * 插入段落 * @command insertparagraph * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * //editor是编辑器实例 * editor.execCommand( 'insertparagraph' ); * ``` */ UE.commands['insertparagraph'] = { execCommand : function( cmdName,front) { var me = this, range = me.selection.getRange(), start = range.startContainer,tmpNode; while(start ){ if(domUtils.isBody(start)){ break; } tmpNode = start; start = start.parentNode; } if(tmpNode){ var p = me.document.createElement('p'); if(front){ tmpNode.parentNode.insertBefore(p,tmpNode) }else{ tmpNode.parentNode.insertBefore(p,tmpNode.nextSibling) } domUtils.fillNode(me.document,p); range.setStart(p,0).setCursor(false,true); } } }; // plugins/webapp.js /** * 百度应用 * @file * @since 1.2.6.1 */ /** * 插入百度应用 * @command webapp * @method execCommand * @remind 需要百度APPKey * @remind 百度应用主页: http://app.baidu.com/ * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, * height=>应用容器高度,logo=>应用logo,url=>应用地址 * @example * ```javascript * //editor是编辑器实例 * //在编辑器里插入一个“植物大战僵尸”的APP * editor.execCommand( 'webapp' , { * title: '植物大战僵尸', * width: 560, * height: 465, * logo: '应用展示的图片', * url: '百度应用的地址' * } ); * ``` */ //UE.plugins['webapp'] = function () { // var me = this; // function createInsertStr( obj, toIframe, addParagraph ) { // return !toIframe ? // (addParagraph ? '

            ' : '') + '' + // (addParagraph ? '

            ' : '') // : // ''; // } // // function switchImgAndIframe( img2frame ) { // var tmpdiv, // nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); // for ( var i = 0, node; node = nodes[i++]; ) { // if ( node.className != "edui-faked-webapp" ){ // continue; // } // tmpdiv = me.document.createElement( "div" ); // tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); // node.parentNode.replaceChild( tmpdiv.firstChild, node ); // } // } // // me.addListener( "beforegetcontent", function () { // switchImgAndIframe( true ); // } ); // me.addListener( 'aftersetcontent', function () { // switchImgAndIframe( false ); // } ); // me.addListener( 'aftergetcontent', function ( cmdName ) { // if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ // return; // } // switchImgAndIframe( false ); // } ); // // me.commands['webapp'] = { // execCommand:function ( cmd, obj ) { // me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); // } // }; //}; UE.plugin.register('webapp', function (){ var me = this; function createInsertStr(obj,toEmbed){ return !toEmbed ? '' : '' } return { outputRule: function(root){ utils.each(root.getNodesByTagName('img'),function(node){ var html; if(node.getAttr('class') == 'edui-faked-webapp'){ html = createInsertStr({ title:node.getAttr('title'), 'width':node.getAttr('width'), 'height':node.getAttr('height'), 'align':node.getAttr('align'), 'cssfloat':node.getStyle('float'), 'url':node.getAttr("_url"), 'logo':node.getAttr('_logo_url') },true); var embed = UE.uNode.createElement(html); node.parentNode.replaceChild(embed,node); } }) }, inputRule:function(root){ utils.each(root.getNodesByTagName('iframe'),function(node){ if(node.getAttr('class') == 'edui-faked-webapp'){ var img = UE.uNode.createElement(createInsertStr({ title:node.getAttr('title'), 'width':node.getAttr('width'), 'height':node.getAttr('height'), 'align':node.getAttr('align'), 'cssfloat':node.getStyle('float'), 'url':node.getAttr("src"), 'logo':node.getAttr('logo_url') })); node.parentNode.replaceChild(img,node); } }) }, commands:{ /** * 插入百度应用 * @command webapp * @method execCommand * @remind 需要百度APPKey * @remind 百度应用主页: http://app.baidu.com/ * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, * height=>应用容器高度,logo=>应用logo,url=>应用地址 * @example * ```javascript * //editor是编辑器实例 * //在编辑器里插入一个“植物大战僵尸”的APP * editor.execCommand( 'webapp' , { * title: '植物大战僵尸', * width: 560, * height: 465, * logo: '应用展示的图片', * url: '百度应用的地址' * } ); * ``` */ 'webapp':{ execCommand:function (cmd, obj) { var me = this, str = createInsertStr(utils.extend(obj,{ align:'none' }), false); me.execCommand("inserthtml",str); }, queryCommandState:function () { var me = this, img = me.selection.getRange().getClosedNode(), flag = img && (img.className == "edui-faked-webapp"); return flag ? 1 : 0; } } } } }); // plugins/template.js ///import core ///import plugins\inserthtml.js ///import plugins\cleardoc.js ///commands 模板 ///commandsName template ///commandsTitle 模板 ///commandsDialog dialogs\template UE.plugins['template'] = function () { UE.commands['template'] = { execCommand:function (cmd, obj) { obj.html && this.execCommand("inserthtml", obj.html); } }; this.addListener("click", function (type, evt) { var el = evt.target || evt.srcElement, range = this.selection.getRange(); var tnode = domUtils.findParent(el, function (node) { if (node.className && domUtils.hasClass(node, "ue_t")) { return node; } }, true); tnode && range.selectNode(tnode).shrinkBoundary().select(); }); this.addListener("keydown", function (type, evt) { var range = this.selection.getRange(); if (!range.collapsed) { if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { var tnode = domUtils.findParent(range.startContainer, function (node) { if (node.className && domUtils.hasClass(node, "ue_t")) { return node; } }, true); if (tnode) { domUtils.removeClasses(tnode, ["ue_t"]); } } } }); }; // plugins/music.js /** * 插入音乐命令 * @file */ UE.plugin.register('music', function (){ var me = this; function creatInsertStr(url,width,height,align,cssfloat,toEmbed){ return !toEmbed ? '' : ''; } return { outputRule: function(root){ utils.each(root.getNodesByTagName('img'),function(node){ var html; if(node.getAttr('class') == 'edui-faked-music'){ var cssfloat = node.getStyle('float'); var align = node.getAttr('align'); html = creatInsertStr(node.getAttr("_url"), node.getAttr('width'), node.getAttr('height'), align, cssfloat, true); var embed = UE.uNode.createElement(html); node.parentNode.replaceChild(embed,node); } }) }, inputRule:function(root){ utils.each(root.getNodesByTagName('embed'),function(node){ if(node.getAttr('class') == 'edui-faked-music'){ var cssfloat = node.getStyle('float'); var align = node.getAttr('align'); html = creatInsertStr(node.getAttr("src"), node.getAttr('width'), node.getAttr('height'), align, cssfloat,false); var img = UE.uNode.createElement(html); node.parentNode.replaceChild(img,node); } }) }, commands:{ /** * 插入音乐 * @command music * @method execCommand * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none * @example * ```javascript * //editor是编辑器实例 * //在编辑器里插入一个“植物大战僵尸”的APP * editor.execCommand( 'music' , { * width: 400, * height: 95, * align: "center", * url: "音乐地址" * } ); * ``` */ 'music':{ execCommand:function (cmd, musicObj) { var me = this, str = creatInsertStr(musicObj.url, musicObj.width || 400, musicObj.height || 95, "none", false); me.execCommand("inserthtml",str); }, queryCommandState:function () { var me = this, img = me.selection.getRange().getClosedNode(), flag = img && (img.className == "edui-faked-music"); return flag ? 1 : 0; } } } } }); // plugins/autoupload.js /** * @description * 1.拖放文件到编辑区域,自动上传并插入到选区 * 2.插入粘贴板的图片,自动上传并插入到选区 * @author Jinqn * @date 2013-10-14 */ UE.plugin.register('autoupload', function (){ function sendAndInsertFile(file, editor) { var me = editor; //模拟数据 var fieldName, urlPrefix, maxSize, allowFiles, actionUrl, loadingHtml, errorHandler, successHandler, filetype = /image\/\w+/i.test(file.type) ? 'image':'file', loadingId = 'loading_' + (+new Date()).toString(36); fieldName = me.getOpt(filetype + 'FieldName'); urlPrefix = me.getOpt(filetype + 'UrlPrefix'); maxSize = me.getOpt(filetype + 'MaxSize'); allowFiles = me.getOpt(filetype + 'AllowFiles'); actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName')); errorHandler = function(title) { var loader = me.document.getElementById(loadingId); loader && domUtils.remove(loader); me.fireEvent('showmessage', { 'id': loadingId, 'content': title, 'type': 'error', 'timeout': 4000 }); }; if (filetype == 'image') { loadingHtml = ''; successHandler = function(data) { var link = urlPrefix + data.url, loader = me.document.getElementById(loadingId); if (loader) { loader.setAttribute('src', link); loader.setAttribute('_src', link); loader.setAttribute('title', data.title || ''); loader.setAttribute('alt', data.original || ''); loader.removeAttribute('id'); domUtils.removeClasses(loader, 'loadingclass'); } }; } else { loadingHtml = '

            ' + '' + '

            '; successHandler = function(data) { var link = urlPrefix + data.url, loader = me.document.getElementById(loadingId); var rng = me.selection.getRange(), bk = rng.createBookmark(); rng.selectNode(loader).select(); me.execCommand('insertfile', {'url': link}); rng.moveToBookmark(bk).select(); }; } /* 插入loading的占位符 */ me.execCommand('inserthtml', loadingHtml); /* 判断后端配置是否没有加载成功 */ if (!me.getOpt(filetype + 'ActionName')) { errorHandler(me.getLang('autoupload.errorLoadConfig')); return; } /* 判断文件大小是否超出限制 */ if(file.size > maxSize) { errorHandler(me.getLang('autoupload.exceedSizeError')); return; } /* 判断文件格式是否超出允许 */ var fileext = file.name ? file.name.substr(file.name.lastIndexOf('.')):''; if ((fileext && filetype != 'image') || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { errorHandler(me.getLang('autoupload.exceedTypeError')); return; } /* 创建Ajax并提交 */ var xhr = new XMLHttpRequest(), fd = new FormData(), params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); fd.append(fieldName, file, file.name || ('blob.' + file.type.substr('image/'.length))); fd.append('type', 'ajax'); xhr.open("post", url, true); xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); xhr.addEventListener('load', function (e) { try{ var json = (new Function("return " + utils.trim(e.target.response)))(); if (json.state == 'SUCCESS' && json.url) { successHandler(json); } else { errorHandler(json.state); } }catch(er){ errorHandler(me.getLang('autoupload.loadError')); } }); xhr.send(fd); } function getPasteImage(e){ return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items:null; } function getDropImage(e){ return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files:null; } return { outputRule: function(root){ utils.each(root.getNodesByTagName('img'),function(n){ if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { n.parentNode.removeChild(n); } }); utils.each(root.getNodesByTagName('p'),function(n){ if (/\bloadpara\b/.test(n.getAttr('class'))) { n.parentNode.removeChild(n); } }); }, bindEvents:{ //插入粘贴板的图片,拖放插入图片 'ready':function(e){ var me = this; if(window.FormData && window.FileReader) { domUtils.on(me.body, 'paste drop', function(e){ var hasImg = false, items; //获取粘贴板文件列表或者拖放文件列表 items = e.type == 'paste' ? getPasteImage(e):getDropImage(e); if(items){ var len = items.length, file; while (len--){ file = items[len]; if(file.getAsFile) file = file.getAsFile(); if(file && file.size > 0) { sendAndInsertFile(file, me); hasImg = true; } } hasImg && e.preventDefault(); } }); //取消拖放图片时出现的文字光标位置提示 domUtils.on(me.body, 'dragover', function (e) { if(e.dataTransfer.types[0] == 'Files') { e.preventDefault(); } }); //设置loading的样式 utils.cssRule('loading', '.loadingclass{display:inline-block;cursor:default;background: url(\'' + this.options.themePath + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n' + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + this.options.themePath + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + '}', this.document); } } } } }); // plugins/autosave.js UE.plugin.register('autosave', function (){ var me = this, //无限循环保护 lastSaveTime = new Date(), //最小保存间隔时间 MIN_TIME = 20, //auto save key saveKey = null; function save ( editor ) { var saveData; if ( new Date() - lastSaveTime < MIN_TIME ) { return; } if ( !editor.hasContents() ) { //这里不能调用命令来删除, 会造成事件死循环 saveKey && me.removePreferences( saveKey ); return; } lastSaveTime = new Date(); editor._saveFlag = null; saveData = me.body.innerHTML; if ( editor.fireEvent( "beforeautosave", { content: saveData } ) === false ) { return; } me.setPreferences( saveKey, saveData ); editor.fireEvent( "afterautosave", { content: saveData } ); } return { defaultOptions: { //默认间隔时间 saveInterval: 500 }, bindEvents:{ 'ready':function(){ var _suffix = "-drafts-data", key = null; if ( me.key ) { key = me.key + _suffix; } else { key = ( me.container.parentNode.id || 'ue-common' ) + _suffix; } //页面地址+编辑器ID 保持唯一 saveKey = ( location.protocol + location.host + location.pathname ).replace( /[.:\/]/g, '_' ) + key; }, 'contentchange': function () { if ( !saveKey ) { return; } if ( me._saveFlag ) { window.clearTimeout( me._saveFlag ); } if ( me.options.saveInterval > 0 ) { me._saveFlag = window.setTimeout( function () { save( me ); }, me.options.saveInterval ); } else { save(me); } } }, commands:{ 'clearlocaldata':{ execCommand:function (cmd, name) { if ( saveKey && me.getPreferences( saveKey ) ) { me.removePreferences( saveKey ) } }, notNeedUndo: true, ignoreContentChange:true }, 'getlocaldata':{ execCommand:function (cmd, name) { return saveKey ? me.getPreferences( saveKey ) || '' : ''; }, notNeedUndo: true, ignoreContentChange:true }, 'drafts':{ execCommand:function (cmd, name) { if ( saveKey ) { me.body.innerHTML = me.getPreferences( saveKey ) || '

            '+domUtils.fillHtml+'

            '; me.focus(true); } }, queryCommandState: function () { return saveKey ? ( me.getPreferences( saveKey ) === null ? -1 : 0 ) : -1; }, notNeedUndo: true, ignoreContentChange:true } } } }); // plugins/charts.js UE.plugin.register('charts', function (){ var me = this; return { bindEvents: { 'chartserror': function () { } }, commands:{ 'charts': { execCommand: function ( cmd, data ) { var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true), flagText = [], config = {}; if ( !tableNode ) { return false; } if ( !validData( tableNode ) ) { me.fireEvent( "chartserror" ); return false; } config.title = data.title || ''; config.subTitle = data.subTitle || ''; config.xTitle = data.xTitle || ''; config.yTitle = data.yTitle || ''; config.suffix = data.suffix || ''; config.tip = data.tip || ''; //数据对齐方式 config.dataFormat = data.tableDataFormat || ''; //图表类型 config.chartType = data.chartType || 0; for ( var key in config ) { if ( !config.hasOwnProperty( key ) ) { continue; } flagText.push( key+":"+config[ key ] ); } tableNode.setAttribute( "data-chart", flagText.join( ";" ) ); domUtils.addClass( tableNode, "edui-charts-table" ); }, queryCommandState: function ( cmd, name ) { var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true); return tableNode && validData( tableNode ) ? 0 : -1; } } }, inputRule:function(root){ utils.each(root.getNodesByTagName('table'),function( tableNode ){ if ( tableNode.getAttr("data-chart") !== undefined ) { tableNode.setAttr("style"); } }) }, outputRule:function(root){ utils.each(root.getNodesByTagName('table'),function( tableNode ){ if ( tableNode.getAttr("data-chart") !== undefined ) { tableNode.setAttr("style", "display: none;"); } }) } } function validData ( table ) { var firstRows = null, cellCount = 0; //行数不够 if ( table.rows.length < 2 ) { return false; } //列数不够 if ( table.rows[0].cells.length < 2 ) { return false; } //第一行所有cell必须是th firstRows = table.rows[ 0 ].cells; cellCount = firstRows.length; for ( var i = 0, cell; cell = firstRows[ i ]; i++ ) { if ( cell.tagName.toLowerCase() !== 'th' ) { return false; } } for ( var i = 1, row; row = table.rows[ i ]; i++ ) { //每行单元格数不匹配, 返回false if ( row.cells.length != cellCount ) { return false; } //第一列不是th也返回false if ( row.cells[0].tagName.toLowerCase() !== 'th' ) { return false; } for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); value = value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); //必须是数字 if ( !/^\d*\.?\d+$/.test( value ) ) { return false; } } } return true; } }); // plugins/section.js /** * 目录大纲支持插件 * @file * @since 1.3.0 */ UE.plugin.register('section', function (){ /* 目录节点对象 */ function Section(option){ this.tag = ''; this.level = -1, this.dom = null; this.nextSection = null; this.previousSection = null; this.parentSection = null; this.startAddress = []; this.endAddress = []; this.children = []; } function getSection(option) { var section = new Section(); return utils.extend(section, option); } function getNodeFromAddress(startAddress, root) { var current = root; for(var i = 0;i < startAddress.length; i++) { if(!current.childNodes) return null; current = current.childNodes[startAddress[i]]; } return current; } var me = this; return { bindMultiEvents:{ type: 'aftersetcontent afterscencerestore', handler: function(){ me.fireEvent('updateSections'); } }, bindEvents:{ /* 初始化、拖拽、粘贴、执行setcontent之后 */ 'ready': function (){ me.fireEvent('updateSections'); domUtils.on(me.body, 'drop paste', function(){ me.fireEvent('updateSections'); }); }, /* 执行paragraph命令之后 */ 'afterexeccommand': function (type, cmd) { if(cmd == 'paragraph') { me.fireEvent('updateSections'); } }, /* 部分键盘操作,触发updateSections事件 */ 'keyup': function (type, e) { var me = this, range = me.selection.getRange(); if(range.collapsed != true) { me.fireEvent('updateSections'); } else { var keyCode = e.keyCode || e.which; if(keyCode == 13 || keyCode == 8 || keyCode == 46) { me.fireEvent('updateSections'); } } } }, commands:{ 'getsections': { execCommand: function (cmd, levels) { var levelFn = levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; for (var i = 0; i < levelFn.length; i++) { if (typeof levelFn[i] == 'string') { levelFn[i] = function(fn){ return function(node){ return node.tagName == fn.toUpperCase() }; }(levelFn[i]); } else if (typeof levelFn[i] != 'function') { levelFn[i] = function (node) { return null; } } } function getSectionLevel(node) { for (var i = 0; i < levelFn.length; i++) { if (levelFn[i](node)) return i; } return -1; } var me = this, Directory = getSection({'level':-1, 'title':'root'}), previous = Directory; function traversal(node, Directory) { var level, tmpSection = null, parent, child, children = node.childNodes; for (var i = 0, len = children.length; i < len; i++) { child = children[i]; level = getSectionLevel(child); if (level >= 0) { var address = me.selection.getRange().selectNode(child).createAddress(true).startAddress, current = getSection({ 'tag': child.tagName, 'title': child.innerText || child.textContent || '', 'level': level, 'dom': child, 'startAddress': utils.clone(address, []), 'endAddress': utils.clone(address, []), 'children': [] }); previous.nextSection = current; current.previousSection = previous; parent = previous; while(level <= parent.level){ parent = parent.parentSection; } current.parentSection = parent; parent.children.push(current); tmpSection = previous = current; } else { child.nodeType === 1 && traversal(child, Directory); tmpSection && tmpSection.endAddress[tmpSection.endAddress.length - 1] ++; } } } traversal(me.body, Directory); return Directory; }, notNeedUndo: true }, 'movesection': { execCommand: function (cmd, sourceSection, targetSection, isAfter) { var me = this, targetAddress, target; if(!sourceSection || !targetSection || targetSection.level == -1) return; targetAddress = isAfter ? targetSection.endAddress:targetSection.startAddress; target = getNodeFromAddress(targetAddress, me.body); /* 判断目标地址是否被源章节包含 */ if(!targetAddress || !target || isContainsAddress(sourceSection.startAddress, sourceSection.endAddress, targetAddress)) return; var startNode = getNodeFromAddress(sourceSection.startAddress, me.body), endNode = getNodeFromAddress(sourceSection.endAddress, me.body), current, nextNode; if(isAfter) { current = endNode; while ( current && !(domUtils.getPosition( startNode, current ) & domUtils.POSITION_FOLLOWING) ) { nextNode = current.previousSibling; domUtils.insertAfter(target, current); if(current == startNode) break; current = nextNode; } } else { current = startNode; while ( current && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { nextNode = current.nextSibling; target.parentNode.insertBefore(current, target); if(current == endNode) break; current = nextNode; } } me.fireEvent('updateSections'); /* 获取地址的包含关系 */ function isContainsAddress(startAddress, endAddress, addressTarget){ var isAfterStartAddress = false, isBeforeEndAddress = false; for(var i = 0; i< startAddress.length; i++){ if(i >= addressTarget.length) break; if(addressTarget[i] > startAddress[i]) { isAfterStartAddress = true; break; } else if(addressTarget[i] < startAddress[i]) { break; } } for(var i = 0; i< endAddress.length; i++){ if(i >= addressTarget.length) break; if(addressTarget[i] < startAddress[i]) { isBeforeEndAddress = true; break; } else if(addressTarget[i] > startAddress[i]) { break; } } return isAfterStartAddress && isBeforeEndAddress; } } }, 'deletesection': { execCommand: function (cmd, section, keepChildren) { var me = this; if(!section) return; function getNodeFromAddress(startAddress) { var current = me.body; for(var i = 0;i < startAddress.length; i++) { if(!current.childNodes) return null; current = current.childNodes[startAddress[i]]; } return current; } var startNode = getNodeFromAddress(section.startAddress), endNode = getNodeFromAddress(section.endAddress), current = startNode, nextNode; if(!keepChildren) { while ( current && domUtils.inDoc(endNode, me.document) && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { nextNode = current.nextSibling; domUtils.remove(current); current = nextNode; } } else { domUtils.remove(current); } me.fireEvent('updateSections'); } }, 'selectsection': { execCommand: function (cmd, section) { if(!section && !section.dom) return false; var me = this, range = me.selection.getRange(), address = { 'startAddress':utils.clone(section.startAddress, []), 'endAddress':utils.clone(section.endAddress, []) }; address.endAddress[address.endAddress.length - 1]++; range.moveToAddress(address).select().scrollToView(); return true; }, notNeedUndo: true }, 'scrolltosection': { execCommand: function (cmd, section) { if(!section && !section.dom) return false; var me = this, range = me.selection.getRange(), address = { 'startAddress':section.startAddress, 'endAddress':section.endAddress }; address.endAddress[address.endAddress.length - 1]++; range.moveToAddress(address).scrollToView(); return true; }, notNeedUndo: true } } } }); // plugins/simpleupload.js /** * @description * 简单上传:点击按钮,直接选择文件上传 * @author Jinqn * @date 2014-03-31 */ UE.plugin.register('simpleupload', function (){ var me = this, isLoaded = false, containerBtn; function initUploadBtn(){ var w = containerBtn.offsetWidth || 20, h = containerBtn.offsetHeight || 20, btnIframe = document.createElement('iframe'), btnStyle = 'display:block;width:' + w + 'px;height:' + h + 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;'; domUtils.on(btnIframe, 'load', function(){ var timestrap = (+new Date()).toString(36), wrapper, btnIframeDoc, btnIframeBody; btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document); btnIframeBody = btnIframeDoc.body; wrapper = btnIframeDoc.createElement('div'); wrapper.innerHTML = '
            ' + '' + '
            ' + ''; wrapper.className = 'edui-' + me.options.theme; wrapper.id = me.ui.id + '_iframeupload'; btnIframeBody.style.cssText = btnStyle; btnIframeBody.style.width = w + 'px'; btnIframeBody.style.height = h + 'px'; btnIframeBody.appendChild(wrapper); if (btnIframeBody.parentNode) { btnIframeBody.parentNode.style.width = w + 'px'; btnIframeBody.parentNode.style.height = w + 'px'; } var form = btnIframeDoc.getElementById('edui_form_' + timestrap); var input = btnIframeDoc.getElementById('edui_input_' + timestrap); var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap); domUtils.on(input, 'change', function(){ if(!input.value) return; var loadingId = 'loading_' + (+new Date()).toString(36); var params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName')); var allowFiles = me.getOpt('imageAllowFiles'); me.focus(); me.execCommand('inserthtml', ''); function callback(){ try{ var link, json, loader, body = (iframe.contentDocument || iframe.contentWindow.document).body, result = body.innerText || body.textContent || ''; json = (new Function("return " + result))(); link = me.options.imageUrlPrefix + json.url; if(json.state == 'SUCCESS' && json.url) { loader = me.document.getElementById(loadingId); loader.setAttribute('src', link); loader.setAttribute('_src', link); loader.setAttribute('title', json.title || ''); loader.setAttribute('alt', json.original || ''); loader.removeAttribute('id'); domUtils.removeClasses(loader, 'loadingclass'); } else { showErrorLoader && showErrorLoader(json.state); } }catch(er){ showErrorLoader && showErrorLoader(me.getLang('simpleupload.loadError')); } form.reset(); domUtils.un(iframe, 'load', callback); } function showErrorLoader(title){ if(loadingId) { var loader = me.document.getElementById(loadingId); loader && domUtils.remove(loader); me.fireEvent('showmessage', { 'id': loadingId, 'content': title, 'type': 'error', 'timeout': 4000 }); } } /* 判断后端配置是否没有加载成功 */ if (!me.getOpt('imageActionName')) { errorHandler(me.getLang('autoupload.errorLoadConfig')); return; } // 判断文件格式是否错误 var filename = input.value, fileext = filename ? filename.substr(filename.lastIndexOf('.')):''; if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { showErrorLoader(me.getLang('simpleupload.exceedTypeError')); return; } domUtils.on(iframe, 'load', callback); form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params); form.submit(); }); var stateTimer; me.addListener('selectionchange', function () { clearTimeout(stateTimer); stateTimer = setTimeout(function() { var state = me.queryCommandState('simpleupload'); if (state == -1) { input.disabled = 'disabled'; } else { input.disabled = false; } }, 400); }); isLoaded = true; }); btnIframe.style.cssText = btnStyle; containerBtn.appendChild(btnIframe); } return { bindEvents:{ 'ready': function() { //设置loading的样式 utils.cssRule('loading', '.loadingclass{display:inline-block;cursor:default;background: url(\'' + this.options.themePath + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n' + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + this.options.themePath + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + '}', this.document); }, /* 初始化简单上传按钮 */ 'simpleuploadbtnready': function(type, container) { containerBtn = container; me.afterConfigReady(initUploadBtn); } }, outputRule: function(root){ utils.each(root.getNodesByTagName('img'),function(n){ if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { n.parentNode.removeChild(n); } }); }, commands: { 'simpleupload': { queryCommandState: function () { return isLoaded ? 0:-1; } } } } }); // plugins/serverparam.js /** * 服务器提交的额外参数列表设置插件 * @file * @since 1.2.6.1 */ UE.plugin.register('serverparam', function (){ var me = this, serverParam = {}; return { commands:{ /** * 修改服务器提交的额外参数列表,清除所有项 * @command serverparam * @method execCommand * @param { String } cmd 命令字符串 * @example * ```javascript * editor.execCommand('serverparam'); * editor.queryCommandValue('serverparam'); //返回空 * ``` */ /** * 修改服务器提交的额外参数列表,删除指定项 * @command serverparam * @method execCommand * @param { String } cmd 命令字符串 * @param { String } key 要清除的属性 * @example * ```javascript * editor.execCommand('serverparam', 'name'); //删除属性name * ``` */ /** * 修改服务器提交的额外参数列表,使用键值添加项 * @command serverparam * @method execCommand * @param { String } cmd 命令字符串 * @param { String } key 要添加的属性 * @param { String } value 要添加属性的值 * @example * ```javascript * editor.execCommand('serverparam', 'name', 'hello'); * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} * ``` */ /** * 修改服务器提交的额外参数列表,传入键值对对象添加多项 * @command serverparam * @method execCommand * @param { String } cmd 命令字符串 * @param { Object } key 传入的键值对对象 * @example * ```javascript * editor.execCommand('serverparam', {'name': 'hello'}); * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} * ``` */ /** * 修改服务器提交的额外参数列表,使用自定义函数添加多项 * @command serverparam * @method execCommand * @param { String } cmd 命令字符串 * @param { Function } key 自定义获取参数的函数 * @example * ```javascript * editor.execCommand('serverparam', function(editor){ * return {'key': 'value'}; * }); * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} * ``` */ /** * 获取服务器提交的额外参数列表 * @command serverparam * @method queryCommandValue * @param { String } cmd 命令字符串 * @example * ```javascript * editor.queryCommandValue( 'serverparam' ); //返回对象 {'key': 'value'} * ``` */ 'serverparam':{ execCommand:function (cmd, key, value) { if (key === undefined || key === null) { //不传参数,清空列表 serverParam = {}; } else if (utils.isString(key)) { //传入键值 if(value === undefined || value === null) { delete serverParam[key]; } else { serverParam[key] = value; } } else if (utils.isObject(key)) { //传入对象,覆盖列表项 utils.extend(serverParam, key, true); } else if (utils.isFunction(key)){ //传入函数,添加列表项 utils.extend(serverParam, key(), true); } }, queryCommandValue: function(){ return serverParam || {}; } } } } }); // plugins/insertfile.js /** * 插入附件 */ UE.plugin.register('insertfile', function (){ var me = this; function getFileIcon(url){ var ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase(), maps = { "rar":"icon_rar.gif", "zip":"icon_rar.gif", "tar":"icon_rar.gif", "gz":"icon_rar.gif", "bz2":"icon_rar.gif", "doc":"icon_doc.gif", "docx":"icon_doc.gif", "pdf":"icon_pdf.gif", "mp3":"icon_mp3.gif", "xls":"icon_xls.gif", "chm":"icon_chm.gif", "ppt":"icon_ppt.gif", "pptx":"icon_ppt.gif", "avi":"icon_mv.gif", "rmvb":"icon_mv.gif", "wmv":"icon_mv.gif", "flv":"icon_mv.gif", "swf":"icon_mv.gif", "rm":"icon_mv.gif", "exe":"icon_exe.gif", "psd":"icon_psd.gif", "txt":"icon_txt.gif", "jpg":"icon_jpg.gif", "png":"icon_jpg.gif", "jpeg":"icon_jpg.gif", "gif":"icon_jpg.gif", "ico":"icon_jpg.gif", "bmp":"icon_jpg.gif" }; return maps[ext] ? maps[ext]:maps['txt']; } return { commands:{ 'insertfile': { execCommand: function (command, filelist){ filelist = utils.isArray(filelist) ? filelist : [filelist]; var i, item, icon, title, html = '', URL = me.getOpt('UEDITOR_HOME_URL'), iconDir = URL + (URL.substr(URL.length - 1) == '/' ? '':'/') + 'dialogs/attachment/fileTypeImages/'; for (i = 0; i < filelist.length; i++) { item = filelist[i]; icon = iconDir + getFileIcon(item.url); title = item.title || item.url.substr(item.url.lastIndexOf('/') + 1); html += '

            ' + '' + '' + title + '' + '

            '; } me.execCommand('insertHtml', html); } } } } }); // plugins/xssFilter.js /** * @file xssFilter.js * @desc xss过滤器 * @author robbenmu */ UE.plugins.xssFilter = function() { var config = UEDITOR_CONFIG; var whitList = config.whitList; function filter(node) { var tagName = node.tagName; var attrs = node.attrs; if (!whitList.hasOwnProperty(tagName)) { node.parentNode.removeChild(node); return false; } UE.utils.each(attrs, function (val, key) { if (whitList[tagName].indexOf(key) === -1) { node.setAttr(key); } }); } // 添加inserthtml\paste等操作用的过滤规则 if (whitList && config.xssFilterRules) { this.options.filterRules = function () { var result = {}; UE.utils.each(whitList, function(val, key) { result[key] = function (node) { return filter(node); }; }); return result; }(); } var tagList = []; UE.utils.each(whitList, function (val, key) { tagList.push(key); }); // 添加input过滤规则 // if (whitList && config.inputXssFilter) { this.addInputRule(function (root) { root.traversal(function(node) { if (node.type !== 'element') { return false; } filter(node); }); }); } // 添加output过滤规则 // if (whitList && config.outputXssFilter) { this.addOutputRule(function (root) { root.traversal(function(node) { if (node.type !== 'element') { return false; } filter(node); }); }); } }; // ui/ui.js var baidu = baidu || {}; baidu.editor = baidu.editor || {}; UE.ui = baidu.editor.ui = {}; // ui/uiutils.js (function (){ var browser = baidu.editor.browser, domUtils = baidu.editor.dom.domUtils; var magic = '$EDITORUI'; var root = window[magic] = {}; var uidMagic = 'ID' + magic; var uidCount = 0; var uiUtils = baidu.editor.ui.uiUtils = { uid: function (obj){ return (obj ? obj[uidMagic] || (obj[uidMagic] = ++ uidCount) : ++ uidCount); }, hook: function ( fn, callback ) { var dg; if (fn && fn._callbacks) { dg = fn; } else { dg = function (){ var q; if (fn) { q = fn.apply(this, arguments); } var callbacks = dg._callbacks; var k = callbacks.length; while (k --) { var r = callbacks[k].apply(this, arguments); if (q === undefined) { q = r; } } return q; }; dg._callbacks = []; } dg._callbacks.push(callback); return dg; }, createElementByHtml: function (html){ var el = document.createElement('div'); el.innerHTML = html; el = el.firstChild; el.parentNode.removeChild(el); return el; }, getViewportElement: function (){ return (browser.ie && browser.quirks) ? document.body : document.documentElement; }, getClientRect: function (element){ var bcr; //trace IE6下在控制编辑器显隐时可能会报错,catch一下 try{ bcr = element.getBoundingClientRect(); }catch(e){ bcr={left:0,top:0,height:0,width:0} } var rect = { left: Math.round(bcr.left), top: Math.round(bcr.top), height: Math.round(bcr.bottom - bcr.top), width: Math.round(bcr.right - bcr.left) }; var doc; while ((doc = element.ownerDocument) !== document && (element = domUtils.getWindow(doc).frameElement)) { bcr = element.getBoundingClientRect(); rect.left += bcr.left; rect.top += bcr.top; } rect.bottom = rect.top + rect.height; rect.right = rect.left + rect.width; return rect; }, getViewportRect: function (){ var viewportEl = uiUtils.getViewportElement(); var width = (window.innerWidth || viewportEl.clientWidth) | 0; var height = (window.innerHeight ||viewportEl.clientHeight) | 0; return { left: 0, top: 0, height: height, width: width, bottom: height, right: width }; }, setViewportOffset: function (element, offset){ var rect; var fixedLayer = uiUtils.getFixedLayer(); if (element.parentNode === fixedLayer) { element.style.left = offset.left + 'px'; element.style.top = offset.top + 'px'; } else { domUtils.setViewportOffset(element, offset); } }, getEventOffset: function (evt){ var el = evt.target || evt.srcElement; var rect = uiUtils.getClientRect(el); var offset = uiUtils.getViewportOffsetByEvent(evt); return { left: offset.left - rect.left, top: offset.top - rect.top }; }, getViewportOffsetByEvent: function (evt){ var el = evt.target || evt.srcElement; var frameEl = domUtils.getWindow(el).frameElement; var offset = { left: evt.clientX, top: evt.clientY }; if (frameEl && el.ownerDocument !== document) { var rect = uiUtils.getClientRect(frameEl); offset.left += rect.left; offset.top += rect.top; } return offset; }, setGlobal: function (id, obj){ root[id] = obj; return magic + '["' + id + '"]'; }, unsetGlobal: function (id){ delete root[id]; }, copyAttributes: function (tgt, src){ var attributes = src.attributes; var k = attributes.length; while (k --) { var attrNode = attributes[k]; if ( attrNode.nodeName != 'style' && attrNode.nodeName != 'class' && (!browser.ie || attrNode.specified) ) { tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); } } if (src.className) { domUtils.addClass(tgt,src.className); } if (src.style.cssText) { tgt.style.cssText += ';' + src.style.cssText; } }, removeStyle: function (el, styleName){ if (el.style.removeProperty) { el.style.removeProperty(styleName); } else if (el.style.removeAttribute) { el.style.removeAttribute(styleName); } else throw ''; }, contains: function (elA, elB){ return elA && elB && (elA === elB ? false : ( elA.contains ? elA.contains(elB) : elA.compareDocumentPosition(elB) & 16 )); }, startDrag: function (evt, callbacks,doc){ var doc = doc || document; var startX = evt.clientX; var startY = evt.clientY; function handleMouseMove(evt){ var x = evt.clientX - startX; var y = evt.clientY - startY; callbacks.ondragmove(x, y,evt); if (evt.stopPropagation) { evt.stopPropagation(); } else { evt.cancelBubble = true; } } if (doc.addEventListener) { function handleMouseUp(evt){ doc.removeEventListener('mousemove', handleMouseMove, true); doc.removeEventListener('mouseup', handleMouseUp, true); window.removeEventListener('mouseup', handleMouseUp, true); callbacks.ondragstop(); } doc.addEventListener('mousemove', handleMouseMove, true); doc.addEventListener('mouseup', handleMouseUp, true); window.addEventListener('mouseup', handleMouseUp, true); evt.preventDefault(); } else { var elm = evt.srcElement; elm.setCapture(); function releaseCaptrue(){ elm.releaseCapture(); elm.detachEvent('onmousemove', handleMouseMove); elm.detachEvent('onmouseup', releaseCaptrue); elm.detachEvent('onlosecaptrue', releaseCaptrue); callbacks.ondragstop(); } elm.attachEvent('onmousemove', handleMouseMove); elm.attachEvent('onmouseup', releaseCaptrue); elm.attachEvent('onlosecaptrue', releaseCaptrue); evt.returnValue = false; } callbacks.ondragstart(); }, getFixedLayer: function (){ var layer = document.getElementById('edui_fixedlayer'); if (layer == null) { layer = document.createElement('div'); layer.id = 'edui_fixedlayer'; document.body.appendChild(layer); if (browser.ie && browser.version <= 8) { layer.style.position = 'absolute'; bindFixedLayer(); setTimeout(updateFixedOffset); } else { layer.style.position = 'fixed'; } layer.style.left = '0'; layer.style.top = '0'; layer.style.width = '0'; layer.style.height = '0'; } return layer; }, makeUnselectable: function (element){ if (browser.opera || (browser.ie && browser.version < 9)) { element.unselectable = 'on'; if (element.hasChildNodes()) { for (var i=0; i
            '; } }; utils.inherits(Separator, UIBase); })(); // ui/mask.js ///import core ///import uicore (function (){ var utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils, UIBase = baidu.editor.ui.UIBase, uiUtils = baidu.editor.ui.uiUtils; var Mask = baidu.editor.ui.Mask = function (options){ this.initOptions(options); this.initUIBase(); }; Mask.prototype = { getHtmlTpl: function (){ return '
            '; }, postRender: function (){ var me = this; domUtils.on(window, 'resize', function (){ setTimeout(function (){ if (!me.isHidden()) { me._fill(); } }); }); }, show: function (zIndex){ this._fill(); this.getDom().style.display = ''; this.getDom().style.zIndex = zIndex; }, hide: function (){ this.getDom().style.display = 'none'; this.getDom().style.zIndex = ''; }, isHidden: function (){ return this.getDom().style.display == 'none'; }, _onMouseDown: function (){ return false; }, _onClick: function (e, target){ this.fireEvent('click', e, target); }, _fill: function (){ var el = this.getDom(); var vpRect = uiUtils.getViewportRect(); el.style.width = vpRect.width + 'px'; el.style.height = vpRect.height + 'px'; } }; utils.inherits(Mask, UIBase); })(); // ui/popup.js ///import core ///import uicore (function () { var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, domUtils = baidu.editor.dom.domUtils, UIBase = baidu.editor.ui.UIBase, Popup = baidu.editor.ui.Popup = function (options){ this.initOptions(options); this.initPopup(); }; var allPopups = []; function closeAllPopup( evt,el ){ for ( var i = 0; i < allPopups.length; i++ ) { var pop = allPopups[i]; if (!pop.isHidden()) { if (pop.queryAutoHide(el) !== false) { if(evt&&/scroll/ig.test(evt.type)&&pop.className=="edui-wordpastepop") return; pop.hide(); } } } if(allPopups.length) pop.editor.fireEvent("afterhidepop"); } Popup.postHide = closeAllPopup; var ANCHOR_CLASSES = ['edui-anchor-topleft','edui-anchor-topright', 'edui-anchor-bottomleft','edui-anchor-bottomright']; Popup.prototype = { SHADOW_RADIUS: 5, content: null, _hidden: false, autoRender: true, canSideLeft: true, canSideUp: true, initPopup: function (){ this.initUIBase(); allPopups.push( this ); }, getHtmlTpl: function (){ return '
            ' + '
            ' + ' ' + '
            ' + '
            ' + this.getContentHtmlTpl() + '
            ' + '
            ' + '
            '; }, getContentHtmlTpl: function (){ if(this.content){ if (typeof this.content == 'string') { return this.content; } return this.content.renderHtml(); }else{ return '' } }, _UIBase_postRender: UIBase.prototype.postRender, postRender: function (){ if (this.content instanceof UIBase) { this.content.postRender(); } //捕获鼠标滚轮 if( this.captureWheel && !this.captured ) { this.captured = true; var winHeight = ( document.documentElement.clientHeight || document.body.clientHeight ) - 80, _height = this.getDom().offsetHeight, _top = uiUtils.getClientRect( this.combox.getDom() ).top, content = this.getDom('content'), ifr = this.getDom('body').getElementsByTagName('iframe'), me = this; ifr.length && ( ifr = ifr[0] ); while( _top + _height > winHeight ) { _height -= 30; } content.style.height = _height + 'px'; //同步更改iframe高度 ifr && ( ifr.style.height = _height + 'px' ); //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解 if( window.XMLHttpRequest ) { domUtils.on( content, ( 'onmousewheel' in document.body ) ? 'mousewheel' :'DOMMouseScroll' , function(e){ if(e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } if( e.wheelDelta ) { content.scrollTop -= ( e.wheelDelta / 120 )*60; } else { content.scrollTop -= ( e.detail / -3 )*60; } }); } else { //ie6 domUtils.on( this.getDom(), 'mousewheel' , function(e){ e.returnValue = false; me.getDom('content').scrollTop -= ( e.wheelDelta / 120 )*60; }); } } this.fireEvent('postRenderAfter'); this.hide(true); this._UIBase_postRender(); }, _doAutoRender: function (){ if (!this.getDom() && this.autoRender) { this.render(); } }, mesureSize: function (){ var box = this.getDom('content'); return uiUtils.getClientRect(box); }, fitSize: function (){ if( this.captureWheel && this.sized ) { return this.__size; } this.sized = true; var popBodyEl = this.getDom('body'); popBodyEl.style.width = ''; popBodyEl.style.height = ''; var size = this.mesureSize(); if( this.captureWheel ) { popBodyEl.style.width = -(-20 -size.width) + 'px'; var height = parseInt( this.getDom('content').style.height, 10 ); !window.isNaN( height ) && ( size.height = height ); } else { popBodyEl.style.width = size.width + 'px'; } popBodyEl.style.height = size.height + 'px'; this.__size = size; this.captureWheel && (this.getDom('content').style.overflow = 'auto'); return size; }, showAnchor: function ( element, hoz ){ this.showAnchorRect( uiUtils.getClientRect( element ), hoz ); }, showAnchorRect: function ( rect, hoz, adj ){ this._doAutoRender(); var vpRect = uiUtils.getViewportRect(); this.getDom().style.visibility = 'hidden'; this._show(); var popSize = this.fitSize(); var sideLeft, sideUp, left, top; if (hoz) { sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); left = (sideLeft ? rect.left - popSize.width : rect.right); top = (sideUp ? rect.bottom - popSize.height : rect.top); } else { sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); left = (sideLeft ? rect.right - popSize.width : rect.left); top = (sideUp ? rect.top - popSize.height : rect.bottom); } var popEl = this.getDom(); uiUtils.setViewportOffset(popEl, { left: left, top: top }); domUtils.removeClasses(popEl, ANCHOR_CLASSES); popEl.className += ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]; if(this.editor){ popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10; baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = popEl.style.zIndex - 1; } this.getDom().style.visibility = 'visible'; }, showAt: function (offset) { var left = offset.left; var top = offset.top; var rect = { left: left, top: top, right: left, bottom: top, height: 0, width: 0 }; this.showAnchorRect(rect, false, true); }, _show: function (){ if (this._hidden) { var box = this.getDom(); box.style.display = ''; this._hidden = false; // if (box.setActive) { // box.setActive(); // } this.fireEvent('show'); } }, isHidden: function (){ return this._hidden; }, show: function (){ this._doAutoRender(); this._show(); }, hide: function (notNofity){ if (!this._hidden && this.getDom()) { this.getDom().style.display = 'none'; this._hidden = true; if (!notNofity) { this.fireEvent('hide'); } } }, queryAutoHide: function (el){ return !el || !uiUtils.contains(this.getDom(), el); } }; utils.inherits(Popup, UIBase); domUtils.on( document, 'mousedown', function ( evt ) { var el = evt.target || evt.srcElement; closeAllPopup( evt,el ); } ); domUtils.on( window, 'scroll', function (evt,el) { closeAllPopup( evt,el ); } ); })(); // ui/colorpicker.js ///import core ///import uicore (function (){ var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase, ColorPicker = baidu.editor.ui.ColorPicker = function (options){ this.initOptions(options); this.noColorText = this.noColorText || this.editor.getLang("clearColor"); this.initUIBase(); }; ColorPicker.prototype = { getHtmlTpl: function (){ return genColorPicker(this.noColorText,this.editor); }, _onTableClick: function (evt){ var tgt = evt.target || evt.srcElement; var color = tgt.getAttribute('data-color'); if (color) { this.fireEvent('pickcolor', color); } }, _onTableOver: function (evt){ var tgt = evt.target || evt.srcElement; var color = tgt.getAttribute('data-color'); if (color) { this.getDom('preview').style.backgroundColor = color; } }, _onTableOut: function (){ this.getDom('preview').style.backgroundColor = ''; }, _onPickNoColor: function (){ this.fireEvent('picknocolor'); } }; utils.inherits(ColorPicker, UIBase); var COLORS = ( 'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' + 'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' + 'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' + 'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' + 'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' + '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' + 'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,').split(','); function genColorPicker(noColorText,editor){ var html = '
            ' + '
            ' + '
            ' + '
            '+ noColorText +'
            ' + '
            ' + '' + ''+ ''; for (var i=0; i':'')+''; } html += i<70 ? '':''; } html += '
            '+editor.getLang("themeColor")+'
            '+editor.getLang("standardColor")+'
            '; return html; } })(); // ui/tablepicker.js ///import core ///import uicore (function (){ var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase; var TablePicker = baidu.editor.ui.TablePicker = function (options){ this.initOptions(options); this.initTablePicker(); }; TablePicker.prototype = { defaultNumRows: 10, defaultNumCols: 10, maxNumRows: 20, maxNumCols: 20, numRows: 10, numCols: 10, lengthOfCellSide: 22, initTablePicker: function (){ this.initUIBase(); }, getHtmlTpl: function (){ var me = this; return '
            ' + '
            ' + '
            ' + '' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            '; }, _UIBase_render: UIBase.prototype.render, render: function (holder){ this._UIBase_render(holder); this.getDom('label').innerHTML = '0'+this.editor.getLang("t_row")+' x 0'+this.editor.getLang("t_col"); }, _track: function (numCols, numRows){ var style = this.getDom('overlay').style; var sideLen = this.lengthOfCellSide; style.width = numCols * sideLen + 'px'; style.height = numRows * sideLen + 'px'; var label = this.getDom('label'); label.innerHTML = numCols +this.editor.getLang("t_col")+' x ' + numRows + this.editor.getLang("t_row"); this.numCols = numCols; this.numRows = numRows; }, _onMouseOver: function (evt, el){ var rel = evt.relatedTarget || evt.fromElement; if (!uiUtils.contains(el, rel) && el !== rel) { this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); this.getDom('overlay').style.visibility = ''; } }, _onMouseOut: function (evt, el){ var rel = evt.relatedTarget || evt.toElement; if (!uiUtils.contains(el, rel) && el !== rel) { this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); this.getDom('overlay').style.visibility = 'hidden'; } }, _onMouseMove: function (evt, el){ var style = this.getDom('overlay').style; var offset = uiUtils.getEventOffset(evt); var sideLen = this.lengthOfCellSide; var numCols = Math.ceil(offset.left / sideLen); var numRows = Math.ceil(offset.top / sideLen); this._track(numCols, numRows); }, _onClick: function (){ this.fireEvent('picktable', this.numCols, this.numRows); } }; utils.inherits(TablePicker, UIBase); })(); // ui/stateful.js (function (){ var browser = baidu.editor.browser, domUtils = baidu.editor.dom.domUtils, uiUtils = baidu.editor.ui.uiUtils; var TPL_STATEFUL = 'onmousedown="$$.Stateful_onMouseDown(event, this);"' + ' onmouseup="$$.Stateful_onMouseUp(event, this);"' + ( browser.ie ? ( ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' + ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"' ) : ( ' onmouseover="$$.Stateful_onMouseOver(event, this);"' + ' onmouseout="$$.Stateful_onMouseOut(event, this);"' )); baidu.editor.ui.Stateful = { alwalysHoverable: false, target:null,//目标元素和this指向dom不一样 Stateful_init: function (){ this._Stateful_dGetHtmlTpl = this.getHtmlTpl; this.getHtmlTpl = this.Stateful_getHtmlTpl; }, Stateful_getHtmlTpl: function (){ var tpl = this._Stateful_dGetHtmlTpl(); // 使用function避免$转义 return tpl.replace(/stateful/g, function (){ return TPL_STATEFUL; }); }, Stateful_onMouseEnter: function (evt, el){ this.target=el; if (!this.isDisabled() || this.alwalysHoverable) { this.addState('hover'); this.fireEvent('over'); } }, Stateful_onMouseLeave: function (evt, el){ if (!this.isDisabled() || this.alwalysHoverable) { this.removeState('hover'); this.removeState('active'); this.fireEvent('out'); } }, Stateful_onMouseOver: function (evt, el){ var rel = evt.relatedTarget; if (!uiUtils.contains(el, rel) && el !== rel) { this.Stateful_onMouseEnter(evt, el); } }, Stateful_onMouseOut: function (evt, el){ var rel = evt.relatedTarget; if (!uiUtils.contains(el, rel) && el !== rel) { this.Stateful_onMouseLeave(evt, el); } }, Stateful_onMouseDown: function (evt, el){ if (!this.isDisabled()) { this.addState('active'); } }, Stateful_onMouseUp: function (evt, el){ if (!this.isDisabled()) { this.removeState('active'); } }, Stateful_postRender: function (){ if (this.disabled && !this.hasState('disabled')) { this.addState('disabled'); } }, hasState: function (state){ return domUtils.hasClass(this.getStateDom(), 'edui-state-' + state); }, addState: function (state){ if (!this.hasState(state)) { this.getStateDom().className += ' edui-state-' + state; } }, removeState: function (state){ if (this.hasState(state)) { domUtils.removeClasses(this.getStateDom(), ['edui-state-' + state]); } }, getStateDom: function (){ return this.getDom('state'); }, isChecked: function (){ return this.hasState('checked'); }, setChecked: function (checked){ if (!this.isDisabled() && checked) { this.addState('checked'); } else { this.removeState('checked'); } }, isDisabled: function (){ return this.hasState('disabled'); }, setDisabled: function (disabled){ if (disabled) { this.removeState('hover'); this.removeState('checked'); this.removeState('active'); this.addState('disabled'); } else { this.removeState('disabled'); } } }; })(); // ui/button.js ///import core ///import uicore ///import ui/stateful.js (function (){ var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase, Stateful = baidu.editor.ui.Stateful, Button = baidu.editor.ui.Button = function (options){ if(options.name){ var btnName = options.name; var cssRules = options.cssRules; if(!options.className){ options.className = 'edui-for-' + btnName; } options.cssRules = '.edui-default .edui-for-'+ btnName +' .edui-icon {'+ cssRules +'}' } this.initOptions(options); this.initButton(); }; Button.prototype = { uiName: 'button', label: '', title: '', showIcon: true, showText: true, cssRules:'', initButton: function (){ this.initUIBase(); this.Stateful_init(); if(this.cssRules){ utils.cssRule('edui-customize-'+this.name+'-style',this.cssRules); } }, getHtmlTpl: function (){ return '
            ' + '
            ' + '
            ' + (this.showIcon ? '
            ' : '') + (this.showText ? '
            ' + this.label + '
            ' : '') + '
            ' + '
            ' + '
            '; }, postRender: function (){ this.Stateful_postRender(); this.setDisabled(this.disabled) }, _onMouseDown: function (e){ var target = e.target || e.srcElement, tagName = target && target.tagName && target.tagName.toLowerCase(); if (tagName == 'input' || tagName == 'object' || tagName == 'object') { return false; } }, _onClick: function (){ if (!this.isDisabled()) { this.fireEvent('click'); } }, setTitle: function(text){ var label = this.getDom('label'); label.innerHTML = text; } }; utils.inherits(Button, UIBase); utils.extend(Button.prototype, Stateful); })(); // ui/splitbutton.js ///import core ///import uicore ///import ui/stateful.js (function (){ var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, domUtils = baidu.editor.dom.domUtils, UIBase = baidu.editor.ui.UIBase, Stateful = baidu.editor.ui.Stateful, SplitButton = baidu.editor.ui.SplitButton = function (options){ this.initOptions(options); this.initSplitButton(); }; SplitButton.prototype = { popup: null, uiName: 'splitbutton', title: '', initSplitButton: function (){ this.initUIBase(); this.Stateful_init(); var me = this; if (this.popup != null) { var popup = this.popup; this.popup = null; this.setPopup(popup); } }, _UIBase_postRender: UIBase.prototype.postRender, postRender: function (){ this.Stateful_postRender(); this._UIBase_postRender(); }, setPopup: function (popup){ if (this.popup === popup) return; if (this.popup != null) { this.popup.dispose(); } popup.addListener('show', utils.bind(this._onPopupShow, this)); popup.addListener('hide', utils.bind(this._onPopupHide, this)); popup.addListener('postrender', utils.bind(function (){ popup.getDom('body').appendChild( uiUtils.createElementByHtml('
            ') ); popup.getDom().className += ' ' + this.className; }, this)); this.popup = popup; }, _onPopupShow: function (){ this.addState('opened'); }, _onPopupHide: function (){ this.removeState('opened'); }, getHtmlTpl: function (){ return '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            '; }, showPopup: function (){ // 当popup往上弹出的时候,做特殊处理 var rect = uiUtils.getClientRect(this.getDom()); rect.top -= this.popup.SHADOW_RADIUS; rect.height += this.popup.SHADOW_RADIUS; this.popup.showAnchorRect(rect); }, _onArrowClick: function (event, el){ if (!this.isDisabled()) { this.showPopup(); } }, _onButtonClick: function (){ if (!this.isDisabled()) { this.fireEvent('buttonclick'); } } }; utils.inherits(SplitButton, UIBase); utils.extend(SplitButton.prototype, Stateful, true); })(); // ui/colorbutton.js ///import core ///import uicore ///import ui/colorpicker.js ///import ui/popup.js ///import ui/splitbutton.js (function (){ var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, ColorPicker = baidu.editor.ui.ColorPicker, Popup = baidu.editor.ui.Popup, SplitButton = baidu.editor.ui.SplitButton, ColorButton = baidu.editor.ui.ColorButton = function (options){ this.initOptions(options); this.initColorButton(); }; ColorButton.prototype = { initColorButton: function (){ var me = this; this.popup = new Popup({ content: new ColorPicker({ noColorText: me.editor.getLang("clearColor"), editor:me.editor, onpickcolor: function (t, color){ me._onPickColor(color); }, onpicknocolor: function (t, color){ me._onPickNoColor(color); } }), editor:me.editor }); this.initSplitButton(); }, _SplitButton_postRender: SplitButton.prototype.postRender, postRender: function (){ this._SplitButton_postRender(); this.getDom('button_body').appendChild( uiUtils.createElementByHtml('
            ') ); this.getDom().className += ' edui-colorbutton'; }, setColor: function (color){ this.getDom('colorlump').style.backgroundColor = color; this.color = color; }, _onPickColor: function (color){ if (this.fireEvent('pickcolor', color) !== false) { this.setColor(color); this.popup.hide(); } }, _onPickNoColor: function (color){ if (this.fireEvent('picknocolor') !== false) { this.popup.hide(); } } }; utils.inherits(ColorButton, SplitButton); })(); // ui/tablebutton.js ///import core ///import uicore ///import ui/popup.js ///import ui/tablepicker.js ///import ui/splitbutton.js (function (){ var utils = baidu.editor.utils, Popup = baidu.editor.ui.Popup, TablePicker = baidu.editor.ui.TablePicker, SplitButton = baidu.editor.ui.SplitButton, TableButton = baidu.editor.ui.TableButton = function (options){ this.initOptions(options); this.initTableButton(); }; TableButton.prototype = { initTableButton: function (){ var me = this; this.popup = new Popup({ content: new TablePicker({ editor:me.editor, onpicktable: function (t, numCols, numRows){ me._onPickTable(numCols, numRows); } }), 'editor':me.editor }); this.initSplitButton(); }, _onPickTable: function (numCols, numRows){ if (this.fireEvent('picktable', numCols, numRows) !== false) { this.popup.hide(); } } }; utils.inherits(TableButton, SplitButton); })(); // ui/autotypesetpicker.js ///import core ///import uicore (function () { var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase; var AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker = function (options) { this.initOptions(options); this.initAutoTypeSetPicker(); }; AutoTypeSetPicker.prototype = { initAutoTypeSetPicker:function () { this.initUIBase(); }, getHtmlTpl:function () { var me = this.editor, opt = me.options.autotypeset, lang = me.getLang("autoTypeSet"); var textAlignInputName = 'textAlignValue' + me.uid, imageBlockInputName = 'imageBlockLineValue' + me.uid, symbolConverInputName = 'symbolConverValue' + me.uid; return '
            ' + '
            ' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
            ' + lang.mergeLine + '' + lang.delLine + '
            ' + lang.removeFormat + '' + lang.indent + '
            ' + lang.alignment + '' + '' + me.getLang("justifyleft") + '' + me.getLang("justifycenter") + '' + me.getLang("justifyright") + '
            ' + lang.imageFloat + '' + '' + me.getLang("default") + '' + me.getLang("justifyleft") + '' + me.getLang("justifycenter") + '' + me.getLang("justifyright") + '
            ' + lang.removeFontsize + '' + lang.removeFontFamily + '
            ' + lang.removeHtml + '
            ' + lang.pasteFilter + '
            ' + lang.symbol + '' + '' + lang.bdc2sb + '' + lang.tobdc + '' + '
            ' + '
            ' + '
            '; }, _UIBase_render:UIBase.prototype.render }; utils.inherits(AutoTypeSetPicker, UIBase); })(); // ui/autotypesetbutton.js ///import core ///import uicore ///import ui/popup.js ///import ui/autotypesetpicker.js ///import ui/splitbutton.js (function (){ var utils = baidu.editor.utils, Popup = baidu.editor.ui.Popup, AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker, SplitButton = baidu.editor.ui.SplitButton, AutoTypeSetButton = baidu.editor.ui.AutoTypeSetButton = function (options){ this.initOptions(options); this.initAutoTypeSetButton(); }; function getPara(me){ var opt = {}, cont = me.getDom(), editorId = me.editor.uid, inputType = null, attrName = null, ipts = domUtils.getElementsByTagName(cont,"input"); for(var i=ipts.length-1,ipt;ipt=ipts[i--];){ inputType = ipt.getAttribute("type"); if(inputType=="checkbox"){ attrName = ipt.getAttribute("name"); opt[attrName] && delete opt[attrName]; if(ipt.checked){ var attrValue = document.getElementById( attrName + "Value" + editorId ); if(attrValue){ if(/input/ig.test(attrValue.tagName)){ opt[attrName] = attrValue.value; } else { var iptChilds = attrValue.getElementsByTagName("input"); for(var j=iptChilds.length-1,iptchild;iptchild=iptChilds[j--];){ if(iptchild.checked){ opt[attrName] = iptchild.value; break; } } } } else { opt[attrName] = true; } } else { opt[attrName] = false; } } else { opt[ipt.getAttribute("value")] = ipt.checked; } } var selects = domUtils.getElementsByTagName(cont,"select"); for(var i=0,si;si=selects[i++];){ var attr = si.getAttribute('name'); opt[attr] = opt[attr] ? si.value : ''; } utils.extend(me.editor.options.autotypeset,opt); me.editor.setPreferences('autotypeset', opt); } AutoTypeSetButton.prototype = { initAutoTypeSetButton: function (){ var me = this; this.popup = new Popup({ //传入配置参数 content: new AutoTypeSetPicker({editor:me.editor}), 'editor':me.editor, hide : function(){ if (!this._hidden && this.getDom()) { getPara(this); this.getDom().style.display = 'none'; this._hidden = true; this.fireEvent('hide'); } } }); var flag = 0; this.popup.addListener('postRenderAfter',function(){ var popupUI = this; if(flag)return; var cont = this.getDom(), btn = cont.getElementsByTagName('button')[0]; btn.onclick = function(){ getPara(popupUI); me.editor.execCommand('autotypeset'); popupUI.hide() }; domUtils.on(cont, 'click', function(e) { var target = e.target || e.srcElement, editorId = me.editor.uid; if (target && target.tagName == 'INPUT') { // 点击图片浮动的checkbox,去除对应的radio if (target.name == 'imageBlockLine' || target.name == 'textAlign' || target.name == 'symbolConver') { var checked = target.checked, radioTd = document.getElementById( target.name + 'Value' + editorId), radios = radioTd.getElementsByTagName('input'), defalutSelect = { 'imageBlockLine': 'none', 'textAlign': 'left', 'symbolConver': 'tobdc' }; for (var i = 0; i < radios.length; i++) { if (checked) { if (radios[i].value == defalutSelect[target.name]) { radios[i].checked = 'checked'; } } else { radios[i].checked = false; } } } // 点击radio,选中对应的checkbox if (target.name == ('imageBlockLineValue' + editorId) || target.name == ('textAlignValue' + editorId) || target.name == 'bdc') { var checkboxs = target.parentNode.previousSibling.getElementsByTagName('input'); checkboxs && (checkboxs[0].checked = true); } getPara(popupUI); } }); flag = 1; }); this.initSplitButton(); } }; utils.inherits(AutoTypeSetButton, SplitButton); })(); // ui/cellalignpicker.js ///import core ///import uicore (function () { var utils = baidu.editor.utils, Popup = baidu.editor.ui.Popup, Stateful = baidu.editor.ui.Stateful, UIBase = baidu.editor.ui.UIBase; /** * 该参数将新增一个参数: selected, 参数类型为一个Object, 形如{ 'align': 'center', 'valign': 'top' }, 表示单元格的初始 * 对齐状态为: 竖直居上,水平居中; 其中 align的取值为:'center', 'left', 'right'; valign的取值为: 'top', 'middle', 'bottom' * @update 2013/4/2 hancong03@baidu.com */ var CellAlignPicker = baidu.editor.ui.CellAlignPicker = function (options) { this.initOptions(options); this.initSelected(); this.initCellAlignPicker(); }; CellAlignPicker.prototype = { //初始化选中状态, 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引 initSelected: function(){ var status = { valign: { top: 0, middle: 1, bottom: 2 }, align: { left: 0, center: 1, right: 2 }, count: 3 }, result = -1; if( this.selected ) { this.selectedIndex = status.valign[ this.selected.valign ] * status.count + status.align[ this.selected.align ]; } }, initCellAlignPicker:function () { this.initUIBase(); this.Stateful_init(); }, getHtmlTpl:function () { var alignType = [ 'left', 'center', 'right' ], COUNT = 9, tempClassName = null, tempIndex = -1, tmpl = []; for( var i= 0; i'); tmpl.push( '
            ' ); tempIndex === 2 && tmpl.push(''); } return '
            ' + '
            ' + '' + tmpl.join('') + '
            ' + '
            ' + '
            '; }, getStateDom: function (){ return this.target; }, _onClick: function (evt){ var target= evt.target || evt.srcElement; if(/icon/.test(target.className)){ this.items[target.parentNode.getAttribute("index")].onclick(); Popup.postHide(evt); } }, _UIBase_render:UIBase.prototype.render }; utils.inherits(CellAlignPicker, UIBase); utils.extend(CellAlignPicker.prototype, Stateful,true); })(); // ui/pastepicker.js ///import core ///import uicore (function () { var utils = baidu.editor.utils, Stateful = baidu.editor.ui.Stateful, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase; var PastePicker = baidu.editor.ui.PastePicker = function (options) { this.initOptions(options); this.initPastePicker(); }; PastePicker.prototype = { initPastePicker:function () { this.initUIBase(); this.Stateful_init(); }, getHtmlTpl:function () { return '
            ' + '
            ' + '
            ' + this.editor.getLang("pasteOpt") + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            ' }, getStateDom:function () { return this.target; }, format:function (param) { this.editor.ui._isTransfer = true; this.editor.fireEvent('pasteTransfer', param); }, _onClick:function (cur) { var node = domUtils.getNextDomNode(cur), screenHt = uiUtils.getViewportRect().height, subPop = uiUtils.getClientRect(node); if ((subPop.top + subPop.height) > screenHt) node.style.top = (-subPop.height - cur.offsetHeight) + "px"; else node.style.top = ""; if (/hidden/ig.test(domUtils.getComputedStyle(node, "visibility"))) { node.style.visibility = "visible"; domUtils.addClass(cur, "edui-state-opened"); } else { node.style.visibility = "hidden"; domUtils.removeClasses(cur, "edui-state-opened") } }, _UIBase_render:UIBase.prototype.render }; utils.inherits(PastePicker, UIBase); utils.extend(PastePicker.prototype, Stateful, true); })(); // ui/toolbar.js (function (){ var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase, Toolbar = baidu.editor.ui.Toolbar = function (options){ this.initOptions(options); this.initToolbar(); }; Toolbar.prototype = { items: null, initToolbar: function (){ this.items = this.items || []; this.initUIBase(); }, add: function (item,index){ if(index === undefined){ this.items.push(item); }else{ this.items.splice(index,0,item) } }, getHtmlTpl: function (){ var buff = []; for (var i=0; i' + buff.join('') + '
            ' }, postRender: function (){ var box = this.getDom(); for (var i=0; i
            '; }, postRender:function () { }, queryAutoHide:function () { return true; } }; Menu.prototype = { items:null, uiName:'menu', initMenu:function () { this.items = this.items || []; this.initPopup(); this.initItems(); }, initItems:function () { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item == '-') { this.items[i] = this.getSeparator(); } else if (!(item instanceof MenuItem)) { item.editor = this.editor; item.theme = this.editor.options.theme; this.items[i] = this.createItem(item); } } }, getSeparator:function () { return menuSeparator; }, createItem:function (item) { //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 item.menu = this; return new MenuItem(item); }, _Popup_getContentHtmlTpl:Popup.prototype.getContentHtmlTpl, getContentHtmlTpl:function () { if (this.items.length == 0) { return this._Popup_getContentHtmlTpl(); } var buff = []; for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; buff[i] = item.renderHtml(); } return ('
            ' + buff.join('') + '
            '); }, _Popup_postRender:Popup.prototype.postRender, postRender:function () { var me = this; for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; item.ownerMenu = this; item.postRender(); } domUtils.on(this.getDom(), 'mouseover', function (evt) { evt = evt || event; var rel = evt.relatedTarget || evt.fromElement; var el = me.getDom(); if (!uiUtils.contains(el, rel) && el !== rel) { me.fireEvent('over'); } }); this._Popup_postRender(); }, queryAutoHide:function (el) { if (el) { if (uiUtils.contains(this.getDom(), el)) { return false; } for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item.queryAutoHide(el) === false) { return false; } } } }, clearItems:function () { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; clearTimeout(item._showingTimer); clearTimeout(item._closingTimer); if (item.subMenu) { item.subMenu.destroy(); } } this.items = []; }, destroy:function () { if (this.getDom()) { domUtils.remove(this.getDom()); } this.clearItems(); }, dispose:function () { this.destroy(); } }; utils.inherits(Menu, Popup); /** * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 * @type {Function} */ var MenuItem = baidu.editor.ui.MenuItem = function (options) { this.initOptions(options); this.initUIBase(); this.Stateful_init(); if (this.subMenu && !(this.subMenu instanceof Menu)) { if (options.className && options.className.indexOf("aligntd") != -1) { var me = this; //获取单元格对齐初始状态 this.subMenu.selected = this.editor.queryCommandValue( 'cellalignment' ); this.subMenu = new Popup({ content:new CellAlignPicker(this.subMenu), parentMenu:me, editor:me.editor, destroy:function () { if (this.getDom()) { domUtils.remove(this.getDom()); } } }); this.subMenu.addListener("postRenderAfter", function () { domUtils.on(this.getDom(), "mouseover", function () { me.addState('opened'); }); }); } else { this.subMenu = new Menu(this.subMenu); } } }; MenuItem.prototype = { label:'', subMenu:null, ownerMenu:null, uiName:'menuitem', alwalysHoverable:true, getHtmlTpl:function () { return '
            ' + '
            ' + this.renderLabelHtml() + '
            ' + '
            '; }, postRender:function () { var me = this; this.addListener('over', function () { me.ownerMenu.fireEvent('submenuover', me); if (me.subMenu) { me.delayShowSubMenu(); } }); if (this.subMenu) { this.getDom().className += ' edui-hassubmenu'; this.subMenu.render(); this.addListener('out', function () { me.delayHideSubMenu(); }); this.subMenu.addListener('over', function () { clearTimeout(me._closingTimer); me._closingTimer = null; me.addState('opened'); }); this.ownerMenu.addListener('hide', function () { me.hideSubMenu(); }); this.ownerMenu.addListener('submenuover', function (t, subMenu) { if (subMenu !== me) { me.delayHideSubMenu(); } }); this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; this.subMenu.queryAutoHide = function (el) { if (el && uiUtils.contains(me.getDom(), el)) { return false; } return this._bakQueryAutoHide(el); }; } this.getDom().style.tabIndex = '-1'; uiUtils.makeUnselectable(this.getDom()); this.Stateful_postRender(); }, delayShowSubMenu:function () { var me = this; if (!me.isDisabled()) { me.addState('opened'); clearTimeout(me._showingTimer); clearTimeout(me._closingTimer); me._closingTimer = null; me._showingTimer = setTimeout(function () { me.showSubMenu(); }, 250); } }, delayHideSubMenu:function () { var me = this; if (!me.isDisabled()) { me.removeState('opened'); clearTimeout(me._showingTimer); if (!me._closingTimer) { me._closingTimer = setTimeout(function () { if (!me.hasState('opened')) { me.hideSubMenu(); } me._closingTimer = null; }, 400); } } }, renderLabelHtml:function () { return '
            ' + '
            ' + '
            ' + (this.label || '') + '
            '; }, getStateDom:function () { return this.getDom(); }, queryAutoHide:function (el) { if (this.subMenu && this.hasState('opened')) { return this.subMenu.queryAutoHide(el); } }, _onClick:function (event, this_) { if (this.hasState('disabled')) return; if (this.fireEvent('click', event, this_) !== false) { if (this.subMenu) { this.showSubMenu(); } else { Popup.postHide(event); } } }, showSubMenu:function () { var rect = uiUtils.getClientRect(this.getDom()); rect.right -= 5; rect.left += 2; rect.width -= 7; rect.top -= 4; rect.bottom += 4; rect.height += 8; this.subMenu.showAnchorRect(rect, true, true); }, hideSubMenu:function () { this.subMenu.hide(); } }; utils.inherits(MenuItem, UIBase); utils.extend(MenuItem.prototype, Stateful, true); })(); // ui/combox.js ///import core ///import uicore ///import ui/menu.js ///import ui/splitbutton.js (function (){ // todo: menu和item提成通用list var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, Menu = baidu.editor.ui.Menu, SplitButton = baidu.editor.ui.SplitButton, Combox = baidu.editor.ui.Combox = function (options){ this.initOptions(options); this.initCombox(); }; Combox.prototype = { uiName: 'combox', onbuttonclick:function () { this.showPopup(); }, initCombox: function (){ var me = this; this.items = this.items || []; for (var i=0; i vpRect.right) { left = vpRect.right - rect.width; } var top = offset.top; if (top + rect.height > vpRect.bottom) { top = vpRect.bottom - rect.height; } el.style.left = Math.max(left, 0) + 'px'; el.style.top = Math.max(top, 0) + 'px'; }, showAtCenter: function (){ var vpRect = uiUtils.getViewportRect(); if ( !this.fullscreen ) { this.getDom().style.display = ''; var popSize = this.fitSize(); var titleHeight = this.getDom('titlebar').offsetHeight | 0; var left = vpRect.width / 2 - popSize.width / 2; var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight; var popEl = this.getDom(); this.safeSetOffset({ left: Math.max(left | 0, 0), top: Math.max(top | 0, 0) }); if (!domUtils.hasClass(popEl, 'edui-state-centered')) { popEl.className += ' edui-state-centered'; } } else { var dialogWrapNode = this.getDom(), contentNode = this.getDom('content'); dialogWrapNode.style.display = "block"; var wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ), contentRect = UE.ui.uiUtils.getClientRect( contentNode ); dialogWrapNode.style.left = "-100000px"; contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + "px"; contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + "px"; dialogWrapNode.style.width = vpRect.width + "px"; dialogWrapNode.style.height = vpRect.height + "px"; dialogWrapNode.style.left = 0; //保存环境的overflow值 this._originalContext = { html: { overflowX: document.documentElement.style.overflowX, overflowY: document.documentElement.style.overflowY }, body: { overflowX: document.body.style.overflowX, overflowY: document.body.style.overflowY } }; document.documentElement.style.overflowX = 'hidden'; document.documentElement.style.overflowY = 'hidden'; document.body.style.overflowX = 'hidden'; document.body.style.overflowY = 'hidden'; } this._show(); }, getContentHtml: function (){ var contentHtml = ''; if (typeof this.content == 'string') { contentHtml = this.content; } else if (this.iframeUrl) { contentHtml = ''; } return contentHtml; }, getHtmlTpl: function (){ var footHtml = ''; if (this.buttons) { var buff = []; for (var i=0; i' + buff.join('') + '
            ' + '
            '; } return '
            ' + '
            ' + '
            ' + '
            ' + '' + (this.title || '') + '' + '
            ' + this.closeButton.renderHtml() + '
            ' + '
            '+ ( this.autoReset ? '' : this.getContentHtml()) +'
            ' + footHtml + '
            '; }, postRender: function (){ // todo: 保持居中/记住上次关闭位置选项 if (!this.modalMask.getDom()) { this.modalMask.render(); this.modalMask.hide(); } if (!this.dragMask.getDom()) { this.dragMask.render(); this.dragMask.hide(); } var me = this; this.addListener('show', function (){ me.modalMask.show(this.getDom().style.zIndex - 2); }); this.addListener('hide', function (){ me.modalMask.hide(); }); if (this.buttons) { for (var i=0; i'; me.editor.container.style.zIndex && (this.getDom().style.zIndex = me.editor.container.style.zIndex * 1 + 1); } } // canSideUp:false, // canSideLeft:false }); this.onbuttonclick = function(){ this.showPopup(); }; this.initSplitButton(); } }; utils.inherits(MultiMenuPop, SplitButton); })(); // ui/shortcutmenu.js (function () { var UI = baidu.editor.ui, UIBase = UI.UIBase, uiUtils = UI.uiUtils, utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils; var allMenus = [],//存储所有快捷菜单 timeID, isSubMenuShow = false;//是否有子pop显示 var ShortCutMenu = UI.ShortCutMenu = function (options) { this.initOptions (options); this.initShortCutMenu (); }; ShortCutMenu.postHide = hideAllMenu; ShortCutMenu.prototype = { isHidden : true , SPACE : 5 , initShortCutMenu : function () { this.items = this.items || []; this.initUIBase (); this.initItems (); this.initEvent (); allMenus.push (this); } , initEvent : function () { var me = this, doc = me.editor.document; domUtils.on (doc , "mousemove" , function (e) { if (me.isHidden === false) { //有pop显示就不隐藏快捷菜单 if (me.getSubMenuMark () || me.eventType == "contextmenu") return; var flag = true, el = me.getDom (), wt = el.offsetWidth, ht = el.offsetHeight, distanceX = wt / 2 + me.SPACE,//距离中心X标准 distanceY = ht / 2,//距离中心Y标准 x = Math.abs (e.screenX - me.left),//离中心距离横坐标 y = Math.abs (e.screenY - me.top);//离中心距离纵坐标 clearTimeout (timeID); timeID = setTimeout (function () { if (y > 0 && y < distanceY) { me.setOpacity (el , "1"); } else if (y > distanceY && y < distanceY + 70) { me.setOpacity (el , "0.5"); flag = false; } else if (y > distanceY + 70 && y < distanceY + 140) { me.hide (); } if (flag && x > 0 && x < distanceX) { me.setOpacity (el , "1") } else if (x > distanceX && x < distanceX + 70) { me.setOpacity (el , "0.5") } else if (x > distanceX + 70 && x < distanceX + 140) { me.hide (); } }); } }); //ie\ff下 mouseout不准 if (browser.chrome) { domUtils.on (doc , "mouseout" , function (e) { var relatedTgt = e.relatedTarget || e.toElement; if (relatedTgt == null || relatedTgt.tagName == "HTML") { me.hide (); } }); } me.editor.addListener ("afterhidepop" , function () { if (!me.isHidden) { isSubMenuShow = true; } }); } , initItems : function () { if (utils.isArray (this.items)) { for (var i = 0, len = this.items.length ; i < len ; i++) { var item = this.items[i].toLowerCase (); if (UI[item]) { this.items[i] = new UI[item] (this.editor); this.items[i].className += " edui-shortcutsubmenu "; } } } } , setOpacity : function (el , value) { if (browser.ie && browser.version < 9) { el.style.filter = "alpha(opacity = " + parseFloat (value) * 100 + ");" } else { el.style.opacity = value; } } , getSubMenuMark : function () { isSubMenuShow = false; var layerEle = uiUtils.getFixedLayer (); var list = domUtils.getElementsByTagName (layerEle , "div" , function (node) { return domUtils.hasClass (node , "edui-shortcutsubmenu edui-popup") }); for (var i = 0, node ; node = list[i++] ;) { if (node.style.display != "none") { isSubMenuShow = true; } } return isSubMenuShow; } , show : function (e , hasContextmenu) { var me = this, offset = {}, el = this.getDom (), fixedlayer = uiUtils.getFixedLayer (); function setPos (offset) { if (offset.left < 0) { offset.left = 0; } if (offset.top < 0) { offset.top = 0; } el.style.cssText = "position:absolute;left:" + offset.left + "px;top:" + offset.top + "px;"; } function setPosByCxtMenu (menu) { if (!menu.tagName) { menu = menu.getDom (); } offset.left = parseInt (menu.style.left); offset.top = parseInt (menu.style.top); offset.top -= el.offsetHeight + 15; setPos (offset); } me.eventType = e.type; el.style.cssText = "display:block;left:-9999px"; if (e.type == "contextmenu" && hasContextmenu) { var menu = domUtils.getElementsByTagName (fixedlayer , "div" , "edui-contextmenu")[0]; if (menu) { setPosByCxtMenu (menu) } else { me.editor.addListener ("aftershowcontextmenu" , function (type , menu) { setPosByCxtMenu (menu); }); } } else { offset = uiUtils.getViewportOffsetByEvent (e); offset.top -= el.offsetHeight + me.SPACE; offset.left += me.SPACE + 20; setPos (offset); me.setOpacity (el , 0.2); } me.isHidden = false; me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; me.top = e.screenY - (el.offsetHeight / 2) - me.SPACE; if (me.editor) { el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; fixedlayer.style.zIndex = el.style.zIndex - 1; } } , hide : function () { if (this.getDom ()) { this.getDom ().style.display = "none"; } this.isHidden = true; } , postRender : function () { if (utils.isArray (this.items)) { for (var i = 0, item ; item = this.items[i++] ;) { item.postRender (); } } } , getHtmlTpl : function () { var buff; if (utils.isArray (this.items)) { buff = []; for (var i = 0 ; i < this.items.length ; i++) { buff[i] = this.items[i].renderHtml (); } buff = buff.join (""); } else { buff = this.items; } return '
            ' + buff + '
            '; } }; utils.inherits (ShortCutMenu , UIBase); function hideAllMenu (e) { var tgt = e.target || e.srcElement, cur = domUtils.findParent (tgt , function (node) { return domUtils.hasClass (node , "edui-shortcutmenu") || domUtils.hasClass (node , "edui-popup"); } , true); if (!cur) { for (var i = 0, menu ; menu = allMenus[i++] ;) { menu.hide () } } } domUtils.on (document , 'mousedown' , function (e) { hideAllMenu (e); }); domUtils.on (window , 'scroll' , function (e) { hideAllMenu (e); }); }) (); // ui/breakline.js (function (){ var utils = baidu.editor.utils, UIBase = baidu.editor.ui.UIBase, Breakline = baidu.editor.ui.Breakline = function (options){ this.initOptions(options); this.initSeparator(); }; Breakline.prototype = { uiName: 'Breakline', initSeparator: function (){ this.initUIBase(); }, getHtmlTpl: function (){ return '
            '; } }; utils.inherits(Breakline, UIBase); })(); // ui/message.js ///import core ///import uicore (function () { var utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils, UIBase = baidu.editor.ui.UIBase, Message = baidu.editor.ui.Message = function (options){ this.initOptions(options); this.initMessage(); }; Message.prototype = { initMessage: function (){ this.initUIBase(); }, getHtmlTpl: function (){ return '
            ' + '
            ×
            ' + '
            ' + ' ' + '
            ' + '
            ' + '
            ' + '
            ' + '
            '; }, reset: function(opt){ var me = this; if (!opt.keepshow) { clearTimeout(this.timer); me.timer = setTimeout(function(){ me.hide(); }, opt.timeout || 4000); } opt.content !== undefined && me.setContent(opt.content); opt.type !== undefined && me.setType(opt.type); me.show(); }, postRender: function(){ var me = this, closer = this.getDom('closer'); closer && domUtils.on(closer, 'click', function(){ me.hide(); }); }, setContent: function(content){ this.getDom('content').innerHTML = content; }, setType: function(type){ type = type || 'info'; var body = this.getDom('body'); body.className = body.className.replace(/edui-message-type-[\w-]+/, 'edui-message-type-' + type); }, getContent: function(){ return this.getDom('content').innerHTML; }, getType: function(){ var arr = this.getDom('body').match(/edui-message-type-([\w-]+)/); return arr ? arr[1]:''; }, show: function (){ this.getDom().style.display = 'block'; }, hide: function (){ var dom = this.getDom(); if (dom) { dom.style.display = 'none'; dom.parentNode && dom.parentNode.removeChild(dom); } } }; utils.inherits(Message, UIBase); })(); // adapter/editorui.js //ui跟编辑器的适配層 //那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 //自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化 (function () { var utils = baidu.editor.utils; var editorui = baidu.editor.ui; var _Dialog = editorui.Dialog; editorui.buttons = {}; editorui.Dialog = function (options) { var dialog = new _Dialog(options); dialog.addListener('hide', function () { if (dialog.editor) { var editor = dialog.editor; try { if (browser.gecko) { var y = editor.window.scrollY, x = editor.window.scrollX; editor.body.focus(); editor.window.scrollTo(x, y); } else { editor.focus(); } } catch (ex) { } } }); return dialog; }; var iframeUrlMap = { 'anchor':'~/dialogs/anchor/anchor.html', 'insertimage':'~/dialogs/image/image.html', 'link':'~/dialogs/link/link.html', 'spechars':'~/dialogs/spechars/spechars.html', 'searchreplace':'~/dialogs/searchreplace/searchreplace.html', 'map':'~/dialogs/map/map.html', 'gmap':'~/dialogs/gmap/gmap.html', 'insertvideo':'~/dialogs/video/video.html', 'help':'~/dialogs/help/help.html', 'preview':'~/dialogs/preview/preview.html', 'emotion':'~/dialogs/emotion/emotion.html', 'wordimage':'~/dialogs/wordimage/wordimage.html', 'attachment':'~/dialogs/attachment/attachment.html', 'insertframe':'~/dialogs/insertframe/insertframe.html', 'edittip':'~/dialogs/table/edittip.html', 'edittable':'~/dialogs/table/edittable.html', 'edittd':'~/dialogs/table/edittd.html', 'webapp':'~/dialogs/webapp/webapp.html', 'snapscreen':'~/dialogs/snapscreen/snapscreen.html', 'scrawl':'~/dialogs/scrawl/scrawl.html', 'music':'~/dialogs/music/music.html', 'template':'~/dialogs/template/template.html', 'background':'~/dialogs/background/background.html', 'charts': '~/dialogs/charts/charts.html' }; //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 var btnCmds = ['undo', 'redo', 'formatmatch', 'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase', 'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent', 'blockquote', 'pasteplain', 'pagebreak', 'selectall', 'print','horizontal', 'removeformat', 'time', 'date', 'unlink', 'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow', 'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts']; for (var i = 0, ci; ci = btnCmds[i++];) { ci = ci.toLowerCase(); editorui[ci] = function (cmd) { return function (editor) { var ui = new editorui.Button({ className:'edui-for-' + cmd, title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', onclick:function () { editor.execCommand(cmd); }, theme:editor.options.theme, showText:false }); editorui.buttons[cmd] = ui; editor.addListener('selectionchange', function (type, causeByUi, uiReady) { var state = editor.queryCommandState(cmd); if (state == -1) { ui.setDisabled(true); ui.setChecked(false); } else { if (!uiReady) { ui.setDisabled(false); ui.setChecked(state); } } }); return ui; }; }(ci); } //清除文档 editorui.cleardoc = function (editor) { var ui = new editorui.Button({ className:'edui-for-cleardoc', title:editor.options.labelMap.cleardoc || editor.getLang("labelMap.cleardoc") || '', theme:editor.options.theme, onclick:function () { if (confirm(editor.getLang("confirmClear"))) { editor.execCommand('cleardoc'); } } }); editorui.buttons["cleardoc"] = ui; editor.addListener('selectionchange', function () { ui.setDisabled(editor.queryCommandState('cleardoc') == -1); }); return ui; }; //排版,图片排版,文字方向 var typeset = { 'justify':['left', 'right', 'center', 'justify'], 'imagefloat':['none', 'left', 'center', 'right'], 'directionality':['ltr', 'rtl'] }; for (var p in typeset) { (function (cmd, val) { for (var i = 0, ci; ci = val[i++];) { (function (cmd2) { editorui[cmd.replace('float', '') + cmd2] = function (editor) { var ui = new editorui.Button({ className:'edui-for-' + cmd.replace('float', '') + cmd2, title:editor.options.labelMap[cmd.replace('float', '') + cmd2] || editor.getLang("labelMap." + cmd.replace('float', '') + cmd2) || '', theme:editor.options.theme, onclick:function () { editor.execCommand(cmd, cmd2); } }); editorui.buttons[cmd] = ui; editor.addListener('selectionchange', function (type, causeByUi, uiReady) { ui.setDisabled(editor.queryCommandState(cmd) == -1); ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady); }); return ui; }; })(ci) } })(p, typeset[p]) } //字体颜色和背景颜色 for (var i = 0, ci; ci = ['backcolor', 'forecolor'][i++];) { editorui[ci] = function (cmd) { return function (editor) { var ui = new editorui.ColorButton({ className:'edui-for-' + cmd, color:'default', title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', editor:editor, onpickcolor:function (t, color) { editor.execCommand(cmd, color); }, onpicknocolor:function () { editor.execCommand(cmd, 'default'); this.setColor('transparent'); this.color = 'default'; }, onbuttonclick:function () { editor.execCommand(cmd, this.color); } }); editorui.buttons[cmd] = ui; editor.addListener('selectionchange', function () { ui.setDisabled(editor.queryCommandState(cmd) == -1); }); return ui; }; }(ci); } var dialogBtns = { noOk:['searchreplace', 'help', 'spechars', 'webapp','preview'], ok:['attachment', 'anchor', 'link', 'insertimage', 'map', 'gmap', 'insertframe', 'wordimage', 'insertvideo', 'insertframe', 'edittip', 'edittable', 'edittd', 'scrawl', 'template', 'music', 'background', 'charts'] }; for (var p in dialogBtns) { (function (type, vals) { for (var i = 0, ci; ci = vals[i++];) { //todo opera下存在问题 if (browser.opera && ci === "searchreplace") { continue; } (function (cmd) { editorui[cmd] = function (editor, iframeUrl, title) { iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]; title = editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || ''; var dialog; //没有iframeUrl不创建dialog if (iframeUrl) { dialog = new editorui.Dialog(utils.extend({ iframeUrl:editor.ui.mapUrl(iframeUrl), editor:editor, className:'edui-for-' + cmd, title:title, holdScroll: cmd === 'insertimage', fullscreen: /charts|preview/.test(cmd), closeDialog:editor.getLang("closeDialog") }, type == 'ok' ? { buttons:[ { className:'edui-okbutton', label:editor.getLang("ok"), editor:editor, onclick:function () { dialog.close(true); } }, { className:'edui-cancelbutton', label:editor.getLang("cancel"), editor:editor, onclick:function () { dialog.close(false); } } ] } : {})); editor.ui._dialogs[cmd + "Dialog"] = dialog; } var ui = new editorui.Button({ className:'edui-for-' + cmd, title:title, onclick:function () { if (dialog) { switch (cmd) { case "wordimage": var images = editor.execCommand("wordimage"); if (images && images.length) { dialog.render(); dialog.open(); } break; case "scrawl": if (editor.queryCommandState("scrawl") != -1) { dialog.render(); dialog.open(); } break; default: dialog.render(); dialog.open(); } } }, theme:editor.options.theme, disabled:(cmd == 'scrawl' && editor.queryCommandState("scrawl") == -1) || ( cmd == 'charts' ) }); editorui.buttons[cmd] = ui; editor.addListener('selectionchange', function () { //只存在于右键菜单而无工具栏按钮的ui不需要检测状态 var unNeedCheckState = {'edittable':1}; if (cmd in unNeedCheckState)return; var state = editor.queryCommandState(cmd); if (ui.getDom()) { ui.setDisabled(state == -1); ui.setChecked(state); } }); return ui; }; })(ci.toLowerCase()) } })(p, dialogBtns[p]); } editorui.snapscreen = function (editor, iframeUrl, title) { title = editor.options.labelMap['snapscreen'] || editor.getLang("labelMap.snapscreen") || ''; var ui = new editorui.Button({ className:'edui-for-snapscreen', title:title, onclick:function () { editor.execCommand("snapscreen"); }, theme:editor.options.theme }); editorui.buttons['snapscreen'] = ui; iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})["snapscreen"] || iframeUrlMap["snapscreen"]; if (iframeUrl) { var dialog = new editorui.Dialog({ iframeUrl:editor.ui.mapUrl(iframeUrl), editor:editor, className:'edui-for-snapscreen', title:title, buttons:[ { className:'edui-okbutton', label:editor.getLang("ok"), editor:editor, onclick:function () { dialog.close(true); } }, { className:'edui-cancelbutton', label:editor.getLang("cancel"), editor:editor, onclick:function () { dialog.close(false); } } ] }); dialog.render(); editor.ui._dialogs["snapscreenDialog"] = dialog; } editor.addListener('selectionchange', function () { ui.setDisabled(editor.queryCommandState('snapscreen') == -1); }); return ui; }; editorui.insertcode = function (editor, list, title) { list = editor.options['insertcode'] || []; title = editor.options.labelMap['insertcode'] || editor.getLang("labelMap.insertcode") || ''; // if (!list.length) return; var items = []; utils.each(list,function(key,val){ items.push({ label:key, value:val, theme:editor.options.theme, renderLabelHtml:function () { return '
            ' + (this.label || '') + '
            '; } }); }); var ui = new editorui.Combox({ editor:editor, items:items, onselect:function (t, index) { editor.execCommand('insertcode', this.items[index].value); }, onbuttonclick:function () { this.showPopup(); }, title:title, initValue:title, className:'edui-for-insertcode', indexByValue:function (value) { if (value) { for (var i = 0, ci; ci = this.items[i]; i++) { if (ci.value.indexOf(value) != -1) return i; } } return -1; } }); editorui.buttons['insertcode'] = ui; editor.addListener('selectionchange', function (type, causeByUi, uiReady) { if (!uiReady) { var state = editor.queryCommandState('insertcode'); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); var value = editor.queryCommandValue('insertcode'); if(!value){ ui.setValue(title); return; } //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 value && (value = value.replace(/['"]/g, '').split(',')[0]); ui.setValue(value); } } }); return ui; }; editorui.fontfamily = function (editor, list, title) { list = editor.options['fontfamily'] || []; title = editor.options.labelMap['fontfamily'] || editor.getLang("labelMap.fontfamily") || ''; if (!list.length) return; for (var i = 0, ci, items = []; ci = list[i]; i++) { var langLabel = editor.getLang('fontfamily')[ci.name] || ""; (function (key, val) { items.push({ label:key, value:val, theme:editor.options.theme, renderLabelHtml:function () { return '
            ' + (this.label || '') + '
            '; } }); })(ci.label || langLabel, ci.val) } var ui = new editorui.Combox({ editor:editor, items:items, onselect:function (t, index) { editor.execCommand('FontFamily', this.items[index].value); }, onbuttonclick:function () { this.showPopup(); }, title:title, initValue:title, className:'edui-for-fontfamily', indexByValue:function (value) { if (value) { for (var i = 0, ci; ci = this.items[i]; i++) { if (ci.value.indexOf(value) != -1) return i; } } return -1; } }); editorui.buttons['fontfamily'] = ui; editor.addListener('selectionchange', function (type, causeByUi, uiReady) { if (!uiReady) { var state = editor.queryCommandState('FontFamily'); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); var value = editor.queryCommandValue('FontFamily'); //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 value && (value = value.replace(/['"]/g, '').split(',')[0]); ui.setValue(value); } } }); return ui; }; editorui.fontsize = function (editor, list, title) { title = editor.options.labelMap['fontsize'] || editor.getLang("labelMap.fontsize") || ''; list = list || editor.options['fontsize'] || []; if (!list.length) return; var items = []; for (var i = 0; i < list.length; i++) { var size = list[i] + 'px'; items.push({ label:size, value:size, theme:editor.options.theme, renderLabelHtml:function () { return '
            ' + (this.label || '') + '
            '; } }); } var ui = new editorui.Combox({ editor:editor, items:items, title:title, initValue:title, onselect:function (t, index) { editor.execCommand('FontSize', this.items[index].value); }, onbuttonclick:function () { this.showPopup(); }, className:'edui-for-fontsize' }); editorui.buttons['fontsize'] = ui; editor.addListener('selectionchange', function (type, causeByUi, uiReady) { if (!uiReady) { var state = editor.queryCommandState('FontSize'); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); ui.setValue(editor.queryCommandValue('FontSize')); } } }); return ui; }; editorui.paragraph = function (editor, list, title) { title = editor.options.labelMap['paragraph'] || editor.getLang("labelMap.paragraph") || ''; list = editor.options['paragraph'] || []; if (utils.isEmptyObject(list)) return; var items = []; for (var i in list) { items.push({ value:i, label:list[i] || editor.getLang("paragraph")[i], theme:editor.options.theme, renderLabelHtml:function () { return '
            ' + (this.label || '') + '
            '; } }) } var ui = new editorui.Combox({ editor:editor, items:items, title:title, initValue:title, className:'edui-for-paragraph', onselect:function (t, index) { editor.execCommand('Paragraph', this.items[index].value); }, onbuttonclick:function () { this.showPopup(); } }); editorui.buttons['paragraph'] = ui; editor.addListener('selectionchange', function (type, causeByUi, uiReady) { if (!uiReady) { var state = editor.queryCommandState('Paragraph'); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); var value = editor.queryCommandValue('Paragraph'); var index = ui.indexByValue(value); if (index != -1) { ui.setValue(value); } else { ui.setValue(ui.initValue); } } } }); return ui; }; //自定义标题 editorui.customstyle = function (editor) { var list = editor.options['customstyle'] || [], title = editor.options.labelMap['customstyle'] || editor.getLang("labelMap.customstyle") || ''; if (!list.length)return; var langCs = editor.getLang('customstyle'); for (var i = 0, items = [], t; t = list[i++];) { (function (t) { var ck = {}; ck.label = t.label ? t.label : langCs[t.name]; ck.style = t.style; ck.className = t.className; ck.tag = t.tag; items.push({ label:ck.label, value:ck, theme:editor.options.theme, renderLabelHtml:function () { return '
            ' + '<' + ck.tag + ' ' + (ck.className ? ' class="' + ck.className + '"' : "") + (ck.style ? ' style="' + ck.style + '"' : "") + '>' + ck.label + "<\/" + ck.tag + ">" + '
            '; } }); })(t); } var ui = new editorui.Combox({ editor:editor, items:items, title:title, initValue:title, className:'edui-for-customstyle', onselect:function (t, index) { editor.execCommand('customstyle', this.items[index].value); }, onbuttonclick:function () { this.showPopup(); }, indexByValue:function (value) { for (var i = 0, ti; ti = this.items[i++];) { if (ti.label == value) { return i - 1 } } return -1; } }); editorui.buttons['customstyle'] = ui; editor.addListener('selectionchange', function (type, causeByUi, uiReady) { if (!uiReady) { var state = editor.queryCommandState('customstyle'); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); var value = editor.queryCommandValue('customstyle'); var index = ui.indexByValue(value); if (index != -1) { ui.setValue(value); } else { ui.setValue(ui.initValue); } } } }); return ui; }; editorui.inserttable = function (editor, iframeUrl, title) { title = editor.options.labelMap['inserttable'] || editor.getLang("labelMap.inserttable") || ''; var ui = new editorui.TableButton({ editor:editor, title:title, className:'edui-for-inserttable', onpicktable:function (t, numCols, numRows) { editor.execCommand('InsertTable', {numRows:numRows, numCols:numCols, border:1}); }, onbuttonclick:function () { this.showPopup(); } }); editorui.buttons['inserttable'] = ui; editor.addListener('selectionchange', function () { ui.setDisabled(editor.queryCommandState('inserttable') == -1); }); return ui; }; editorui.lineheight = function (editor) { var val = editor.options.lineheight || []; if (!val.length)return; for (var i = 0, ci, items = []; ci = val[i++];) { items.push({ //todo:写死了 label:ci, value:ci, theme:editor.options.theme, onclick:function () { editor.execCommand("lineheight", this.value); } }) } var ui = new editorui.MenuButton({ editor:editor, className:'edui-for-lineheight', title:editor.options.labelMap['lineheight'] || editor.getLang("labelMap.lineheight") || '', items:items, onbuttonclick:function () { var value = editor.queryCommandValue('LineHeight') || this.value; editor.execCommand("LineHeight", value); } }); editorui.buttons['lineheight'] = ui; editor.addListener('selectionchange', function () { var state = editor.queryCommandState('LineHeight'); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); var value = editor.queryCommandValue('LineHeight'); value && ui.setValue((value + '').replace(/cm/, '')); ui.setChecked(state) } }); return ui; }; var rowspacings = ['top', 'bottom']; for (var r = 0, ri; ri = rowspacings[r++];) { (function (cmd) { editorui['rowspacing' + cmd] = function (editor) { var val = editor.options['rowspacing' + cmd] || []; if (!val.length) return null; for (var i = 0, ci, items = []; ci = val[i++];) { items.push({ label:ci, value:ci, theme:editor.options.theme, onclick:function () { editor.execCommand("rowspacing", this.value, cmd); } }) } var ui = new editorui.MenuButton({ editor:editor, className:'edui-for-rowspacing' + cmd, title:editor.options.labelMap['rowspacing' + cmd] || editor.getLang("labelMap.rowspacing" + cmd) || '', items:items, onbuttonclick:function () { var value = editor.queryCommandValue('rowspacing', cmd) || this.value; editor.execCommand("rowspacing", value, cmd); } }); editorui.buttons[cmd] = ui; editor.addListener('selectionchange', function () { var state = editor.queryCommandState('rowspacing', cmd); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); var value = editor.queryCommandValue('rowspacing', cmd); value && ui.setValue((value + '').replace(/%/, '')); ui.setChecked(state) } }); return ui; } })(ri) } //有序,无序列表 var lists = ['insertorderedlist', 'insertunorderedlist']; for (var l = 0, cl; cl = lists[l++];) { (function (cmd) { editorui[cmd] = function (editor) { var vals = editor.options[cmd], _onMenuClick = function () { editor.execCommand(cmd, this.value); }, items = []; for (var i in vals) { items.push({ label:vals[i] || editor.getLang()[cmd][i] || "", value:i, theme:editor.options.theme, onclick:_onMenuClick }) } var ui = new editorui.MenuButton({ editor:editor, className:'edui-for-' + cmd, title:editor.getLang("labelMap." + cmd) || '', 'items':items, onbuttonclick:function () { var value = editor.queryCommandValue(cmd) || this.value; editor.execCommand(cmd, value); } }); editorui.buttons[cmd] = ui; editor.addListener('selectionchange', function () { var state = editor.queryCommandState(cmd); if (state == -1) { ui.setDisabled(true); } else { ui.setDisabled(false); var value = editor.queryCommandValue(cmd); ui.setValue(value); ui.setChecked(state) } }); return ui; }; })(cl) } editorui.fullscreen = function (editor, title) { title = editor.options.labelMap['fullscreen'] || editor.getLang("labelMap.fullscreen") || ''; var ui = new editorui.Button({ className:'edui-for-fullscreen', title:title, theme:editor.options.theme, onclick:function () { if (editor.ui) { editor.ui.setFullScreen(!editor.ui.isFullScreen()); } this.setChecked(editor.ui.isFullScreen()); } }); editorui.buttons['fullscreen'] = ui; editor.addListener('selectionchange', function () { var state = editor.queryCommandState('fullscreen'); ui.setDisabled(state == -1); ui.setChecked(editor.ui.isFullScreen()); }); return ui; }; // 表情 editorui["emotion"] = function (editor, iframeUrl) { var cmd = "emotion"; var ui = new editorui.MultiMenuPop({ title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd + "") || '', editor:editor, className:'edui-for-' + cmd, iframeUrl:editor.ui.mapUrl(iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]) }); editorui.buttons[cmd] = ui; editor.addListener('selectionchange', function () { ui.setDisabled(editor.queryCommandState(cmd) == -1) }); return ui; }; editorui.autotypeset = function (editor) { var ui = new editorui.AutoTypeSetButton({ editor:editor, title:editor.options.labelMap['autotypeset'] || editor.getLang("labelMap.autotypeset") || '', className:'edui-for-autotypeset', onbuttonclick:function () { editor.execCommand('autotypeset') } }); editorui.buttons['autotypeset'] = ui; editor.addListener('selectionchange', function () { ui.setDisabled(editor.queryCommandState('autotypeset') == -1); }); return ui; }; /* 简单上传插件 */ editorui["simpleupload"] = function (editor) { var name = 'simpleupload', ui = new editorui.Button({ className:'edui-for-' + name, title:editor.options.labelMap[name] || editor.getLang("labelMap." + name) || '', onclick:function () {}, theme:editor.options.theme, showText:false }); editorui.buttons[name] = ui; editor.addListener('ready', function() { var b = ui.getDom('body'), iconSpan = b.children[0]; editor.fireEvent('simpleuploadbtnready', iconSpan); }); editor.addListener('selectionchange', function (type, causeByUi, uiReady) { var state = editor.queryCommandState(name); if (state == -1) { ui.setDisabled(true); ui.setChecked(false); } else { if (!uiReady) { ui.setDisabled(false); ui.setChecked(state); } } }); return ui; }; })(); // adapter/editor.js ///import core ///commands 全屏 ///commandsName FullScreen ///commandsTitle 全屏 (function () { var utils = baidu.editor.utils, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase, domUtils = baidu.editor.dom.domUtils; var nodeStack = []; function EditorUI(options) { this.initOptions(options); this.initEditorUI(); } EditorUI.prototype = { uiName:'editor', initEditorUI:function () { this.editor.ui = this; this._dialogs = {}; this.initUIBase(); this._initToolbars(); var editor = this.editor, me = this; editor.addListener('ready', function () { //提供getDialog方法 editor.getDialog = function (name) { return editor.ui._dialogs[name + "Dialog"]; }; domUtils.on(editor.window, 'scroll', function (evt) { baidu.editor.ui.Popup.postHide(evt); }); //提供编辑器实时宽高(全屏时宽高不变化) editor.ui._actualFrameWidth = editor.options.initialFrameWidth; UE.browser.ie && UE.browser.version === 6 && editor.container.ownerDocument.execCommand("BackgroundImageCache", false, true); //display bottom-bar label based on config if (editor.options.elementPathEnabled) { editor.ui.getDom('elementpath').innerHTML = '
            ' + editor.getLang("elementPathTip") + ':
            '; } if (editor.options.wordCount) { function countFn() { setCount(editor,me); domUtils.un(editor.document, "click", arguments.callee); } domUtils.on(editor.document, "click", countFn); editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip"); } editor.ui._scale(); if (editor.options.scaleEnabled) { if (editor.autoHeightEnabled) { editor.disableAutoHeight(); } me.enableScale(); } else { me.disableScale(); } if (!editor.options.elementPathEnabled && !editor.options.wordCount && !editor.options.scaleEnabled) { editor.ui.getDom('elementpath').style.display = "none"; editor.ui.getDom('wordcount').style.display = "none"; editor.ui.getDom('scale').style.display = "none"; } if (!editor.selection.isFocus())return; editor.fireEvent('selectionchange', false, true); }); editor.addListener('mousedown', function (t, evt) { var el = evt.target || evt.srcElement; baidu.editor.ui.Popup.postHide(evt, el); baidu.editor.ui.ShortCutMenu.postHide(evt); }); editor.addListener("delcells", function () { if (UE.ui['edittip']) { new UE.ui['edittip'](editor); } editor.getDialog('edittip').open(); }); var pastePop, isPaste = false, timer; editor.addListener("afterpaste", function () { if(editor.queryCommandState('pasteplain')) return; if(baidu.editor.ui.PastePicker){ pastePop = new baidu.editor.ui.Popup({ content:new baidu.editor.ui.PastePicker({editor:editor}), editor:editor, className:'edui-wordpastepop' }); pastePop.render(); } isPaste = true; }); editor.addListener("afterinserthtml", function () { clearTimeout(timer); timer = setTimeout(function () { if (pastePop && (isPaste || editor.ui._isTransfer)) { if(pastePop.isHidden()){ var span = domUtils.createElement(editor.document, 'span', { 'style':"line-height:0px;", 'innerHTML':'\ufeff' }), range = editor.selection.getRange(); range.insertNode(span); var tmp= getDomNode(span, 'firstChild', 'previousSibling'); tmp && pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp); domUtils.remove(span); }else{ pastePop.show(); } delete editor.ui._isTransfer; isPaste = false; } }, 200) }); editor.addListener('contextmenu', function (t, evt) { baidu.editor.ui.Popup.postHide(evt); }); editor.addListener('keydown', function (t, evt) { if (pastePop) pastePop.dispose(evt); var keyCode = evt.keyCode || evt.which; if(evt.altKey&&keyCode==90){ UE.ui.buttons['fullscreen'].onclick(); } }); editor.addListener('wordcount', function (type) { setCount(this,me); }); function setCount(editor,ui) { editor.setOpt({ wordCount:true, maximumWords:10000, wordCountMsg:editor.options.wordCountMsg || editor.getLang("wordCountMsg"), wordOverFlowMsg:editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg") }); var opt = editor.options, max = opt.maximumWords, msg = opt.wordCountMsg , errMsg = opt.wordOverFlowMsg, countDom = ui.getDom('wordcount'); if (!opt.wordCount) { return; } var count = editor.getContentLength(true); if (count > max) { countDom.innerHTML = errMsg; editor.fireEvent("wordcountoverflow"); } else { countDom.innerHTML = msg.replace("{#leave}", max - count).replace("{#count}", count); } } editor.addListener('selectionchange', function () { if (editor.options.elementPathEnabled) { me[(editor.queryCommandState('elementpath') == -1 ? 'dis' : 'en') + 'ableElementPath']() } if (editor.options.scaleEnabled) { me[(editor.queryCommandState('scale') == -1 ? 'dis' : 'en') + 'ableScale'](); } }); var popup = new baidu.editor.ui.Popup({ editor:editor, content:'', className:'edui-bubble', _onEditButtonClick:function () { this.hide(); editor.ui._dialogs.linkDialog.open(); }, _onImgEditButtonClick:function (name) { this.hide(); editor.ui._dialogs[name] && editor.ui._dialogs[name].open(); }, _onImgSetFloat:function (value) { this.hide(); editor.execCommand("imagefloat", value); }, _setIframeAlign:function (value) { var frame = popup.anchorEl; var newFrame = frame.cloneNode(true); switch (value) { case -2: newFrame.setAttribute("align", ""); break; case -1: newFrame.setAttribute("align", "left"); break; case 1: newFrame.setAttribute("align", "right"); break; } frame.parentNode.insertBefore(newFrame, frame); domUtils.remove(frame); popup.anchorEl = newFrame; popup.showAnchor(popup.anchorEl); }, _updateIframe:function () { var frame = editor._iframe = popup.anchorEl; if(domUtils.hasClass(frame, 'ueditor_baidumap')) { editor.selection.getRange().selectNode(frame).select(); editor.ui._dialogs.mapDialog.open(); popup.hide(); } else { editor.ui._dialogs.insertframeDialog.open(); popup.hide(); } }, _onRemoveButtonClick:function (cmdName) { editor.execCommand(cmdName); this.hide(); }, queryAutoHide:function (el) { if (el && el.ownerDocument == editor.document) { if (el.tagName.toLowerCase() == 'img' || domUtils.findParentByTagName(el, 'a', true)) { return el !== popup.anchorEl; } } return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); } }); popup.render(); if (editor.options.imagePopup) { editor.addListener('mouseover', function (t, evt) { evt = evt || window.event; var el = evt.target || evt.srcElement; if (editor.ui._dialogs.insertframeDialog && /iframe/ig.test(el.tagName)) { var html = popup.formatHtml( '' + editor.getLang("property") + ': ' + editor.getLang("default") + '  ' + editor.getLang("justifyleft") + '  ' + editor.getLang("justifyright") + '  ' + ' ' + editor.getLang("modify") + ''); if (html) { popup.getDom('content').innerHTML = html; popup.anchorEl = el; popup.showAnchor(popup.anchorEl); } else { popup.hide(); } } }); editor.addListener('selectionchange', function (t, causeByUi) { if (!causeByUi) return; var html = '', str = "", img = editor.selection.getRange().getClosedNode(), dialogs = editor.ui._dialogs; if (img && img.tagName == 'IMG') { var dialogName = 'insertimageDialog'; if (img.className.indexOf("edui-faked-video") != -1 || img.className.indexOf("edui-upload-video") != -1) { dialogName = "insertvideoDialog" } if (img.className.indexOf("edui-faked-webapp") != -1) { dialogName = "webappDialog" } if (img.src.indexOf("http://api.map.baidu.com") != -1) { dialogName = "mapDialog" } if (img.className.indexOf("edui-faked-music") != -1) { dialogName = "musicDialog" } if (img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1) { dialogName = "gmapDialog" } if (img.getAttribute("anchorname")) { dialogName = "anchorDialog"; html = popup.formatHtml( '' + editor.getLang("property") + ': ' + editor.getLang("modify") + '  ' + '' + editor.getLang("delete") + ''); } if (img.getAttribute("word_img")) { //todo 放到dialog去做查询 editor.word_img = [img.getAttribute("word_img")]; dialogName = "wordimageDialog" } if(domUtils.hasClass(img, 'loadingclass') || domUtils.hasClass(img, 'loaderrorclass')) { dialogName = ""; } if (!dialogs[dialogName]) { return; } str = '' + editor.getLang("property") + ': '+ '' + editor.getLang("default") + '  ' + '' + editor.getLang("justifyleft") + '  ' + '' + editor.getLang("justifyright") + '  ' + '' + editor.getLang("justifycenter") + '  '+ '' + editor.getLang("modify") + ''; !html && (html = popup.formatHtml(str)) } if (editor.ui._dialogs.linkDialog) { var link = editor.queryCommandValue('link'); var url; if (link && (url = (link.getAttribute('_href') || link.getAttribute('href', 2)))) { var txt = url; if (url.length > 30) { txt = url.substring(0, 20) + "..."; } if (html) { html += '
            ' } html += popup.formatHtml( '' + editor.getLang("anthorMsg") + ': ' + txt + '' + ' ' + editor.getLang("modify") + '' + ' ' + editor.getLang("clear") + ''); popup.showAnchor(link); } } if (html) { popup.getDom('content').innerHTML = html; popup.anchorEl = img || link; popup.showAnchor(popup.anchorEl); } else { popup.hide(); } }); } }, _initToolbars:function () { var editor = this.editor; var toolbars = this.toolbars || []; var toolbarUis = []; for (var i = 0; i < toolbars.length; i++) { var toolbar = toolbars[i]; var toolbarUi = new baidu.editor.ui.Toolbar({theme:editor.options.theme}); for (var j = 0; j < toolbar.length; j++) { var toolbarItem = toolbar[j]; var toolbarItemUi = null; if (typeof toolbarItem == 'string') { toolbarItem = toolbarItem.toLowerCase(); if (toolbarItem == '|') { toolbarItem = 'Separator'; } if(toolbarItem == '||'){ toolbarItem = 'Breakline'; } if (baidu.editor.ui[toolbarItem]) { toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); } //fullscreen这里单独处理一下,放到首行去 if (toolbarItem == 'fullscreen') { if (toolbarUis && toolbarUis[0]) { toolbarUis[0].items.splice(0, 0, toolbarItemUi); } else { toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi); } continue; } } else { toolbarItemUi = toolbarItem; } if (toolbarItemUi && toolbarItemUi.id) { toolbarUi.add(toolbarItemUi); } } toolbarUis[i] = toolbarUi; } //接受外部定制的UI utils.each(UE._customizeUI,function(obj,key){ var itemUI,index; if(obj.id && obj.id != editor.key){ return false; } itemUI = obj.execFn.call(editor,editor,key); if(itemUI){ index = obj.index; if(index === undefined){ index = toolbarUi.items.length; } toolbarUi.add(itemUI,index) } }); this.toolbars = toolbarUis; }, getHtmlTpl:function () { return '
            ' + '
            ' + (this.toolbars.length ? '
            ' + this.renderToolbarBoxHtml() + '
            ' : '') + '' + '
            ' + '
            ' + '
            ' + '
            ' + //modify wdcount by matao '
            ' + '' + '' + '' + '
            ' + '
            ' + '
            '; }, showWordImageDialog:function () { this._dialogs['wordimageDialog'].open(); }, renderToolbarBoxHtml:function () { var buff = []; for (var i = 0; i < this.toolbars.length; i++) { buff.push(this.toolbars[i].renderHtml()); } return buff.join(''); }, setFullScreen:function (fullscreen) { var editor = this.editor, container = editor.container.parentNode.parentNode; if (this._fullscreen != fullscreen) { this._fullscreen = fullscreen; this.editor.fireEvent('beforefullscreenchange', fullscreen); if (baidu.editor.browser.gecko) { var bk = editor.selection.getRange().createBookmark(); } if (fullscreen) { while (container.tagName != "BODY") { var position = baidu.editor.dom.domUtils.getComputedStyle(container, "position"); nodeStack.push(position); container.style.position = "static"; container = container.parentNode; } this._bakHtmlOverflow = document.documentElement.style.overflow; this._bakBodyOverflow = document.body.style.overflow; this._bakAutoHeight = this.editor.autoHeightEnabled; this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; if (this._bakAutoHeight) { //当全屏时不能执行自动长高 editor.autoHeightEnabled = false; this.editor.disableAutoHeight(); } document.documentElement.style.overflow = 'hidden'; //修复,滚动条不收起的问题 window.scrollTo(0,window.scrollY); this._bakCssText = this.getDom().style.cssText; this._bakCssText1 = this.getDom('iframeholder').style.cssText; editor.iframe.parentNode.style.width = ''; this._updateFullScreen(); } else { while (container.tagName != "BODY") { container.style.position = nodeStack.shift(); container = container.parentNode; } this.getDom().style.cssText = this._bakCssText; this.getDom('iframeholder').style.cssText = this._bakCssText1; if (this._bakAutoHeight) { editor.autoHeightEnabled = true; this.editor.enableAutoHeight(); } document.documentElement.style.overflow = this._bakHtmlOverflow; document.body.style.overflow = this._bakBodyOverflow; editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + 'px'; window.scrollTo(0, this._bakScrollTop); } if (browser.gecko && editor.body.contentEditable === 'true') { var input = document.createElement('input'); document.body.appendChild(input); editor.body.contentEditable = false; setTimeout(function () { input.focus(); setTimeout(function () { editor.body.contentEditable = true; editor.fireEvent('fullscreenchanged', fullscreen); editor.selection.getRange().moveToBookmark(bk).select(true); baidu.editor.dom.domUtils.remove(input); fullscreen && window.scroll(0, 0); }, 0) }, 0) } if(editor.body.contentEditable === 'true'){ this.editor.fireEvent('fullscreenchanged', fullscreen); this.triggerLayout(); } } }, _updateFullScreen:function () { if (this._fullscreen) { var vpRect = uiUtils.getViewportRect(); this.getDom().style.cssText = 'border:0;position:absolute;left:0;top:' + (this.editor.options.topOffset || 0) + 'px;width:' + vpRect.width + 'px;height:' + vpRect.height + 'px;z-index:' + (this.getDom().style.zIndex * 1 + 100); uiUtils.setViewportOffset(this.getDom(), { left:0, top:this.editor.options.topOffset || 0 }); this.editor.setHeight(vpRect.height - this.getDom('toolbarbox').offsetHeight - this.getDom('bottombar').offsetHeight - (this.editor.options.topOffset || 0),true); //不手动调一下,会导致全屏失效 if(browser.gecko){ try{ window.onresize(); }catch(e){ } } } }, _updateElementPath:function () { var bottom = this.getDom('elementpath'), list; if (this.elementPathEnabled && (list = this.editor.queryCommandValue('elementpath'))) { var buff = []; for (var i = 0, ci; ci = list[i]; i++) { buff[i] = this.formatHtml('' + ci + ''); } bottom.innerHTML = '
            ' + this.editor.getLang("elementPathTip") + ': ' + buff.join(' > ') + '
            '; } else { bottom.style.display = 'none' } }, disableElementPath:function () { var bottom = this.getDom('elementpath'); bottom.innerHTML = ''; bottom.style.display = 'none'; this.elementPathEnabled = false; }, enableElementPath:function () { var bottom = this.getDom('elementpath'); bottom.style.display = ''; this.elementPathEnabled = true; this._updateElementPath(); }, _scale:function () { var doc = document, editor = this.editor, editorHolder = editor.container, editorDocument = editor.document, toolbarBox = this.getDom("toolbarbox"), bottombar = this.getDom("bottombar"), scale = this.getDom("scale"), scalelayer = this.getDom("scalelayer"); var isMouseMove = false, position = null, minEditorHeight = 0, minEditorWidth = editor.options.minFrameWidth, pageX = 0, pageY = 0, scaleWidth = 0, scaleHeight = 0; function down() { position = domUtils.getXY(editorHolder); if (!minEditorHeight) { minEditorHeight = editor.options.minFrameHeight + toolbarBox.offsetHeight + bottombar.offsetHeight; } scalelayer.style.cssText = "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + editorHolder.offsetWidth + "px;height:" + editorHolder.offsetHeight + "px;z-index:" + (editor.options.zIndex + 1); domUtils.on(doc, "mousemove", move); domUtils.on(editorDocument, "mouseup", up); domUtils.on(doc, "mouseup", up); } var me = this; //by xuheng 全屏时关掉缩放 this.editor.addListener('fullscreenchanged', function (e, fullScreen) { if (fullScreen) { me.disableScale(); } else { if (me.editor.options.scaleEnabled) { me.enableScale(); var tmpNode = me.editor.document.createElement('span'); me.editor.body.appendChild(tmpNode); me.editor.body.style.height = Math.max(domUtils.getXY(tmpNode).y, me.editor.iframe.offsetHeight - 20) + 'px'; domUtils.remove(tmpNode) } } }); function move(event) { clearSelection(); var e = event || window.event; pageX = e.pageX || (doc.documentElement.scrollLeft + e.clientX); pageY = e.pageY || (doc.documentElement.scrollTop + e.clientY); scaleWidth = pageX - position.x; scaleHeight = pageY - position.y; if (scaleWidth >= minEditorWidth) { isMouseMove = true; scalelayer.style.width = scaleWidth + 'px'; } if (scaleHeight >= minEditorHeight) { isMouseMove = true; scalelayer.style.height = scaleHeight + "px"; } } function up() { if (isMouseMove) { isMouseMove = false; editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2; editorHolder.style.width = editor.ui._actualFrameWidth + 'px'; editor.setHeight(scalelayer.offsetHeight - bottombar.offsetHeight - toolbarBox.offsetHeight - 2,true); } if (scalelayer) { scalelayer.style.display = "none"; } clearSelection(); domUtils.un(doc, "mousemove", move); domUtils.un(editorDocument, "mouseup", up); domUtils.un(doc, "mouseup", up); } function clearSelection() { if (browser.ie) doc.selection.clear(); else window.getSelection().removeAllRanges(); } this.enableScale = function () { //trace:2868 if (editor.queryCommandState("source") == 1) return; scale.style.display = ""; this.scaleEnabled = true; domUtils.on(scale, "mousedown", down); }; this.disableScale = function () { scale.style.display = "none"; this.scaleEnabled = false; domUtils.un(scale, "mousedown", down); }; }, isFullScreen:function () { return this._fullscreen; }, postRender:function () { UIBase.prototype.postRender.call(this); for (var i = 0; i < this.toolbars.length; i++) { this.toolbars[i].postRender(); } var me = this; var timerId, domUtils = baidu.editor.dom.domUtils, updateFullScreenTime = function () { clearTimeout(timerId); timerId = setTimeout(function () { me._updateFullScreen(); }); }; domUtils.on(window, 'resize', updateFullScreenTime); me.addListener('destroy', function () { domUtils.un(window, 'resize', updateFullScreenTime); clearTimeout(timerId); }) }, showToolbarMsg:function (msg, flag) { this.getDom('toolbarmsg_label').innerHTML = msg; this.getDom('toolbarmsg').style.display = ''; // if (!flag) { var w = this.getDom('upload_dialog'); w.style.display = 'none'; } }, hideToolbarMsg:function () { this.getDom('toolbarmsg').style.display = 'none'; }, mapUrl:function (url) { return url ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '') : '' }, triggerLayout:function () { var dom = this.getDom(); if (dom.style.zoom == '1') { dom.style.zoom = '100%'; } else { dom.style.zoom = '1'; } } }; utils.inherits(EditorUI, baidu.editor.ui.UIBase); var instances = {}; UE.ui.Editor = function (options) { var editor = new UE.Editor(options); editor.options.editor = editor; utils.loadFile(document, { href:editor.options.themePath + editor.options.theme + "/css/ueditor.css", tag:"link", type:"text/css", rel:"stylesheet" }); var oldRender = editor.render; editor.render = function (holder) { if (holder.constructor === String) { editor.key = holder; instances[holder] = editor; } utils.domReady(function () { editor.langIsReady ? renderUI() : editor.addListener("langReady", renderUI); function renderUI() { editor.setOpt({ labelMap:editor.options.labelMap || editor.getLang('labelMap') }); new EditorUI(editor.options); if (holder) { if (holder.constructor === String) { holder = document.getElementById(holder); } holder && holder.getAttribute('name') && ( editor.options.textarea = holder.getAttribute('name')); if (holder && /script|textarea/ig.test(holder.tagName)) { var newDiv = document.createElement('div'); holder.parentNode.insertBefore(newDiv, holder); var cont = holder.value || holder.innerHTML; editor.options.initialContent = /^[\t\r\n ]*$/.test(cont) ? editor.options.initialContent : cont.replace(/>[\n\r\t]+([ ]{4})+/g, '>') .replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<'); holder.className && (newDiv.className = holder.className); holder.style.cssText && (newDiv.style.cssText = holder.style.cssText); if (/textarea/i.test(holder.tagName)) { editor.textarea = holder; editor.textarea.style.display = 'none'; } else { holder.parentNode.removeChild(holder); } if(holder.id){ newDiv.id = holder.id; domUtils.removeAttributes(holder,'id'); } holder = newDiv; holder.innerHTML = ''; } } domUtils.addClass(holder, "edui-" + editor.options.theme); editor.ui.render(holder); var opt = editor.options; //给实例添加一个编辑器的容器引用 editor.container = editor.ui.getDom(); var parents = domUtils.findParents(holder,true); var displays = []; for(var i = 0 ,ci;ci=parents[i];i++){ displays[i] = ci.style.display; ci.style.display = 'block' } if (opt.initialFrameWidth) { opt.minFrameWidth = opt.initialFrameWidth; } else { opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth; var styleWidth = holder.style.width; if(/%$/.test(styleWidth)) { opt.initialFrameWidth = styleWidth; } } if (opt.initialFrameHeight) { opt.minFrameHeight = opt.initialFrameHeight; } else { opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight; } for(var i = 0 ,ci;ci=parents[i];i++){ ci.style.display = displays[i] } //编辑器最外容器设置了高度,会导致,编辑器不占位 //todo 先去掉,没有找到原因 if(holder.style.height){ holder.style.height = '' } editor.container.style.width = opt.initialFrameWidth + (/%$/.test(opt.initialFrameWidth) ? '' : 'px'); editor.container.style.zIndex = opt.zIndex; oldRender.call(editor, editor.ui.getDom('iframeholder')); editor.fireEvent("afteruiready"); } }) }; return editor; }; /** * @file * @name UE * @short UE * @desc UEditor的顶部命名空间 */ /** * @name getEditor * @since 1.2.4+ * @grammar UE.getEditor(id,[opt]) => Editor实例 * @desc 提供一个全局的方法得到编辑器实例 * * * ''id'' 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回 * * ''opt'' 编辑器的可选参数 * @example * UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例 * this.setContent('hello') * }}); * UE.getEditor('containerId'); //返回刚创建的实例 * */ UE.getEditor = function (id, opt) { var editor = instances[id]; if (!editor) { editor = instances[id] = new UE.ui.Editor(opt); editor.render(id); } return editor; }; UE.delEditor = function (id) { var editor; if (editor = instances[id]) { editor.key && editor.destroy(); delete instances[id] } }; UE.registerUI = function(uiName,fn,index,editorId){ utils.each(uiName.split(/\s+/), function (name) { UE._customizeUI[name] = { id : editorId, execFn:fn, index:index }; }) } })(); // adapter/message.js UE.registerUI('message', function(editor) { var editorui = baidu.editor.ui; var Message = editorui.Message; var holder; var _messageItems = []; var me = editor; me.addListener('ready', function(){ holder = document.getElementById(me.ui.id + '_message_holder'); updateHolderPos(); setTimeout(function(){ updateHolderPos(); }, 500); }); me.addListener('showmessage', function(type, opt){ opt = utils.isString(opt) ? { 'content': opt } : opt; var message = new Message({ 'timeout': opt.timeout, 'type': opt.type, 'content': opt.content, 'keepshow': opt.keepshow, 'editor': me }), mid = opt.id || ('msg_' + (+new Date()).toString(36)); message.render(holder); _messageItems[mid] = message; message.reset(opt); updateHolderPos(); return mid; }); me.addListener('updatemessage',function(type, id, opt){ opt = utils.isString(opt) ? { 'content': opt } : opt; var message = _messageItems[id]; message.render(holder); message && message.reset(opt); }); me.addListener('hidemessage',function(type, id){ var message = _messageItems[id]; message && message.hide(); }); function updateHolderPos(){ var toolbarbox = me.ui.getDom('toolbarbox'); if (toolbarbox) { holder.style.top = toolbarbox.offsetHeight + 3 + 'px'; } holder.style.zIndex = Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; } }); // adapter/autosave.js UE.registerUI('autosave', function(editor) { var timer = null,uid = null; editor.on('afterautosave',function(){ clearTimeout(timer); timer = setTimeout(function(){ if(uid){ editor.trigger('hidemessage',uid); } uid = editor.trigger('showmessage',{ content : editor.getLang('autosave.success'), timeout : 2000 }); },2000) }) }); })(); ================================================ FILE: static/common/user/uedit/ueditor.config.js ================================================ /** * ueditor完整配置项 * 可以在这里配置整个编辑器的特性 */ /**************************提示******************************** * 所有被注释的配置项均为UEditor默认值。 * 修改默认配置请首先确保已经完全明确该参数的真实用途。 * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。 * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。 **************************提示********************************/ (function () { /** * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。 * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; */ var URL = window.UEDITOR_HOME_URL || getUEBasePath(); /** * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 */ window.UEDITOR_CONFIG = { //为编辑器实例添加一个路径,这个不能被注释 UEDITOR_HOME_URL: URL // 服务器统一请求接口路径 , serverUrl: "/uploads/index" //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义 , toolbars: [[ 'fullscreen', 'source', '|', 'undo', 'redo', '|', 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|', 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|', 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|', 'directionalityltr', 'directionalityrtl', 'indent', '|', 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|', 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|', 'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|', 'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|', 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|', 'print', 'preview', 'searchreplace', 'drafts', 'help' ]] //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准 //,labelMap:{ // 'anchor':'', 'undo':'' //} //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件: //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase() //,lang:"zh-cn" //,langPath:URL +"lang/" //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件: //现有如下皮肤:default //,theme:'default' //,themePath:URL +"themes/" //,zIndex : 900 //编辑器层级的基数,默认是900 //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 //,charset:"utf-8" //若实例化编辑器的页面手动修改的domain,此处需要设置为true //,customDomain:false //常用配置项目 //,isShow : true //默认显示编辑器 //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值 //,initialContent:'欢迎使用ueditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子 //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了 //,focus:false //初始化时,是否让编辑器获得焦点true或false //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感 //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等 //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件 //indentValue //首行缩进距离,默认是2em //,indentValue:'2em' //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000 //,initialFrameHeight:320 //初始化编辑器高度,默认320 //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况) //启用自动保存 //,enableAutoSave: true //自动保存间隔时间, 单位ms //,saveInterval: 500 //,fullscreen : false //是否开启初始化时即全屏,默认关闭 //,imagePopup:true //图片操作的浮层开关,默认打开 //,autoSyncData:true //自动同步编辑器要提交的数据 //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹 //粘贴只保留标签,去除标签所有属性 //,retainOnlyLabelPasted: false //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 //纯文本粘贴模式下的过滤规则 //'filterTxtRules' : function(){ // function transP(node){ // node.tagName = 'p'; // node.setStyle(); // } // return { // //直接删除及其字节点内容 // '-' : 'script style object iframe embed input select', // 'p': {$:{}}, // 'br':{$:{}}, // 'div':{'$':{}}, // 'li':{'$':{}}, // 'caption':transP, // 'th':transP, // 'tr':transP, // 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, // 'td':function(node){ // //没有内容的td直接删掉 // var txt = !!node.innerText(); // if(txt){ // node.parentNode.insertAfter(UE.uNode.createText('    '),node); // } // node.parentNode.removeChild(node,node.innerText()) // } // } //}() //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串 //insertorderedlist //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 //,'insertorderedlist':{ // //自定的样式 // 'num':'1,2,3...', // 'num1':'1),2),3)...', // 'num2':'(1),(2),(3)...', // 'cn':'一,二,三....', // 'cn1':'一),二),三)....', // 'cn2':'(一),(二),(三)....', // //系统自带 // 'decimal' : '' , //'1,2,3...' // 'lower-alpha' : '' , // 'a,b,c...' // 'lower-roman' : '' , //'i,ii,iii...' // 'upper-alpha' : '' , lang //'A,B,C' // 'upper-roman' : '' //'I,II,III...' //} //insertunorderedlist //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 //,insertunorderedlist : { //自定的样式 // 'dash' :'— 破折号', //-破折号 // 'dot':' 。 小圆圈', //系统自带 // 'circle' : '', // '○ 小圆圈' // 'disc' : '', // '● 小圆点' // 'square' : '' //'■ 小方块' //} //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍 //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径 //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制 //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签 //fontfamily //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准 //,'fontfamily':[ // { label:'',name:'songti',val:'宋体,SimSun'}, // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'}, // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'}, // { label:'',name:'heiti',val:'黑体, SimHei'}, // { label:'',name:'lishu',val:'隶书, SimLi'}, // { label:'',name:'andaleMono',val:'andale mono'}, // { label:'',name:'arial',val:'arial, helvetica,sans-serif'}, // { label:'',name:'arialBlack',val:'arial black,avant garde'}, // { label:'',name:'comicSansMs',val:'comic sans ms'}, // { label:'',name:'impact',val:'impact,chicago'}, // { label:'',name:'timesNewRoman',val:'times new roman'} //] //fontsize //字号 //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36] //paragraph //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准 //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''} //rowspacingtop //段间距 值和显示的名字相同 //,'rowspacingtop':['5', '10', '15', '20', '25'] //rowspacingBottom //段间距 值和显示的名字相同 //,'rowspacingbottom':['5', '10', '15', '20', '25'] //lineheight //行内间距 值和显示的名字相同 //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5'] //customstyle //自定义样式,不支持国际化,此处配置值即可最后显示值 //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置 //尽量使用一些常用的标签 //参数说明 //tag 使用的标签名字 //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同, //style 添加的样式 //每一个对象就是一个自定义的样式 //,'customstyle':[ // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'}, // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'}, // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'} //] //打开右键菜单功能 //,enableContextMenu: true //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准 //,contextMenu:[ // { // label:'', //显示的名称 // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时 // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName // exec:function () { // //this是当前编辑器的实例 // //this.ui._dialogs['inserttableDialog'].open(); // } // } //] //快捷菜单 //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"] //elementPathEnabled //是否启用元素路径,默认是显示 //,elementPathEnabled : true //wordCount //,wordCount:true //是否开启字数统计 //,maximumWords:10000 //允许的最大字符数 //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示 //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示 //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存! //tab //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位 //,tabSize:4 //,tabNode:' ' //removeFormat //清除格式时可以删除的标签和属性 //removeForamtTags标签 //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' //removeFormatAttributes属性 //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign' //undo //可以最多回退的次数,默认20 //,maxUndoCount:20 //当输入的字符数超过该值时,保存一次现场 //,maxInputCount:1 //autoHeightEnabled // 是否自动长高,默认true //,autoHeightEnabled:true //scaleEnabled //是否可以拉伸长高,默认true(当开启时,自动长高失效) //,scaleEnabled:false //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 //autoFloatEnabled //是否保持toolbar的位置不动,默认true //,autoFloatEnabled:true //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 //,topOffset:30 //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) //,toolbarTopOffset:400 //设置远程图片是否抓取到本地保存 //,catchRemoteImageEnable: true //设置是否抓取远程图片 //pageBreakTag //分页标识符,默认是_ueditor_page_break_tag_ //,pageBreakTag:'_ueditor_page_break_tag_' //autotypeset //自动排版参数 //,autotypeset: { // mergeEmptyline: true, //合并空行 // removeClass: true, //去掉冗余的class // removeEmptyline: false, //去掉空行 // textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 // imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 // pasteFilter: false, //根据规则过滤没事粘贴进来的内容 // clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 // clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 // removeEmptyNode: false, // 去掉空节点 // //可以去掉的标签 // removeTagNames: {标签名字:1}, // indent: false, // 行首缩进 // indentValue : '2em', //行首缩进的大小 // bdc2sb: false, // tobdc: false //} //tableDragable //表格是否可以拖拽 //,tableDragable: true //sourceEditor //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror //注意默认codemirror只能在ie8+和非ie中使用 //,sourceEditor:"codemirror" //如果sourceEditor是codemirror,还用配置一下两个参数 //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js" //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js" //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css" //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css" //编辑器初始化完成后是否进入源码模式,默认为否。 //,sourceEditorFirst:false //iframeUrlMap //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径 //,iframeUrlMap:{ // 'anchor':'~/dialogs/anchor/anchor.html', //} //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:'] //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html //, webAppKey: "" //默认过滤规则相关配置项目 //,disabledTableInTable:true //禁止表格嵌套 ,allowDivTransToP:false //允许进入编辑器的div标签自动变成p标签 //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式 // xss 过滤是否开启,inserthtml等操作 ,xssFilterRules: true //input xss过滤 ,inputXssFilter: true //output xss过滤 ,outputXssFilter: true // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js ,whitList: { a: ['target', 'href', 'title', 'class', 'style'], abbr: ['title', 'class', 'style'], address: ['class', 'style'], area: ['shape', 'coords', 'href', 'alt'], article: [], aside: [], audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'], b: ['class', 'style'], bdi: ['dir'], bdo: ['dir'], big: [], blockquote: ['cite', 'class', 'style'], br: [], caption: ['class', 'style'], center: [], cite: [], code: ['class', 'style'], col: ['align', 'valign', 'span', 'width', 'class', 'style'], colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'], dd: ['class', 'style'], del: ['datetime'], details: ['open'], div: ['class', 'style'], dl: ['class', 'style'], dt: ['class', 'style'], em: ['class', 'style'], font: ['color', 'size', 'face'], footer: [], h1: ['class', 'style'], h2: ['class', 'style'], h3: ['class', 'style'], h4: ['class', 'style'], h5: ['class', 'style'], h6: ['class', 'style'], header: [], hr: [], i: ['class', 'style'], img: ['src', 'alt', 'title', 'width', 'height', 'id', '_url', '_src', 'loadingclass', 'class', 'data-latex'], ins: ['datetime'], li: ['class', 'style'], mark: [], nav: [], ol: ['class', 'style'], p: ['class', 'style'], pre: ['class', 'style'], s: [], section:[], small: [], span: ['class', 'style'], sub: ['class', 'style'], sup: ['class', 'style'], strong: ['class', 'style'], table: ['width', 'border', 'align', 'valign', 'class', 'style'], tbody: ['align', 'valign', 'class', 'style'], td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], tfoot: ['align', 'valign', 'class', 'style'], th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], thead: ['align', 'valign', 'class', 'style'], tr: ['rowspan', 'align', 'valign', 'class', 'style'], tt: [], u: [], ul: ['class', 'style'], video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'], source: ['src', 'type'], embed: ['type', 'class', 'pluginspage', 'src', 'width', 'height', 'align', 'style', 'wmode', 'play', 'autoplay','loop', 'menu', 'allowscriptaccess', 'allowfullscreen', 'controls', 'preload'], iframe: ['src', 'class', 'height', 'width', 'max-width', 'max-height', 'align', 'frameborder', 'allowfullscreen'] } }; function getUEBasePath(docUrl, confUrl) { return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath()); } function getConfigFilePath() { var configPath = document.getElementsByTagName('script'); return configPath[ configPath.length - 1 ].src; } function getBasePath(docUrl, confUrl) { var basePath = confUrl; if (/^(\/|\\\\)/.test(confUrl)) { basePath = /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, ''); } else if (!/^[a-z]+:/i.test(confUrl)) { docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ''); basePath = docUrl + "" + confUrl; } return optimizationPath(basePath); } function optimizationPath(path) { var protocol = /^[a-z]+:\/\//.exec(path)[ 0 ], tmp = null, res = []; path = path.replace(protocol, "").split("?")[0].split("#")[0]; path = path.replace(/\\/g, '/').split(/\//); path[ path.length - 1 ] = ""; while (path.length) { if (( tmp = path.shift() ) === "..") { res.pop(); } else if (tmp !== ".") { res.push(tmp); } } return protocol + res.join("/"); } window.UE = { getUEBasePath: getUEBasePath }; })(); ================================================ FILE: static/common/user/uedit/ueditor.parse.js ================================================ /*! * UEditor * version: ueditor * build: Wed Aug 10 2016 11:06:03 GMT+0800 (CST) */ (function(){ (function(){ UE = window.UE || {}; var isIE = !!window.ActiveXObject; //定义utils工具 var utils = { removeLastbs : function(url){ return url.replace(/\/$/,'') }, extend : function(t,s){ var a = arguments, notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; for (var i = 1; i < len; i++) { var x = a[i]; for (var k in x) { if (!notCover || !t.hasOwnProperty(k)) { t[k] = x[k]; } } } return t; }, isIE : isIE, cssRule : isIE ? function(key,style,doc){ var indexList,index; doc = doc || document; if(doc.indexList){ indexList = doc.indexList; }else{ indexList = doc.indexList = {}; } var sheetStyle; if(!indexList[key]){ if(style === undefined){ return '' } sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length); indexList[key] = index; }else{ sheetStyle = doc.styleSheets[indexList[key]]; } if(style === undefined){ return sheetStyle.cssText } sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '') } : function(key,style,doc){ doc = doc || document; var head = doc.getElementsByTagName('head')[0],node; if(!(node = doc.getElementById(key))){ if(style === undefined){ return '' } node = doc.createElement('style'); node.id = key; head.appendChild(node) } if(style === undefined){ return node.innerHTML } if(style !== ''){ node.innerHTML = node.innerHTML + '\n' + style; }else{ head.removeChild(node) } }, domReady : function (onready) { var doc = window.document; if (doc.readyState === "complete") { onready(); }else{ if (isIE) { (function () { if (doc.isReady) return; try { doc.documentElement.doScroll("left"); } catch (error) { setTimeout(arguments.callee, 0); return; } onready(); })(); window.attachEvent('onload', function(){ onready() }); } else { doc.addEventListener("DOMContentLoaded", function () { doc.removeEventListener("DOMContentLoaded", arguments.callee, false); onready(); }, false); window.addEventListener('load', function(){onready()}, false); } } }, each : function(obj, iterator, context) { if (obj == null) return; if (obj.length === +obj.length) { for (var i = 0, l = obj.length; i < l; i++) { if(iterator.call(context, obj[i], i, obj) === false) return false; } } else { for (var key in obj) { if (obj.hasOwnProperty(key)) { if(iterator.call(context, obj[key], key, obj) === false) return false; } } } }, inArray : function(arr,item){ var index = -1; this.each(arr,function(v,i){ if(v === item){ index = i; return false; } }); return index; }, pushItem : function(arr,item){ if(this.inArray(arr,item)==-1){ arr.push(item) } }, trim: function (str) { return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ''); }, indexOf: function (array, item, start) { var index = -1; start = this.isNumber(start) ? start : 0; this.each(array, function (v, i) { if (i >= start && v === item) { index = i; return false; } }); return index; }, hasClass: function (element, className) { className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' '); for (var i = 0, ci, cls = element.className; ci = className[i++];) { if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { return false; } } return i - 1 == className.length; }, addClass:function (elm, classNames) { if(!elm)return; classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ if(!new RegExp('\\b' + ci + '\\b').test(cls)){ cls += ' ' + ci; } } elm.className = utils.trim(cls); }, removeClass:function (elm, classNames) { classNames = this.isArray(classNames) ? classNames : this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') } cls = this.trim(cls).replace(/[ ]{2,}/g,' '); elm.className = cls; !cls && elm.removeAttribute('className'); }, on: function (element, type, handler) { var types = this.isArray(type) ? type : type.split(/\s+/), k = types.length; if (k) while (k--) { type = types[k]; if (element.addEventListener) { element.addEventListener(type, handler, false); } else { if (!handler._d) { handler._d = { els : [] }; } var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); if (!handler._d[key] || index == -1) { if(index == -1){ handler._d.els.push(element); } if(!handler._d[key]){ handler._d[key] = function (evt) { return handler.call(evt.srcElement, evt || window.event); }; } element.attachEvent('on' + type, handler._d[key]); } } } element = null; }, off: function (element, type, handler) { var types = this.isArray(type) ? type : type.split(/\s+/), k = types.length; if (k) while (k--) { type = types[k]; if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else { var key = type + handler.toString(); try{ element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); }catch(e){} if (handler._d && handler._d[key]) { var index = utils.indexOf(handler._d.els,element); if(index!=-1){ handler._d.els.splice(index,1); } handler._d.els.length == 0 && delete handler._d[key]; } } } }, loadFile : function () { var tmpList = []; function getItem(doc,obj){ try{ for(var i= 0,ci;ci=tmpList[i++];){ if(ci.doc === doc && ci.url == (obj.src || obj.href)){ return ci; } } }catch(e){ return null; } } return function (doc, obj, fn) { var item = getItem(doc,obj); if (item) { if(item.ready){ fn && fn(); }else{ item.funs.push(fn) } return; } tmpList.push({ doc:doc, url:obj.src||obj.href, funs:[fn] }); if (!doc.body) { var html = []; for(var p in obj){ if(p == 'tag')continue; html.push(p + '="' + obj[p] + '"') } doc.write('<' + obj.tag + ' ' + html.join(' ') + ' >'); return; } if (obj.id && doc.getElementById(obj.id)) { return; } var element = doc.createElement(obj.tag); delete obj.tag; for (var p in obj) { element.setAttribute(p, obj[p]); } element.onload = element.onreadystatechange = function () { if (!this.readyState || /loaded|complete/.test(this.readyState)) { item = getItem(doc,obj); if (item.funs.length > 0) { item.ready = 1; for (var fi; fi = item.funs.pop();) { fi(); } } element.onload = element.onreadystatechange = null; } }; element.onerror = function(){ throw Error('The load '+(obj.href||obj.src)+' fails,check the url') }; doc.getElementsByTagName("head")[0].appendChild(element); } }() }; utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) { utils['is' + v] = function (obj) { return Object.prototype.toString.apply(obj) == '[object ' + v + ']'; } }); var parselist = {}; UE.parse = { register : function(parseName,fn){ parselist[parseName] = fn; }, load : function(opt){ utils.each(parselist,function(v){ v.call(opt,utils); }) } }; uParse = function(selector,opt){ utils.domReady(function(){ var contents; if(document.querySelectorAll){ contents = document.querySelectorAll(selector) }else{ if(/^#/.test(selector)){ contents = [document.getElementById(selector.replace(/^#/,''))] }else if(/^\./.test(selector)){ var contents = []; utils.each(document.getElementsByTagName('*'),function(node){ if(node.className && new RegExp('\\b' + selector.replace(/^\./,'') + '\\b','i').test(node.className)){ contents.push(node) } }) }else{ contents = document.getElementsByTagName(selector) } } utils.each(contents,function(v){ UE.parse.load(utils.extend({root:v,selector:selector},opt)) }) }) } })(); UE.parse.register('insertcode',function(utils){ var pres = this.root.getElementsByTagName('pre'); if(pres.length){ if(typeof XRegExp == "undefined"){ var jsurl,cssurl; if(this.rootPath !== undefined){ jsurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCore.js'; cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css'; }else{ jsurl = this.highlightJsUrl; cssurl = this.highlightCssUrl; } utils.loadFile(document,{ id : "syntaxhighlighter_css", tag : "link", rel : "stylesheet", type : "text/css", href : cssurl }); utils.loadFile(document,{ id : "syntaxhighlighter_js", src : jsurl, tag : "script", type : "text/javascript", defer : "defer" },function(){ utils.each(pres,function(pi){ if(pi && /brush/i.test(pi.className)){ SyntaxHighlighter.highlight(pi); } }); }); }else{ utils.each(pres,function(pi){ if(pi && /brush/i.test(pi.className)){ SyntaxHighlighter.highlight(pi); } }); } } }); UE.parse.register('table', function (utils) { var me = this, root = this.root, tables = root.getElementsByTagName('table'); if (tables.length) { var selector = this.selector; //追加默认的表格样式 utils.cssRule('table', selector + ' table.noBorderTable td,' + selector + ' table.noBorderTable th,' + selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' + selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' + 'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' + selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' + selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' + selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' + selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' + selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' + selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' + selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' + selector + ' td p{margin:0;padding:0;}', document); //填充空的单元格 utils.each('td th caption'.split(' '), function (tag) { var cells = root.getElementsByTagName(tag); cells.length && utils.each(cells, function (node) { if (!node.firstChild) { node.innerHTML = ' '; } }) }); //表格可排序 var tables = root.getElementsByTagName('table'); utils.each(tables, function (table) { if (/\bsortEnabled\b/.test(table.className)) { utils.on(table, 'click', function(e){ var target = e.target || e.srcElement, cell = findParentByTagName(target, ['td', 'th']); var table = findParentByTagName(target, 'table'), colIndex = utils.indexOf(table.rows[0].cells, cell), sortType = table.getAttribute('data-sort-type'); if(colIndex != -1) { sortTable(table, colIndex, me.tableSortCompareFn || sortType); updateTable(table); } }); } }); //按照标签名查找父节点 function findParentByTagName(target, tagNames) { var i, current = target; tagNames = utils.isArray(tagNames) ? tagNames:[tagNames]; while(current){ for(i = 0;i < tagNames.length; i++) { if(current.tagName == tagNames[i].toUpperCase()) return current; } current = current.parentNode; } return null; } //表格排序 function sortTable(table, sortByCellIndex, compareFn) { var rows = table.rows, trArray = [], flag = rows[0].cells[0].tagName === "TH", lastRowIndex = 0; for (var i = 0,len = rows.length; i < len; i++) { trArray[i] = rows[i]; } var Fn = { 'reversecurrent': function(td1,td2){ return 1; }, 'orderbyasc': function(td1,td2){ var value1 = td1.innerText||td1.textContent, value2 = td2.innerText||td2.textContent; return value1.localeCompare(value2); }, 'reversebyasc': function(td1,td2){ var value1 = td1.innerHTML, value2 = td2.innerHTML; return value2.localeCompare(value1); }, 'orderbynum': function(td1,td2){ var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); if(value1) value1 = +value1[0]; if(value2) value2 = +value2[0]; return (value1||0) - (value2||0); }, 'reversebynum': function(td1,td2){ var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); if(value1) value1 = +value1[0]; if(value2) value2 = +value2[0]; return (value2||0) - (value1||0); } }; //对表格设置排序的标记data-sort-type table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); //th不参与排序 flag && trArray.splice(0, 1); trArray = sort(trArray,function (tr1, tr2) { var result; if (compareFn && typeof compareFn === "function") { result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); } else if (compareFn && typeof compareFn === "number") { result = 1; } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); } else { result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); } return result; }); var fragment = table.ownerDocument.createDocumentFragment(); for (var j = 0, len = trArray.length; j < len; j++) { fragment.appendChild(trArray[j]); } var tbody = table.getElementsByTagName("tbody")[0]; if(!lastRowIndex){ tbody.appendChild(fragment); }else{ tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) } } //冒泡排序 function sort(array, compareFn){ compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);}; for(var i= 0,len = array.length; i 0){ var t = array[i]; array[i] = array[j]; array[j] = t; } } } return array; } //更新表格 function updateTable(table) { //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 if(!utils.hasClass(table.rows[0], "firstRow")) { for(var i = 1; i< table.rows.length; i++) { utils.removeClass(table.rows[i], "firstRow"); } utils.addClass(table.rows[0], "firstRow"); } } } }); UE.parse.register('charts',function( utils ){ utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}'); var resourceRoot = this.rootPath, containers = this.root, sources = null; //不存在指定的根路径, 则直接退出 if ( !resourceRoot ) { return; } if ( sources = parseSources() ) { loadResources(); } function parseSources () { if ( !containers ) { return null; } return extractChartData( containers ); } /** * 提取数据 */ function extractChartData ( rootNode ) { var data = [], tables = rootNode.getElementsByTagName( "table" ); for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) { if ( tableNode.getAttribute( "data-chart" ) !== null ) { data.push( formatData( tableNode ) ); } } return data.length ? data : null; } function formatData ( tableNode ) { var meta = tableNode.getAttribute( "data-chart" ), metaConfig = {}, data = []; //提取table数据 for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) { var rowData = []; for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { var value = ( cell.innerText || cell.textContent || '' ); rowData.push( cell.tagName == 'TH' ? value:(value | 0) ); } data.push( rowData ); } //解析元信息 meta = meta.split( ";" ); for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) { metaData = metaData.split( ":" ); metaConfig[ metaData[ 0 ] ] = metaData[ 1 ]; } return { table: tableNode, meta: metaConfig, data: data }; } //加载资源 function loadResources () { loadJQuery(); } function loadJQuery () { //不存在jquery, 则加载jquery if ( !window.jQuery ) { utils.loadFile(document,{ src : resourceRoot + "/third-party/jquery-1.10.2.min.js", tag : "script", type : "text/javascript", defer : "defer" },function(){ loadHighcharts(); }); } else { loadHighcharts(); } } function loadHighcharts () { //不存在Highcharts, 则加载Highcharts if ( !window.Highcharts ) { utils.loadFile(document,{ src : resourceRoot + "/third-party/highcharts/highcharts.js", tag : "script", type : "text/javascript", defer : "defer" },function(){ loadTypeConfig(); }); } else { loadTypeConfig(); } } //加载图表差异化配置文件 function loadTypeConfig () { utils.loadFile(document,{ src : resourceRoot + "/dialogs/charts/chart.config.js", tag : "script", type : "text/javascript", defer : "defer" },function(){ render(); }); } //渲染图表 function render () { var config = null, chartConfig = null, container = null; for ( var i = 0, len = sources.length; i < len; i++ ) { config = sources[ i ]; chartConfig = analysisConfig( config ); container = createContainer( config.table ); renderChart( container, typeConfig[ config.meta.chartType ], chartConfig ); } } /** * 渲染图表 * @param container 图表容器节点对象 * @param typeConfig 图表类型配置 * @param config 图表通用配置 * */ function renderChart ( container, typeConfig, config ) { $( container ).highcharts( $.extend( {}, typeConfig, { credits: { enabled: false }, exporting: { enabled: false }, title: { text: config.title, x: -20 //center }, subtitle: { text: config.subTitle, x: -20 }, xAxis: { title: { text: config.xTitle }, categories: config.categories }, yAxis: { title: { text: config.yTitle }, plotLines: [{ value: 0, width: 1, color: '#808080' }] }, tooltip: { enabled: true, valueSuffix: config.suffix }, legend: { layout: 'vertical', align: 'right', verticalAlign: 'middle', borderWidth: 1 }, series: config.series } )); } /** * 创建图表的容器 * 新创建的容器会替换掉对应的table对象 * */ function createContainer ( tableNode ) { var container = document.createElement( "div" ); container.className = "edui-chart-container"; tableNode.parentNode.replaceChild( container, tableNode ); return container; } //根据config解析出正确的类别和图表数据信息 function analysisConfig ( config ) { var series = [], //数据类别 categories = [], result = [], data = config.data, meta = config.meta; //数据对齐方式为相反的方式, 需要反转数据 if ( meta.dataFormat != "1" ) { for ( var i = 0, len = data.length; i < len ; i++ ) { for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) { if ( !result[ j ] ) { result[ j ] = []; } result[ j ][ i ] = data[ i ][ j ]; } } data = result; } result = {}; //普通图表 if ( meta.chartType != typeConfig.length - 1 ) { categories = data[ 0 ].slice( 1 ); for ( var i = 1, curData; curData = data[ i ]; i++ ) { series.push( { name: curData[ 0 ], data: curData.slice( 1 ) } ); } result.series = series; result.categories = categories; result.title = meta.title; result.subTitle = meta.subTitle; result.xTitle = meta.xTitle; result.yTitle = meta.yTitle; result.suffix = meta.suffix; } else { var curData = []; for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) { curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] ); } //饼图 series[ 0 ] = { type: 'pie', name: meta.tip, data: curData }; result.series = series; result.title = meta.title; result.suffix = meta.suffix; } return result; } }); UE.parse.register('background', function (utils) { var me = this, root = me.root, p = root.getElementsByTagName('p'), styles; for (var i = 0,ci; ci = p[i++];) { styles = ci.getAttribute('data-background'); if (styles){ ci.parentNode.removeChild(ci); } } //追加默认的表格样式 styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document); }); UE.parse.register('list',function(utils){ var customCss = [], customStyle = { 'cn' : 'cn-1-', 'cn1' : 'cn-2-', 'cn2' : 'cn-3-', 'num' : 'num-1-', 'num1' : 'num-2-', 'num2' : 'num-3-', 'dash' : 'dash', 'dot' : 'dot' }; utils.extend(this,{ liiconpath : 'http://bs.baidu.com/listicon/', listDefaultPaddingLeft : '20' }); var root = this.root, ols = root.getElementsByTagName('ol'), uls = root.getElementsByTagName('ul'), selector = this.selector; if(ols.length){ applyStyle.call(this,ols); } if(uls.length){ applyStyle.call(this,uls); } if(ols.length || uls.length){ customCss.push(selector +' .list-paddingleft-1{padding-left:0}'); customCss.push(selector +' .list-paddingleft-2{padding-left:'+ this.listDefaultPaddingLeft+'px}'); customCss.push(selector +' .list-paddingleft-3{padding-left:'+ this.listDefaultPaddingLeft*2+'px}'); utils.cssRule('list', selector +' ol,'+selector +' ul{margin:0;padding:0;}li{clear:both;}'+customCss.join('\n'), document); } function applyStyle(nodes){ var T = this; utils.each(nodes,function(list){ if(list.className && /custom_/i.test(list.className)){ var listStyle = list.className.match(/custom_(\w+)/)[1]; if(listStyle == 'dash' || listStyle == 'dot'){ utils.pushItem(customCss,selector +' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath +customStyle[listStyle]+'.gif)}'); utils.pushItem(customCss,selector +' ul.custom_'+listStyle+'{list-style:none;} '+ selector +' ul.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); }else{ var index = 1; utils.each(list.childNodes,function(li){ if(li.tagName == 'LI'){ utils.pushItem(customCss,selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath + 'list-'+customStyle[listStyle] +index + '.gif)}'); index++; } }); utils.pushItem(customCss,selector + ' ol.custom_'+listStyle+'{list-style:none;}'+selector+' ol.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); } switch(listStyle){ case 'cn': utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); break; case 'cn1': utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:30px}'); utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); break; case 'cn2': utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:40px}'); utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:55px}'); utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:68px}'); break; case 'num': case 'num1': utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); break; case 'num2': utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:35px}'); utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); break; case 'dash': utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:35px}'); break; case 'dot': utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:20px}'); } } }); } }); UE.parse.register('vedio',function(utils){ var video = this.root.getElementsByTagName('video'), audio = this.root.getElementsByTagName('audio'); document.createElement('video');document.createElement('audio'); if(video.length || audio.length){ var sourcePath = utils.removeLastbs(this.rootPath), jsurl = sourcePath + '/third-party/video-js/video.js', cssurl = sourcePath + '/third-party/video-js/video-js.min.css', swfUrl = sourcePath + '/third-party/video-js/video-js.swf'; if(window.videojs) { videojs.autoSetup(); } else { utils.loadFile(document,{ id : "video_css", tag : "link", rel : "stylesheet", type : "text/css", href : cssurl }); utils.loadFile(document,{ id : "video_js", src : jsurl, tag : "script", type : "text/javascript" },function(){ videojs.options.flash.swf = swfUrl; videojs.autoSetup(); }); } } }); })(); ================================================ FILE: static/common/wangeditor/wangeditor.css ================================================ :root, :host { --w-e-textarea-bg-color: #fff; --w-e-textarea-color: #333; --w-e-textarea-border-color: #ccc; --w-e-textarea-slight-border-color: #e8e8e8; --w-e-textarea-slight-color: #d4d4d4; --w-e-textarea-slight-bg-color: #f5f2f0; --w-e-textarea-selected-border-color: #B4D5FF; --w-e-textarea-handler-bg-color: #4290f7; --w-e-toolbar-color: #595959; --w-e-toolbar-bg-color: #fff; --w-e-toolbar-active-color: #333; --w-e-toolbar-active-bg-color: #f1f1f1; --w-e-toolbar-disabled-color: #999; --w-e-toolbar-border-color: #e8e8e8; --w-e-modal-button-bg-color: #fafafa; --w-e-modal-button-border-color: #d9d9d9; } .w-e-text-container *,.w-e-toolbar *{box-sizing:border-box;margin:0;outline:none;padding:0}.w-e-text-container blockquote,.w-e-text-container li,.w-e-text-container p,.w-e-text-container td,.w-e-text-container th,.w-e-toolbar *{line-height:1.5}.w-e-text-container{background-color:var(--w-e-textarea-bg-color);color:var(--w-e-textarea-color);height:100%;position:relative}.w-e-text-container .w-e-scroll{-webkit-overflow-scrolling:touch;height:100%}.w-e-text-container [data-slate-editor]{word-wrap:break-word;border-top:1px solid transparent;min-height:100%;outline:0;padding:0 10px;white-space:pre-wrap}.w-e-text-container [data-slate-editor] p{margin:15px 0}.w-e-text-container [data-slate-editor] h1,.w-e-text-container [data-slate-editor] h2,.w-e-text-container [data-slate-editor] h3,.w-e-text-container [data-slate-editor] h4,.w-e-text-container [data-slate-editor] h5{margin:20px 0}.w-e-text-container [data-slate-editor] img{cursor:default;display:inline!important;max-width:100%;min-height:20px;min-width:20px}.w-e-text-container [data-slate-editor] span{text-indent:0}.w-e-text-container [data-slate-editor] [data-selected=true]{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-placeholder{font-style:italic;left:10px;top:17px;width:90%}.w-e-max-length-info,.w-e-text-placeholder{color:var(--w-e-textarea-slight-color);pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.w-e-max-length-info{bottom:.5em;right:1em}.w-e-bar{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-color);font-size:14px;padding:0 5px}.w-e-bar svg{fill:var(--w-e-toolbar-color);height:14px;width:14px}.w-e-bar-show{display:flex}.w-e-bar-hidden{display:none}.w-e-hover-bar{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 5px #0000001f;position:absolute}.w-e-toolbar{flex-wrap:wrap;position:relative}.w-e-bar-divider{background-color:var(--w-e-toolbar-border-color);display:inline-flex;height:40px;margin:0 5px;width:1px}.w-e-bar-item{display:flex;height:40px;padding:4px;position:relative;text-align:center}.w-e-bar-item,.w-e-bar-item button{align-items:center;justify-content:center}.w-e-bar-item button{background:transparent;border:none;color:var(--w-e-toolbar-color);cursor:pointer;display:inline-flex;height:32px;overflow:hidden;padding:0 8px;white-space:nowrap}.w-e-bar-item button:hover{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item button .title{margin-left:5px}.w-e-bar-item .active{background-color:var(--w-e-toolbar-active-bg-color);color:var(--w-e-toolbar-active-color)}.w-e-bar-item .disabled{color:var(--w-e-toolbar-disabled-color);cursor:not-allowed}.w-e-bar-item .disabled svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover{background-color:var(--w-e-toolbar-bg-color);color:var(--w-e-toolbar-disabled-color)}.w-e-bar-item .disabled:hover svg{fill:var(--w-e-toolbar-disabled-color)}.w-e-menu-tooltip-v5:before{background-color:var(--w-e-toolbar-active-color);border-radius:5px;color:var(--w-e-toolbar-bg-color);content:attr(data-tooltip);font-size:.75em;opacity:0;padding:5px 10px;position:absolute;text-align:center;top:40px;transition:opacity .6s;visibility:hidden;white-space:pre;z-index:1}.w-e-menu-tooltip-v5:after{border:5px solid transparent;border-bottom:5px solid var(--w-e-toolbar-active-color);content:"";opacity:0;position:absolute;top:30px;transition:opacity .6s;visibility:hidden}.w-e-menu-tooltip-v5:hover:after,.w-e-menu-tooltip-v5:hover:before{opacity:1;visibility:visible}.w-e-menu-tooltip-v5.tooltip-right:before{left:100%;top:10px}.w-e-menu-tooltip-v5.tooltip-right:after{border-bottom-color:transparent;border-left-color:transparent;border-right-color:var(--w-e-toolbar-active-color);border-top-color:transparent;left:100%;margin-left:-10px;top:16px}.w-e-bar-item-group .w-e-bar-item-menus-container{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;display:none;left:0;margin-top:40px;position:absolute;top:0;z-index:1}.w-e-bar-item-group:hover .w-e-bar-item-menus-container{display:block}.w-e-select-list{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;left:0;margin-top:40px;max-height:350px;min-width:100px;overflow-y:auto;position:absolute;top:0;z-index:1}.w-e-select-list ul{line-height:1;list-style:none}.w-e-select-list ul .selected{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li{cursor:pointer;padding:7px 0 7px 25px;position:relative;text-align:left;white-space:nowrap}.w-e-select-list ul li:hover{background-color:var(--w-e-toolbar-active-bg-color)}.w-e-select-list ul li svg{left:0;margin-left:5px;margin-top:-7px;position:absolute;top:50%}.w-e-bar-bottom .w-e-select-list{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-drop-panel{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;margin-top:40px;min-width:200px;padding:10px;position:absolute;top:0;z-index:1}.w-e-bar-bottom .w-e-drop-panel{bottom:0;margin-bottom:40px;margin-top:0;top:inherit}.w-e-modal{background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-toolbar-border-color);border-radius:3px;box-shadow:0 2px 10px #0000001f;color:var(--w-e-toolbar-color);font-size:14px;min-height:40px;min-width:100px;padding:20px 15px 0;position:absolute;text-align:left;z-index:1}.w-e-modal .btn-close{cursor:pointer;line-height:1;padding:5px;position:absolute;right:8px;top:7px}.w-e-modal .btn-close svg{fill:var(--w-e-toolbar-color);height:10px;width:10px}.w-e-modal .babel-container{display:block;margin-bottom:15px}.w-e-modal .babel-container span{display:block;margin-bottom:10px}.w-e-modal .button-container{margin-bottom:15px}.w-e-modal button{background-color:var(--w-e-modal-button-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);cursor:pointer;font-weight:400;height:32px;padding:4.5px 15px;text-align:center;touch-action:manipulation;transition:all .3s cubic-bezier(.645,.045,.355,1);-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.w-e-modal input[type=number],.w-e-modal input[type=text],.w-e-modal textarea{font-feature-settings:"tnum";background-color:var(--w-e-toolbar-bg-color);border:1px solid var(--w-e-modal-button-border-color);border-radius:4px;color:var(--w-e-toolbar-color);font-variant:tabular-nums;padding:4.5px 11px;transition:all .3s;width:100%}.w-e-modal textarea{min-height:60px}body .w-e-modal,body .w-e-modal *{box-sizing:border-box}.w-e-progress-bar{background-color:var(--w-e-textarea-handler-bg-color);height:1px;position:absolute;transition:width .3s;width:0}.w-e-full-screen-container{bottom:0!important;display:flex!important;flex-direction:column!important;height:100%!important;left:0!important;margin:0!important;padding:0!important;position:fixed;right:0!important;top:0!important;width:100%!important}.w-e-full-screen-container [data-w-e-textarea=true]{flex:1!important} .w-e-text-container [data-slate-editor] code{background-color:var(--w-e-textarea-slight-bg-color);border-radius:3px;font-family:monospace;padding:3px}.w-e-panel-content-color{list-style:none;text-align:left;width:230px}.w-e-panel-content-color li{border:1px solid var(--w-e-toolbar-bg-color);border-radius:3px 3px;cursor:pointer;display:inline-block;padding:2px}.w-e-panel-content-color li:hover{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color li .color-block{border:1px solid var(--w-e-toolbar-border-color);border-radius:3px 3px;height:17px;width:17px}.w-e-panel-content-color .active{border-color:var(--w-e-toolbar-color)}.w-e-panel-content-color .clear{line-height:1.5;margin-bottom:5px;width:100%}.w-e-panel-content-color .clear svg{height:16px;margin-bottom:-4px;width:16px}.w-e-text-container [data-slate-editor] blockquote{background-color:var(--w-e-textarea-slight-bg-color);border-left:8px solid var(--w-e-textarea-selected-border-color);display:block;font-size:100%;line-height:1.5;margin:10px 0;padding:10px}.w-e-panel-content-emotion{font-size:20px;list-style:none;text-align:left;width:300px}.w-e-panel-content-emotion li{border-radius:3px 3px;cursor:pointer;display:inline-block;padding:0 5px}.w-e-panel-content-emotion li:hover{background-color:var(--w-e-textarea-slight-bg-color)}.w-e-textarea-divider{border-radius:3px;margin:20px auto;padding:20px}.w-e-textarea-divider hr{background-color:var(--w-e-textarea-border-color);border:0;display:block;height:1px}.w-e-text-container [data-slate-editor] pre>code{background-color:var(--w-e-textarea-slight-bg-color);border:1px solid var(--w-e-textarea-slight-border-color);border-radius:4px 4px;display:block;font-size:14px;padding:10px;text-indent:0}.w-e-text-container [data-slate-editor] .w-e-image-container{display:inline-block;margin:0 3px}.w-e-text-container [data-slate-editor] .w-e-image-container:hover{box-shadow:0 0 0 2px var(--w-e-textarea-selected-border-color)}.w-e-text-container [data-slate-editor] .w-e-selected-image-container{overflow:hidden;position:relative}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .w-e-image-dragger{background-color:var(--w-e-textarea-handler-bg-color);height:7px;position:absolute;width:7px}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-top{cursor:nwse-resize;left:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-top{cursor:nesw-resize;right:0;top:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .left-bottom{bottom:0;cursor:nesw-resize;left:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container .right-bottom{bottom:0;cursor:nwse-resize;right:0}.w-e-text-container [data-slate-editor] .w-e-selected-image-container:hover{box-shadow:none}.w-e-text-container [contenteditable=false] .w-e-image-container:hover{box-shadow:none} .w-e-text-container [data-slate-editor] .table-container{border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin-top:10px;overflow-x:auto;padding:10px;width:100%}.w-e-text-container [data-slate-editor] table{border-collapse:collapse}.w-e-text-container [data-slate-editor] table td,.w-e-text-container [data-slate-editor] table th{border:1px solid var(--w-e-textarea-border-color);line-height:1.5;min-width:30px;padding:3px 5px;text-align:left}.w-e-text-container [data-slate-editor] table th{background-color:var(--w-e-textarea-slight-bg-color);font-weight:700;text-align:center}.w-e-panel-content-table{background-color:var(--w-e-toolbar-bg-color)}.w-e-panel-content-table table{border-collapse:collapse}.w-e-panel-content-table td{border:1px solid var(--w-e-toolbar-border-color);cursor:pointer;height:15px;padding:3px 5px;width:20px}.w-e-panel-content-table td.active{background-color:var(--w-e-toolbar-active-bg-color)} .w-e-textarea-video-container{background-image:linear-gradient(45deg,#eee 25%,transparent 0,transparent 75%,#eee 0,#eee),linear-gradient(45deg,#eee 25%,#fff 0,#fff 75%,#eee 0,#eee);background-position:0 0,10px 10px;background-size:20px 20px;border:1px dashed var(--w-e-textarea-border-color);border-radius:5px;margin:10px auto 0;padding:10px 0;text-align:center} .w-e-text-container [data-slate-editor] pre>code{word-wrap:normal;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;-webkit-hyphens:none;hyphens:none;line-height:1.5;margin:.5em 0;overflow:auto;padding:1em;-moz-tab-size:4;-o-tab-size:4;tab-size:4;text-align:left;text-shadow:0 1px #fff;white-space:pre;word-break:normal;word-spacing:normal}.w-e-text-container [data-slate-editor] pre>code .token.cdata,.w-e-text-container [data-slate-editor] pre>code .token.comment,.w-e-text-container [data-slate-editor] pre>code .token.doctype,.w-e-text-container [data-slate-editor] pre>code .token.prolog{color:#708090}.w-e-text-container [data-slate-editor] pre>code .token.punctuation{color:#999}.w-e-text-container [data-slate-editor] pre>code .token.namespace{opacity:.7}.w-e-text-container [data-slate-editor] pre>code .token.boolean,.w-e-text-container [data-slate-editor] pre>code .token.constant,.w-e-text-container [data-slate-editor] pre>code .token.deleted,.w-e-text-container [data-slate-editor] pre>code .token.number,.w-e-text-container [data-slate-editor] pre>code .token.property,.w-e-text-container [data-slate-editor] pre>code .token.symbol,.w-e-text-container [data-slate-editor] pre>code .token.tag{color:#905}.w-e-text-container [data-slate-editor] pre>code .token.attr-name,.w-e-text-container [data-slate-editor] pre>code .token.builtin,.w-e-text-container [data-slate-editor] pre>code .token.char,.w-e-text-container [data-slate-editor] pre>code .token.inserted,.w-e-text-container [data-slate-editor] pre>code .token.selector,.w-e-text-container [data-slate-editor] pre>code .token.string{color:#690}.w-e-text-container [data-slate-editor] pre>code .language-css .token.string,.w-e-text-container [data-slate-editor] pre>code .style .token.string,.w-e-text-container [data-slate-editor] pre>code .token.entity,.w-e-text-container [data-slate-editor] pre>code .token.operator,.w-e-text-container [data-slate-editor] pre>code .token.url{color:#9a6e3a}.w-e-text-container [data-slate-editor] pre>code .token.atrule,.w-e-text-container [data-slate-editor] pre>code .token.attr-value,.w-e-text-container [data-slate-editor] pre>code .token.keyword{color:#07a}.w-e-text-container [data-slate-editor] pre>code .token.class-name,.w-e-text-container [data-slate-editor] pre>code .token.function{color:#dd4a68}.w-e-text-container [data-slate-editor] pre>code .token.important,.w-e-text-container [data-slate-editor] pre>code .token.regex,.w-e-text-container [data-slate-editor] pre>code .token.variable{color:#e90}.w-e-text-container [data-slate-editor] pre>code .token.bold,.w-e-text-container [data-slate-editor] pre>code .token.important{font-weight:700}.w-e-text-container [data-slate-editor] pre>code .token.italic{font-style:italic}.w-e-text-container [data-slate-editor] pre>code .token.entity{cursor:help} ================================================ FILE: static/default/assets/css/Projects-Horizontal.css ================================================ .projects-horizontal { color: #313437; background-color: #fff; } .projects-horizontal p { color: #7d8285; } .projects-horizontal h2 { font-weight: bold; margin-bottom: 40px; padding-top: 40px; color: inherit; } @media (max-width:767px) { .projects-horizontal h2 { margin-bottom: 25px; padding-top: 25px; font-size: 24px; } } .projects-horizontal .intro { font-size: 16px; max-width: 500px; margin: 0 auto 10px; } .projects-horizontal .projects { padding-bottom: 40px; } .projects-horizontal .item { padding-top: 60px; min-height: 160px; } @media (max-width:767px) { .projects-horizontal .item { padding-top: 40px; min-height: 160px; } } .projects-horizontal .item .name { font-size: 18px; font-weight: bold; margin-top: 10px; margin-bottom: 15px; color: inherit; } @media (max-width:991px) { .projects-horizontal .item .name { margin-top: 22px; } } .projects-horizontal .item .description { font-size: 15px; margin-bottom: 0; } ================================================ FILE: static/default/assets/css/css.css ================================================ /* cyrillic-ext */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 400; src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRxC7mw9c.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 400; src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRzS7mw9c.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* vietnamese */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 400; src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRxi7mw9c.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 400; src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRxy7mw9c.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 400; src: local('Montserrat Italic'), local('Montserrat-Italic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUQjIg1_i6t8kCHKm459WxRyS7m.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 600; src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz8fZwnCo.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 600; src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz-PZwnCo.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* vietnamese */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 600; src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz8_ZwnCo.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 600; src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz8vZwnCo.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 600; src: local('Montserrat SemiBold Italic'), local('Montserrat-SemiBoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZFgrz_PZw.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 700; src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz8fZwnCo.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 700; src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz-PZwnCo.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* vietnamese */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 700; src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz8_ZwnCo.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 700; src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz8vZwnCo.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Montserrat'; font-style: italic; font-weight: 700; src: local('Montserrat Bold Italic'), local('Montserrat-BoldItalic'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUPjIg1_i6t8kCHKm459WxZcgvz_PZw.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 400; src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 400; src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* vietnamese */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 400; src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 400; src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 400; src: local('Montserrat Regular'), local('Montserrat-Regular'), url(https://fonts.gstatic.com/s/montserrat/v14/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 600; src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gTD_u50.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 600; src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3g3D_u50.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* vietnamese */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 600; src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gbD_u50.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 600; src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gfD_u50.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 600; src: local('Montserrat SemiBold'), local('Montserrat-SemiBold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_bZF3gnD_g.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 700; src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gTD_u50.woff2) format('woff2'); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 700; src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3g3D_u50.woff2) format('woff2'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* vietnamese */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 700; src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gbD_u50.woff2) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 700; src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gfD_u50.woff2) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Montserrat'; font-style: normal; font-weight: 700; src: local('Montserrat Bold'), local('Montserrat-Bold'), url(https://fonts.gstatic.com/s/montserrat/v14/JTURjIg1_i6t8kCHKm45_dJE3gnD_g.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } ================================================ FILE: static/default/assets/css/smoothproducts.css ================================================ html, body { height: 100%; width: 100%; } .sp-loading { text-align: center; max-width: 270px; padding: 15px; border: 5px solid #eee; border-radius: 3px; font-size: 12px; color: #888; } .sp-wrap { display: none; line-height: 0; font-size: 0; background: #eee; border: 5px solid #eee; border-radius: 3px; position: relative; margin: 0 25px 15px 0; float: left; max-width: 300px; } .sp-thumbs { text-align: left; display: inline-block; } .sp-thumbs img { min-height: 50px; min-width: 50px; max-width: 50px; } .sp-thumbs a:link, .sp-thumbs a:visited { width: 50px; height: 50px; overflow: hidden; opacity: .3; display: inline-block; background-size: cover; background-position: center; -webkit-transition: all .2s ease-out; -moz-transition: all .2s ease-out; -ms-transition: all .2s ease-out; -o-transition: all .2s ease-out; transition: all .2s ease-out; } .sp-thumbs a:hover { opacity: 1; } .sp-thumbs a:active, .sp-current { opacity: 1!important; position: relative; } .sp-large { position: relative; overflow: hidden; top: 0; left: 0; } .sp-large a img { max-width: 100%; height: auto; } .sp-large a { display: block; } .sp-zoom { position: absolute; left: -50%; top: -50%; cursor: -webkit-zoom-in; cursor: -moz-zoom-in; cursor: zoom-in; display: none; } .sp-lightbox { position: fixed; top: 0; left: 0; height: 100%; width: 100%; background: rgb(0, 0, 0); background: rgba(0, 0, 0, .9); z-index: 1031; display: none; cursor: pointer; } .sp-lightbox img { position: absolute; margin: auto; top: 0; bottom: 0; left: 0; right: 0; max-width: 90%; max-height: 90%; border: 2px solid #fff; } #sp-prev, #sp-next { position: absolute; top: 50%; margin-top: -25px; z-index: 501; color: #fff; padding: 14px; text-decoration: none; background: #000; border-radius: 25px; border: 2px solid #fff; width: 50px; height: 50px; box-sizing: border-box; transition: .2s; } #sp-prev { left: 10px; } #sp-prev:before { content: ''; border: 7px solid transparent; border-right: 15px solid #fff; position: absolute; top: 16px; left: 7px; } #sp-next { right: 10px; } #sp-next:before { content: ''; border: 7px solid transparent; border-left: 15px solid white; position: absolute; top: 16px; left: 18px; } #sp-prev:hover, #sp-next:hover { background: #444; } @media screen and (max-width: 400px) { .sp-wrap { margin: 0 0 15px 0; } } @media screen and (max-width: 400px) { #sp-prev, #sp-next { top: auto; margin-top: 0; bottom: 25px; } } ================================================ FILE: static/default/assets/js/theme.js ================================================ // Custome theme code if ($('.clean-gallery').length > 0) { baguetteBox.run('.clean-gallery', { animation: 'slideIn'}); } if ($('.clean-product').length > 0) { $(window).on("load",function() { $('.sp-wrap').smoothproducts(); }); } ================================================ FILE: web.config ================================================