master
xy 3 years ago
parent 1334d445c5
commit c851ce9f70

@ -15,6 +15,7 @@
},
"dependencies": {
"@smallwei/avue": "^2.9.13",
"@tinymce/tinymce-vue": "^3.0.1",
"axios": "0.18.1",
"core-js": "3.6.5",
"echarts": "^4.2.1",
@ -25,6 +26,7 @@
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",
"tinymce": "^5.1.0",
"view-design": "^4.7.0",
"vue": "2.6.10",
"vue-count-to": "^1.0.13",

@ -0,0 +1,462 @@
tinymce.addI18n('zh_CN',{
"Redo": "\u91cd\u505a",
"Undo": "\u64a4\u9500",
"Cut": "\u526a\u5207",
"Copy": "\u590d\u5236",
"Paste": "\u7c98\u8d34",
"Select all": "\u5168\u9009",
"New document": "\u65b0\u6587\u4ef6",
"Ok": "\u786e\u5b9a",
"Cancel": "\u53d6\u6d88",
"Visual aids": "\u7f51\u683c\u7ebf",
"Bold": "\u7c97\u4f53",
"Italic": "\u659c\u4f53",
"Underline": "\u4e0b\u5212\u7ebf",
"Strikethrough": "\u5220\u9664\u7ebf",
"Superscript": "\u4e0a\u6807",
"Subscript": "\u4e0b\u6807",
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
"Align left": "\u5de6\u8fb9\u5bf9\u9f50",
"Align center": "\u4e2d\u95f4\u5bf9\u9f50",
"Align right": "\u53f3\u8fb9\u5bf9\u9f50",
"Justify": "\u4e24\u7aef\u5bf9\u9f50",
"Bullet list": "\u9879\u76ee\u7b26\u53f7",
"Numbered list": "\u7f16\u53f7\u5217\u8868",
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
"Close": "\u5173\u95ed",
"Formats": "\u683c\u5f0f",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u7b49\u5feb\u6377\u952e\u3002",
"Headers": "\u6807\u9898",
"Header 1": "\u6807\u98981",
"Header 2": "\u6807\u98982",
"Header 3": "\u6807\u98983",
"Header 4": "\u6807\u98984",
"Header 5": "\u6807\u98985",
"Header 6": "\u6807\u98986",
"Headings": "\u6807\u9898",
"Heading 1": "\u6807\u98981",
"Heading 2": "\u6807\u98982",
"Heading 3": "\u6807\u98983",
"Heading 4": "\u6807\u98984",
"Heading 5": "\u6807\u98985",
"Heading 6": "\u6807\u98986",
"Preformatted": "\u9884\u5148\u683c\u5f0f\u5316\u7684",
"Div": "Div",
"Pre": "Pre",
"Code": "\u4ee3\u7801",
"Paragraph": "\u6bb5\u843d",
"Blockquote": "\u5f15\u6587\u533a\u5757",
"Inline": "\u6587\u672c",
"Blocks": "\u57fa\u5757",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
"Fonts": "\u5b57\u4f53",
"Font Sizes": "\u5b57\u53f7",
"Class": "\u7c7b\u578b",
"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
"OR": "\u6216",
"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
"Upload": "\u4e0a\u4f20",
"Block": "\u5757",
"Align": "\u5bf9\u9f50",
"Default": "\u9ed8\u8ba4",
"Circle": "\u7a7a\u5fc3\u5706",
"Disc": "\u5b9e\u5fc3\u5706",
"Square": "\u65b9\u5757",
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
"Anchor...": "\u951a\u70b9...",
"Name": "\u540d\u79f0",
"Id": "\u6807\u8bc6\u7b26",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
"Special character...": "\u7279\u6b8a\u5b57\u7b26...",
"Source code": "\u6e90\u4ee3\u7801",
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
"Language": "\u8bed\u8a00",
"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
"Color Picker": "\u9009\u8272\u5668",
"R": "R",
"G": "G",
"B": "B",
"Left to right": "\u4ece\u5de6\u5230\u53f3",
"Right to left": "\u4ece\u53f3\u5230\u5de6",
"Emoticons": "\u8868\u60c5",
"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
"Title": "\u6807\u9898",
"Keywords": "\u5173\u952e\u8bcd",
"Description": "\u63cf\u8ff0",
"Robots": "\u673a\u5668\u4eba",
"Author": "\u4f5c\u8005",
"Encoding": "\u7f16\u7801",
"Fullscreen": "\u5168\u5c4f",
"Action": "\u64cd\u4f5c",
"Shortcut": "\u5feb\u6377\u952e",
"Help": "\u5e2e\u52a9",
"Address": "\u5730\u5740",
"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
"Plugins": "\u63d2\u4ef6",
"Handy Shortcuts": "\u5feb\u6377\u952e",
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
"Alternative description": "\u66ff\u4ee3\u63cf\u8ff0",
"Accessibility": "\u8f85\u52a9\u529f\u80fd",
"Image is decorative": "\u56fe\u50cf\u662f\u88c5\u9970\u6027\u7684",
"Source": "\u5730\u5740",
"Dimensions": "\u5927\u5c0f",
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
"General": "\u666e\u901a",
"Advanced": "\u9ad8\u7ea7",
"Style": "\u6837\u5f0f",
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
"Border": "\u8fb9\u6846",
"Insert image": "\u63d2\u5165\u56fe\u7247",
"Image...": "\u56fe\u7247...",
"Image list": "\u56fe\u7247\u5217\u8868",
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
"Edit image": "\u7f16\u8f91\u56fe\u7247",
"Image options": "\u56fe\u7247\u9009\u9879",
"Zoom in": "\u653e\u5927",
"Zoom out": "\u7f29\u5c0f",
"Crop": "\u88c1\u526a",
"Resize": "\u8c03\u6574\u5927\u5c0f",
"Orientation": "\u65b9\u5411",
"Brightness": "\u4eae\u5ea6",
"Sharpen": "\u9510\u5316",
"Contrast": "\u5bf9\u6bd4\u5ea6",
"Color levels": "\u989c\u8272\u5c42\u6b21",
"Gamma": "\u4f3d\u9a6c\u503c",
"Invert": "\u53cd\u8f6c",
"Apply": "\u5e94\u7528",
"Back": "\u540e\u9000",
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
"Text to display": "\u663e\u793a\u6587\u5b57",
"Url": "\u5730\u5740",
"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
"Current window": "\u5f53\u524d\u7a97\u53e3",
"None": "\u65e0",
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
"Open link": "\u6253\u5f00\u94fe\u63a5",
"Remove link": "\u5220\u9664\u94fe\u63a5",
"Anchors": "\u951a\u70b9",
"Link...": "\u94fe\u63a5...",
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
"The URL you entered seems to be an external link. Do you want to add the required https:\/\/ prefix?": "\u60a8\u8f93\u5165\u7684 URL \u4f3c\u4e4e\u662f\u4e00\u4e2a\u5916\u90e8\u94fe\u63a5\u3002\u60a8\u60f3\u6dfb\u52a0\u6240\u9700\u7684 https:\/\/ \u524d\u7f00\u5417\uff1f",
"Link list": "\u94fe\u63a5\u5217\u8868",
"Insert video": "\u63d2\u5165\u89c6\u9891",
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
"Alternative source": "\u955c\u50cf",
"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
"Embed": "\u5185\u5d4c",
"Media...": "\u591a\u5a92\u4f53...",
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
"Page break": "\u5206\u9875\u7b26",
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
"Preview": "\u9884\u89c8",
"Print...": "\u6253\u5370...",
"Save": "\u4fdd\u5b58",
"Find": "\u67e5\u627e",
"Replace with": "\u66ff\u6362\u4e3a",
"Replace": "\u66ff\u6362",
"Replace all": "\u5168\u90e8\u66ff\u6362",
"Previous": "\u4e0a\u4e00\u4e2a",
"Next": "\u4e0b\u4e00\u4e2a",
"Find and Replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
"Find whole words only": "\u5168\u5b57\u5339\u914d",
"Find in selection": "\u5728\u9009\u533a\u4e2d\u67e5\u627e",
"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
"Spellcheck Language": "\u62fc\u5199\u68c0\u67e5\u8bed\u8a00",
"No misspellings found.": "\u6ca1\u6709\u53d1\u73b0\u62fc\u5199\u9519\u8bef",
"Ignore": "\u5ffd\u7565",
"Ignore all": "\u5168\u90e8\u5ffd\u7565",
"Finish": "\u5b8c\u6210",
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
"Insert table": "\u63d2\u5165\u8868\u683c",
"Table properties": "\u8868\u683c\u5c5e\u6027",
"Delete table": "\u5220\u9664\u8868\u683c",
"Cell": "\u5355\u5143\u683c",
"Row": "\u884c",
"Column": "\u5217",
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
"Delete row": "\u5220\u9664\u884c",
"Row properties": "\u884c\u5c5e\u6027",
"Cut row": "\u526a\u5207\u884c",
"Copy row": "\u590d\u5236\u884c",
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
"Delete column": "\u5220\u9664\u5217",
"Cols": "\u5217",
"Rows": "\u884c",
"Width": "\u5bbd",
"Height": "\u9ad8",
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
"Caption": "\u6807\u9898",
"Show caption": "\u663e\u793a\u6807\u9898",
"Left": "\u5de6\u5bf9\u9f50",
"Center": "\u5c45\u4e2d",
"Right": "\u53f3\u5bf9\u9f50",
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
"Scope": "\u8303\u56f4",
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
"H Align": "\u6c34\u5e73\u5bf9\u9f50",
"V Align": "\u5782\u76f4\u5bf9\u9f50",
"Top": "\u9876\u90e8\u5bf9\u9f50",
"Middle": "\u5782\u76f4\u5c45\u4e2d",
"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
"Header cell": "\u8868\u5934\u5355\u5143\u683c",
"Row group": "\u884c\u7ec4",
"Column group": "\u5217\u7ec4",
"Row type": "\u884c\u7c7b\u578b",
"Header": "\u8868\u5934",
"Body": "\u8868\u4f53",
"Footer": "\u8868\u5c3e",
"Border color": "\u8fb9\u6846\u989c\u8272",
"Insert template...": "\u63d2\u5165\u6a21\u677f...",
"Templates": "\u6a21\u677f",
"Template": "\u6a21\u677f",
"Text color": "\u6587\u5b57\u989c\u8272",
"Background color": "\u80cc\u666f\u8272",
"Custom...": "\u81ea\u5b9a\u4e49...",
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
"No color": "\u65e0",
"Remove color": "\u79fb\u9664\u989c\u8272",
"Table of Contents": "\u5185\u5bb9\u5217\u8868",
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
"Word count": "\u5b57\u6570",
"Count": "\u8ba1\u6570",
"Document": "\u6587\u6863",
"Selection": "\u9009\u62e9",
"Words": "\u5355\u8bcd",
"Words: {0}": "\u5b57\u6570\uff1a{0}",
"{0} words": "{0} \u5b57",
"File": "\u6587\u4ef6",
"Edit": "\u7f16\u8f91",
"Insert": "\u63d2\u5165",
"View": "\u89c6\u56fe",
"Format": "\u683c\u5f0f",
"Table": "\u8868\u683c",
"Tools": "\u5de5\u5177",
"Powered by {0}": "\u7531{0}\u9a71\u52a8",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
"Image title": "\u56fe\u7247\u6807\u9898",
"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
"Border style": "\u8fb9\u6846\u6837\u5f0f",
"Error": "\u9519\u8bef",
"Warn": "\u8b66\u544a",
"Valid": "\u6709\u6548",
"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002",
"System Font": "\u7cfb\u7edf\u5b57\u4f53",
"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}",
"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}",
"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
"example": "\u793a\u4f8b",
"Search": "\u641c\u7d22",
"All": "\u5168\u90e8",
"Currency": "\u8d27\u5e01",
"Text": "\u6587\u5b57",
"Quotations": "\u5f15\u7528",
"Mathematical": "\u6570\u5b66",
"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
"Symbols": "\u7b26\u53f7",
"Arrows": "\u7bad\u5934",
"User Defined": "\u81ea\u5b9a\u4e49",
"dollar sign": "\u7f8e\u5143\u7b26\u53f7",
"currency sign": "\u8d27\u5e01\u7b26\u53f7",
"euro-currency sign": "\u6b27\u5143\u7b26\u53f7",
"colon sign": "\u5192\u53f7",
"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7",
"french franc sign": "\u6cd5\u90ce\u7b26\u53f7",
"lira sign": "\u91cc\u62c9\u7b26\u53f7",
"mill sign": "\u5bc6\u5c14\u7b26\u53f7",
"naira sign": "\u5948\u62c9\u7b26\u53f7",
"peseta sign": "\u6bd4\u585e\u5854\u7b26\u53f7",
"rupee sign": "\u5362\u6bd4\u7b26\u53f7",
"won sign": "\u97e9\u5143\u7b26\u53f7",
"new sheqel sign": "\u65b0\u8c22\u514b\u5c14\u7b26\u53f7",
"dong sign": "\u8d8a\u5357\u76fe\u7b26\u53f7",
"kip sign": "\u8001\u631d\u57fa\u666e\u7b26\u53f7",
"tugrik sign": "\u56fe\u683c\u91cc\u514b\u7b26\u53f7",
"drachma sign": "\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7",
"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7",
"peso sign": "\u6bd4\u7d22\u7b26\u53f7",
"guarani sign": "\u74dc\u62c9\u5c3c\u7b26\u53f7",
"austral sign": "\u6fb3\u5143\u7b26\u53f7",
"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7",
"cedi sign": "\u585e\u5730\u7b26\u53f7",
"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7",
"spesmilo sign": "spesmilo\u7b26\u53f7",
"tenge sign": "\u575a\u6208\u7b26\u53f7",
"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
"manat sign": "\u9a6c\u7eb3\u7279\u7b26\u53f7",
"ruble sign": "\u5362\u5e03\u7b26\u53f7",
"yen character": "\u65e5\u5143\u5b57\u6837",
"yuan character": "\u4eba\u6c11\u5e01\u5143\u5b57\u6837",
"yuan character, in hong kong and taiwan": "\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09",
"yen\/yuan character variant one": "\u5143\u5b57\u6837\uff08\u5927\u5199\uff09",
"Loading emoticons...": "\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...",
"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7",
"People": "\u4eba\u7c7b",
"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
"Activity": "\u6d3b\u52a8",
"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
"Objects": "\u7269\u4ef6",
"Flags": "\u65d7\u5e1c",
"Characters": "\u5b57\u7b26",
"Characters (no spaces)": "\u5b57\u7b26(\u65e0\u7a7a\u683c)",
"{0} characters": "{0} \u4e2a\u5b57\u7b26",
"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002",
"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002",
"Update": "\u66f4\u65b0",
"Color swatch": "\u989c\u8272\u6837\u672c",
"Turquoise": "\u9752\u7eff\u8272",
"Green": "\u7eff\u8272",
"Blue": "\u84dd\u8272",
"Purple": "\u7d2b\u8272",
"Navy Blue": "\u6d77\u519b\u84dd",
"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
"Dark Green": "\u6df1\u7eff\u8272",
"Medium Blue": "\u4e2d\u84dd\u8272",
"Medium Purple": "\u4e2d\u7d2b\u8272",
"Midnight Blue": "\u6df1\u84dd\u8272",
"Yellow": "\u9ec4\u8272",
"Orange": "\u6a59\u8272",
"Red": "\u7ea2\u8272",
"Light Gray": "\u6d45\u7070\u8272",
"Gray": "\u7070\u8272",
"Dark Yellow": "\u6697\u9ec4\u8272",
"Dark Orange": "\u6df1\u6a59\u8272",
"Dark Red": "\u6df1\u7ea2\u8272",
"Medium Gray": "\u4e2d\u7070\u8272",
"Dark Gray": "\u6df1\u7070\u8272",
"Light Green": "\u6d45\u7eff\u8272",
"Light Yellow": "\u6d45\u9ec4\u8272",
"Light Red": "\u6d45\u7ea2\u8272",
"Light Purple": "\u6d45\u7d2b\u8272",
"Light Blue": "\u6d45\u84dd\u8272",
"Dark Purple": "\u6df1\u7d2b\u8272",
"Dark Blue": "\u6df1\u84dd\u8272",
"Black": "\u9ed1\u8272",
"White": "\u767d\u8272",
"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
"history": "\u5386\u53f2",
"styles": "\u6837\u5f0f",
"formatting": "\u683c\u5f0f\u5316",
"alignment": "\u5bf9\u9f50",
"indentation": "\u7f29\u8fdb",
"Font": "\u5b57\u4f53",
"Size": "\u5b57\u53f7",
"More...": "\u66f4\u591a...",
"Select...": "\u9009\u62e9...",
"Preferences": "\u9996\u9009\u9879",
"Yes": "\u662f",
"No": "\u5426",
"Keyboard Navigation": "\u952e\u76d8\u6307\u5f15",
"Version": "\u7248\u672c",
"Code view": "\u4ee3\u7801\u89c6\u56fe",
"Open popup menu for split buttons": "\u6253\u5f00\u5f39\u51fa\u5f0f\u83dc\u5355\uff0c\u7528\u4e8e\u62c6\u5206\u6309\u94ae",
"List Properties": "\u5217\u8868\u5c5e\u6027",
"List properties...": "\u6807\u9898\u5b57\u4f53\u5c5e\u6027",
"Start list at number": "\u4ee5\u6570\u5b57\u5f00\u59cb\u5217\u8868",
"Line height": "\u884c\u9ad8",
"comments": "\u5907\u6ce8",
"Format Painter": "\u683c\u5f0f\u5237",
"Insert\/edit iframe": "\u63d2\u5165\/\u7f16\u8f91\u6846\u67b6",
"Capitalization": "\u5927\u5199",
"lowercase": "\u5c0f\u5199",
"UPPERCASE": "\u5927\u5199",
"Title Case": "\u9996\u5b57\u6bcd\u5927\u5199",
"permanent pen": "\u8bb0\u53f7\u7b14",
"Permanent Pen Properties": "\u6c38\u4e45\u7b14\u5c5e\u6027",
"Permanent pen properties...": "\u6c38\u4e45\u7b14\u5c5e\u6027...",
"case change": "\u6848\u4f8b\u66f4\u6539",
"page embed": "\u9875\u9762\u5d4c\u5165",
"Advanced sort...": "\u9ad8\u7ea7\u6392\u5e8f...",
"Advanced Sort": "\u9ad8\u7ea7\u6392\u5e8f",
"Sort table by column ascending": "\u6309\u5217\u5347\u5e8f\u8868",
"Sort table by column descending": "\u6309\u5217\u964d\u5e8f\u8868",
"Sort": "\u6392\u5e8f",
"Order": "\u6392\u5e8f",
"Sort by": "\u6392\u5e8f\u65b9\u5f0f",
"Ascending": "\u5347\u5e8f",
"Descending": "\u964d\u5e8f",
"Column {0}": "\u5217{0}",
"Row {0}": "\u884c{0}",
"Spellcheck...": "\u62fc\u5199\u68c0\u67e5...",
"Misspelled word": "\u62fc\u5199\u9519\u8bef\u7684\u5355\u8bcd",
"Suggestions": "\u5efa\u8bae",
"Change": "\u66f4\u6539",
"Finding word suggestions": "\u67e5\u627e\u5355\u8bcd\u5efa\u8bae",
"Success": "\u6210\u529f",
"Repair": "\u4fee\u590d",
"Issue {0} of {1}": "\u5171\u8ba1{1}\u95ee\u9898{0}",
"Images must be marked as decorative or have an alternative text description": "\u56fe\u50cf\u5fc5\u987b\u6807\u8bb0\u4e3a\u88c5\u9970\u6027\u6216\u5177\u6709\u66ff\u4ee3\u6587\u672c\u63cf\u8ff0",
"Images must have an alternative text description. Decorative images are not allowed.": "\u56fe\u50cf\u5fc5\u987b\u5177\u6709\u66ff\u4ee3\u6587\u672c\u63cf\u8ff0\u3002\u4e0d\u5141\u8bb8\u4f7f\u7528\u88c5\u9970\u56fe\u50cf\u3002",
"Or provide alternative text:": "\u6216\u63d0\u4f9b\u5907\u9009\u6587\u672c\uff1a",
"Make image decorative:": "\u4f7f\u56fe\u50cf\u88c5\u9970\uff1a",
"ID attribute must be unique": "ID \u5c5e\u6027\u5fc5\u987b\u662f\u552f\u4e00\u7684",
"Make ID unique": "\u4f7f ID \u72ec\u4e00\u65e0\u4e8c",
"Keep this ID and remove all others": "\u4fdd\u7559\u6b64 ID \u5e76\u5220\u9664\u6240\u6709\u5176\u4ed6",
"Remove this ID": "\u5220\u9664\u6b64 ID",
"Remove all IDs": "\u6e05\u9664\u5168\u90e8IDs",
"Checklist": "\u6e05\u5355",
"Anchor": "\u951a\u70b9",
"Special character": "\u7279\u6b8a\u7b26\u53f7",
"Code sample": "\u4ee3\u7801\u793a\u4f8b",
"Color": "\u989c\u8272",
"Document properties": "\u6587\u6863\u5c5e\u6027",
"Image description": "\u56fe\u7247\u63cf\u8ff0",
"Image": "\u56fe\u7247",
"Insert link": "\u63d2\u5165\u94fe\u63a5",
"Target": "\u6253\u5f00\u65b9\u5f0f",
"Link": "\u94fe\u63a5",
"Poster": "\u5c01\u9762",
"Media": "\u5a92\u4f53",
"Print": "\u6253\u5370",
"Prev": "\u4e0a\u4e00\u4e2a",
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
"Whole words": "\u5168\u5b57\u5339\u914d",
"Insert template": "\u63d2\u5165\u6a21\u677f"
});

@ -0,0 +1,117 @@
<template>
<div class="upload-container">
<el-button icon="el-icon-upload" size="mini" type="primary" @click=" dialogVisible=true">
上传图片
</el-button>
<el-dialog :visible.sync="dialogVisible" :modal="false">
<el-upload
:multiple="true"
:file-list="fileList"
:show-file-list="true"
:on-remove="handleRemove"
:on-success="handleSuccess"
:before-upload="beforeUpload"
class="editor-slide-upload"
:action="action"
list-type="picture-card"
>
<el-button size="small" type="primary">
点击上传
</el-button>
</el-upload>
<el-button @click="dialogVisible = false">
取消
</el-button>
<el-button type="primary" @click="handleSubmit">
确认
</el-button>
</el-dialog>
</div>
</template>
<script>
import { Message } from 'element-ui'
export default {
name: 'EditorSlideUpload',
props: {
},
data() {
return {
action:`${process.env.VUE_APP_BASE_API}api/admin/upload-file`,
dialogVisible: false,
listObj: {},
fileList: []
}
},
methods: {
checkAllSuccess() {
return Object.keys(this.listObj).every(item => this.listObj[item].hasSuccess)
},
handleSubmit() {
const arr = Object.keys(this.listObj).map(v => this.listObj[v])
if (!this.checkAllSuccess()) {
this.$message('请等待所有图片上传成功。如有网络问题,请刷新页面重新上传!')
return
}
this.$emit('successCBK', arr)
this.listObj = {}
this.fileList = []
this.dialogVisible = false
},
handleSuccess(response, file) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
this.listObj[objKeyArr[i]].url = response.url
this.listObj[objKeyArr[i]].hasSuccess = true
return
}
}
},
handleRemove(file) {
const uid = file.uid
const objKeyArr = Object.keys(this.listObj)
for (let i = 0, len = objKeyArr.length; i < len; i++) {
if (this.listObj[objKeyArr[i]].uid === uid) {
delete this.listObj[objKeyArr[i]]
return
}
}
},
beforeUpload(file) {
console.log(file)
if((file.size/1000) > 1024){
Message({
type:'warning',
message:'上传图片大小超过1M'
})
return false
}
const _self = this
const _URL = window.URL || window.webkitURL
const fileName = file.uid
this.listObj[fileName] = {}
return new Promise((resolve, reject) => {
const img = new Image()
img.src = _URL.createObjectURL(file)
img.onload = function() {
_self.listObj[fileName] = { hasSuccess: false, uid: file.uid, width: this.width, height: this.height }
}
resolve(true)
})
}
}
}
</script>
<style lang="scss" scoped>
.editor-slide-upload {
margin-bottom: 20px;
::v-deep .el-upload--picture-card {
width: 100%;
}
}
</style>

@ -0,0 +1,119 @@
<template>
<div class="tinymce">
<Editor v-model="myValue" :init="init" :disabled="disabled"></Editor>
<EditorImage
class="tinymce__upload"
@successCBK="imageSuccessCBK"
></EditorImage>
</div>
</template>
<script>
import EditorImage from "@/components/XyTinymce/EditorImage.vue";
import tinymce from "tinymce/tinymce";
import Editor from "@tinymce/tinymce-vue";
import "tinymce/skins/ui/oxide/skin.css";
import "@/assets/tinymce/langs/zh_CN";
import "tinymce/themes/silver/theme";
import "tinymce/plugins/media";
import "tinymce/plugins/lists";
import "tinymce/plugins/table";
import "tinymce/plugins/hr";
import "tinymce/plugins/autolink";
import "tinymce/plugins/help";
import "tinymce/plugins/visualblocks";
import "tinymce/plugins/fullscreen";
import "tinymce/plugins/textpattern";
import "tinymce/plugins/contextmenu";
import "tinymce/plugins/wordcount";
import "tinymce/plugins/colorpicker";
import "tinymce/plugins/textcolor";
//import "tinymce/icons/default"
export default {
components: {
Editor,
EditorImage,
},
props: {
height: {
type: Number,
default: 300,
},
value: {
type: String,
default: "",
},
disabled: {
type: Boolean,
default: false,
},
plugins: {
type: [String, Array],
default:
"paste preview searchreplace autolink directionality visualblocks visualchars fullscreen image template codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help emoticons autosave ",
},
toolbar: {
type: [String, Array],
default: ` undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough anchor | alignleft aligncenter alignright alignjustify outdent indent |
styleselect formatselect fontselect fontsizeselect | table image charmap emoticons hr pagebreak |bullist numlist | blockquote subscript superscript removeformat |
insertdatetime print preview | fullscreen | bdmap indent2em lineheight formatpainter axupimgs`,
},
menubar: {
type: String,
default: "edit insert view format table",
},
},
data() {
return {
myValue: this.value,
init: {
language_url: "@/asset/tinymce/langs/zh_CN.js", //
language: "zh_CN",
height: this.height,
plugins: this.plugins,
fontsize_formats: "8px 10px 12px 14px 16px 18px 24px 28px 36px",
toolbar: this.toolbar,
branding: false,
menubar: this.menubar,
//base64
//ajaxhttps://www.tiny.cloud/docs/configure/file-image-upload/#images_upload_handler
// images_upload_handler: (blobInfo, success, failure) => {
// const img = 'data:image/jpeg;base64,' + blobInfo.base64()
// success(img)
// },
},
};
},
methods: {
imageSuccessCBK(arr) {
arr.forEach(
(v) => (this.myValue += `<img class="wscnph" src="${v.url}" >`)
);
},
},
computed: {},
mounted() {
tinymce.init({});
},
watch: {
value(newValue) {
this.myValue = newValue;
},
myValue(newValue) {
this.$emit("input", newValue);
},
},
};
</script>
<style scoped lang="scss">
.tinymce {
position: relative;
&__upload {
z-index: 2;
position: absolute;
right: 4px;
top: 0px;
}
}
</style>

@ -197,7 +197,7 @@ import addCommonServiceProduct from '@/views/productService/components/common/ad
})
this.clubSelect.page--
}
this.clubs.push(...res.rows)
this.clubs.push(...res.data)
},
loadMoreClub() {
this.clubSelect.page++

@ -1,14 +1,29 @@
<template>
<div>
<xy-dialog ref="dialog" :width="74" type="form" :is-show.sync="isShow"
:title="this.type === 'add' ? '新增产品' : '编辑产品'" :form="form" :rules="rules" @submit="submit">
<xy-dialog
ref="dialog"
:width="74"
type="form"
:is-show.sync="isShow"
:title="this.type === 'add' ? '新增产品' : '编辑产品'"
:form="form"
:rules="rules"
@submit="submit"
>
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>产品名称
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>产品名称
</div>
<div class="xy-table-item-content">
<el-input v-model="form.name" placeholder="请输入名称" clearable style="width: 300px;"></el-input>
<el-input
v-model="form.name"
placeholder="请输入名称"
clearable
style="width: 300px"
></el-input>
</div>
</div>
</template>
@ -16,13 +31,24 @@
<template v-slot:confinementServicesId>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>所属机构
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>所属机构
</div>
<div class="xy-table-item-content">
<el-select clearable v-model="form.confinementServicesId" style="width: 300px;" placeholder="请选择所属机构">
<el-select
clearable
v-model="form.confinementServicesId"
style="width: 300px"
placeholder="请选择所属机构"
>
<Scroll :on-reach-bottom="loadMoreClub">
<el-option v-for="item in clubs" :value="item.id" :key="item.id" :label="item.name">
<el-option
v-for="item in clubs"
:value="item.id"
:key="item.id"
:label="item.name"
>
</el-option>
</Scroll>
</el-select>
@ -32,9 +58,7 @@
<template v-slot:state>
<div class="xy-table-item">
<div class="xy-table-item-label">
是否启用
</div>
<div class="xy-table-item-label">是否启用</div>
<div class="xy-table-item-content">
<el-switch v-model="form.state" type="primary"></el-switch>
</div>
@ -43,9 +67,7 @@
<template v-slot:recommend>
<div class="xy-table-item">
<div class="xy-table-item-label">
是否推荐主页
</div>
<div class="xy-table-item-label">是否推荐主页</div>
<div class="xy-table-item-content">
<el-switch v-model="form.recommend" type="primary"></el-switch>
</div>
@ -54,31 +76,47 @@
<template v-slot:sortNumber>
<div class="xy-table-item">
<div class="xy-table-item-label">
排序
</div>
<div class="xy-table-item-label">排序</div>
<div class="xy-table-item-content">
<el-input-number :precision="0" :controls="false" v-model="form.sortNumber" placeholder="请输入排序" clearable
style="width: 300px;"></el-input-number>
<el-input-number
:precision="0"
:controls="false"
v-model="form.sortNumber"
placeholder="请输入排序"
clearable
style="width: 300px"
></el-input-number>
</div>
</div>
</template>
<template v-slot:video>
<div class="xy-table-item">
<div class="xy-table-item-label">
宣传视频
</div>
<div class="xy-table-item-label">宣传视频</div>
<div class="xy-table-item-content">
<div v-if="form.video" style="position: relative;">
<div v-if="form.video" style="position: relative">
<video :src="form.video" class="avatar" />
<Button shape="circle" icon="md-close" type="error" size="small" class="img__delete"
@click="form.video = ''"></Button>
</div>
<el-upload v-else :limit="1" accept="video/*" class="avatar-uploader" list-type="picture-card"
:action="action" :show-file-list="true" :on-error="uploadFailVideo" :on-success="uploadSuccessVideo"
:before-upload="uploadBeforeVideo">
<Button
shape="circle"
icon="md-close"
type="error"
size="small"
class="img__delete"
@click="form.video = ''"
></Button>
</div>
<el-upload
v-else
:limit="1"
accept="video/*"
class="avatar-uploader"
list-type="picture-card"
:action="action"
:show-file-list="true"
:on-error="uploadFailVideo"
:on-success="uploadSuccessVideo"
:before-upload="uploadBeforeVideo"
>
<i class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
@ -87,18 +125,32 @@
<template v-slot:featuredLabel>
<div class="xy-table-item">
<div class="xy-table-item-label">
特色标签
</div>
<div class="xy-table-item-label">特色标签</div>
<div class="xy-table-item-content">
<div class="xy-table-item-content-label">
<template v-for="(item, index) in form.featuredLabel">
<el-tag type="primary" closable @close="labelClose(index)"
style="margin-right: 6px;margin-bottom: 4px;">{{item}}</el-tag>
<el-tag
type="primary"
closable
@close="labelClose(index)"
style="margin-right: 6px; margin-bottom: 4px"
>{{ item }}</el-tag
>
</template>
<div style="margin-top: 15px;">
<el-input clearable placeholder="请填写并添加特色标签" style="width: 300px" ref="labelInput" v-model="labelText">
<el-button type="primary" slot="append" icon="el-icon-plus" @click="appendLabel"></el-button>
<div style="margin-top: 15px">
<el-input
clearable
placeholder="请填写并添加特色标签"
style="width: 300px"
ref="labelInput"
v-model="labelText"
>
<el-button
type="primary"
slot="append"
icon="el-icon-plus"
@click="appendLabel"
></el-button>
</el-input>
</div>
</div>
@ -108,12 +160,16 @@
<template v-slot:price>
<div class="xy-table-item">
<div class="xy-table-item-label">
价格
</div>
<div class="xy-table-item-label">价格</div>
<div class="xy-table-item-content xy-table-item-price">
<el-input-number :precision="2" :controls="false" v-model="form.price" placeholder="请输入价格" clearable
style="width: 300px;"></el-input-number>
<el-input-number
:precision="2"
:controls="false"
v-model="form.price"
placeholder="请输入价格"
clearable
style="width: 300px"
></el-input-number>
</div>
</div>
</template>
@ -121,17 +177,34 @@
<template v-slot:coverPicture>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>封面图
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>封面图
</div>
<div class="xy-table-item-content xy-table-item-content-cover">
<div v-if="form.coverPicture" style="position: relative;">
<img :src="form.coverPicture" class="avatar">
<Button shape="circle" icon="md-close" type="error" size="small" class="img__delete"
@click="form.coverPicture = ''"></Button>
</div>
<el-upload v-else accept="picture" :limit="1" class="avatar-uploader" list-type="picture-card"
:action="action" :show-file-list="true" :on-error="uploadFailPic" :on-success="uploadSuccessPic"
:before-upload="uploadBeforePic">
<div v-if="form.coverPicture" style="position: relative">
<img :src="form.coverPicture" class="avatar" />
<Button
shape="circle"
icon="md-close"
type="error"
size="small"
class="img__delete"
@click="form.coverPicture = ''"
></Button>
</div>
<el-upload
v-else
accept="picture"
:limit="1"
class="avatar-uploader"
list-type="picture-card"
:action="action"
:show-file-list="true"
:on-error="uploadFailPic"
:on-success="uploadSuccessPic"
:before-upload="uploadBeforePic"
>
<i class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
@ -140,13 +213,19 @@
<template v-slot:timeLimit>
<div class="xy-table-item">
<div class="xy-table-item-label">
限时
</div>
<div class="xy-table-item-label">限时</div>
<div class="xy-table-item-content">
<el-date-picker clearable style="width: 440px;" v-model="form.timeLimit" type="datetimerange"
range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" align="right"
value-format="yyyy-MM-dd hh:mm:ss">
<el-date-picker
clearable
style="width: 440px"
v-model="form.timeLimit"
type="datetimerange"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
align="right"
value-format="yyyy-MM-dd hh:mm:ss"
>
</el-date-picker>
</div>
</div>
@ -155,27 +234,49 @@
<template v-slot:content>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>内容
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>内容
</div>
<div class="xy-table-item-content">
<tinymce ref="tinymce" :height="200" v-model="form.content" id='tinymce'></tinymce>
<div class="xy-table-item-content" style="width: 680px">
<xy-tinymce v-model="form.content"></xy-tinymce>
</div>
</div>
</template>
<template v-slot:set_list>
<div class="xy-table-item">
<div class="xy-table-item-label">
明细
</div>
<div class="xy-table-item-label">明细</div>
<div class="xy-table-item-content">
<Button type="primary" icon="md-add" @click="addListCombo" style="margin-bottom: 10px">新增</Button>
<xy-table :height="260" :is-page="false" :list="form.set_list" :table-item="tableCombo">
<Button
type="primary"
icon="md-add"
@click="addListCombo"
style="margin-bottom: 10px"
>新增</Button
>
<xy-table
:height="260"
:is-page="false"
:list="form.set_list"
:table-item="tableCombo"
>
<template v-slot:btns>
<el-table-column label="操作" width="90" header-align="center" align="center">
<el-table-column
label="操作"
width="90"
header-align="center"
align="center"
>
<template slot-scope="scope">
<Button size="small" type="primary" ghost @click="deleteCombo(scope)"></Button>
<Button
size="small"
type="primary"
ghost
@click="deleteCombo(scope)"
>删除</Button
>
</template>
</el-table-column>
</template>
@ -184,27 +285,28 @@
</div>
</template>
<template v-slot:picture_list>
<div class="xy-table-item">
<div class="xy-table-item-label">
图集
</div>
<div class="xy-table-item-label">图集</div>
<div class="xy-table-item-content">
<el-upload class="upload-demo" :action="action" :before-upload="pichandleBefore"
:on-success="pichandleSuccess" :on-preview="pichandlePreview" :before-remove="pichandleBeforeRemove"
:on-remove="pichandleRemove" :file-list="picfileList" list-type="picture" multiple>
<el-upload
class="upload-demo"
:action="action"
:before-upload="uploadBeforePic"
:on-success="picListSuccessHandler"
:on-remove="picListRemoveHandler"
:file-list="picfileList"
list-type="picture"
multiple
>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件或者视频文件且不超过10M</div>
<div slot="tip" class="el-upload__tip">
只能上传jpg/png文件或者视频文件且不超过10M
</div>
</el-upload>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
@ -215,304 +317,299 @@
show,
save,
getPicture,
getCombo
} from "@/api/productService/commonServiceProduct"
import {
index as clubIndex
} from '@/api/productService/commonService'
import {
getparameter
} from "@/api/system/dictionary"
import {
Message
} from 'element-ui'
getCombo,
} from "@/api/productService/commonServiceProduct";
import { index as clubIndex } from "@/api/productService/commonService";
import { getparameter } from "@/api/system/dictionary";
import { Message } from "element-ui";
import tinymce from '@/components/Tinymce'
import xyTinymce from "@/components/XyTinymce/index.vue";
export default {
components: {
tinymce
xyTinymce,
},
data() {
return {
picfileList: [],
id: '',
id: "",
isShow: false,
type: '',
type: "",
listCombo: [],
tableCombo: [{
label: '名称',
tableCombo: [
{
label: "名称",
sortable: false,
minWidth: 220,
customFn: (row) => {
return ( <
div >
<el-input size = 'small'
return (
<div>
<el-input
size="small"
placeholder="请输入名称"
value = {
row.name
}
on = {
{
['input']: (e) => {
row.name = e
}
}
}
/> < /
div >
)
}
value={row.name}
on={{
["input"]: (e) => {
row.name = e;
},
}}
/>{" "}
</div>
);
},
},
{
label: '内容',
label: "内容",
sortable: false,
minWidth: 420,
customFn: (row) => {
return ( <
div >
<el-input size = 'small'
return (
<div>
<el-input
size="small"
placeholder="请输入内容"
value = {
row.content
}
on = {
{
['input']: (e) => {
row.content = e
}
}
}
/> < /
div >
)
}
}
value={row.content}
on={{
["input"]: (e) => {
row.content = e;
},
}}
/>{" "}
</div>
);
},
},
],
action: `${process.env.VUE_APP_BASE_API}api/admin/upload-file`,
clubSelect: {
pageSize: 10,
page: 1,
type: "maternity"
type: "maternity",
},
clubs: [],
roomTypes: [],
equips: [],
labelText: '',
labelText: "",
form: {
name: '',
confinementServicesId: '', //
name: "",
confinementServicesId: "", //
sortNumber: 0,
featuredLabel: [],
state: true,
price: 0,
recommend: false,
coverPicture: '',
timeLimit: '',
content: '',
coverPicture: "",
timeLimit: "",
content: "",
video: "",
set_list: [],
picture_list: []
picture_list: [],
},
rules: {
name: [{
required: true,
message: '请填写产品名称'
}],
confinementServicesId: [{
name: [
{
required: true,
message: '请选择所属机构'
}],
coverPicture: [{
message: "请填写产品名称",
},
],
confinementServicesId: [
{
required: true,
message: '请上传封面图'
}],
content: [{
message: "请选择所属机构",
},
],
coverPicture: [
{
required: true,
message: '请填写内容'
}]
}
}
message: "请上传封面图",
},
methods: {
pichandleBefore(file) {
console.log(file)
if ((file.size / 1000) > 10240) {
Message({
type: 'warning',
message: '上传文件大小超过10M'
})
return false
}
],
content: [
{
required: true,
message: "请填写内容",
},
pichandleRemove(file, fileList) {
//console.log(file, fileList);
this.picfileList = fileList;
],
},
pichandleBeforeRemove(file, fileList) {},
pichandlePreview(file) {
console.log(file);
};
},
pichandleSuccess(response, file, fileList) {
this.picfileList = fileList;
methods: {
init(){
this.picfileList = []
this.form = {
name: "",
confinementServicesId: "", //
sortNumber: 0,
featuredLabel: [],
state: true,
price: 0,
recommend: false,
coverPicture: "",
timeLimit: "",
content: "",
video: "",
set_list: [],
picture_list: [],
}
},
addListCombo() {
this.form.set_list.push({
name: '',
content: ''
})
name: "",
content: "",
});
},
deleteCombo(scope) {
this.form.set_list.splice(scope.$index, 1)
this.form.set_list.splice(scope.$index, 1);
},
//
picListSuccessHandler(res, file, fileList) {
this.form.picture_list = fileList.map((item) => {
return item.response
? {
picture: item.response.url,
type: 0,
}
: {
picture: item.url,
type: 0,
};
});
},
picListRemoveHandler(file, fileList) {
this.form.picture_list = fileList.map((item) => {
return item.response
? {
picture: item.response.url,
type: 0,
}
: {
picture: item.url,
type: 0,
};
});
},
uploadFailVideo(err) {
console.log(err)
console.log(err);
},
uploadSuccessVideo(response) {
console.log(response)
this.form.video = response.url
console.log(response);
this.form.video = response.url;
},
uploadBeforeVideo(file) {
if ((file.size / 1000) > 10240) {
if (file.size / 1000 > 10240) {
Message({
type: 'warning',
message: '上传视频大小超过10M'
})
return false
type: "warning",
message: "上传视频大小超过10M",
});
return false;
}
},
//
uploadFailPic(err) {
console.log(err)
console.log(err);
},
uploadSuccessPic(response) {
console.log(response)
this.form.coverPicture = response.url
console.log(response);
this.form.coverPicture = response.url;
},
uploadBeforePic(file) {
if ((file.size / 1000) > 2048) {
if (file.size / 1000 > 2048) {
Message({
type: 'warning',
message: '上传图片大小超过2M'
})
return false
type: "warning",
message: "上传图片大小超过2M",
});
return false;
}
},
//
appendLabel() {
if (!this.$refs['labelInput'].getInput().value) return
this.form.featuredLabel.push(this.$refs['labelInput'].getInput().value)
this.labelText = ''
if (!this.$refs["labelInput"].getInput().value) return;
this.form.featuredLabel.push(this.$refs["labelInput"].getInput().value);
this.labelText = "";
},
//
labelClose(index) {
this.form.featuredLabel.splice(index, 1)
this.form.featuredLabel.splice(index, 1);
},
async getRoomTypes() {
const res = await getparameter({
number: 'confinementRoomType'
})
this.roomTypes = res.detail
number: "confinementRoomType",
});
this.roomTypes = res.detail;
},
async getClubs() {
const res = await clubIndex({
const res = await clubIndex(
{
page: this.clubSelect.page,
page_size: this.clubSelect.pageSize,
type: this.clubSelect.type
}, false)
type: this.clubSelect.type,
},
false
);
if (res?.data?.length === 0) {
this.$Message.info({
content: '没有更多了',
duration: 1
})
this.clubSelect.page--
content: "没有更多了",
duration: 1,
});
this.clubSelect.page--;
}
this.clubs.push(...res.data)
this.clubs.push(...res.data);
},
async getEquips() {
const res = await getparameter({
number: 'confinementEquip'
})
this.equips = res.detail
number: "confinementEquip",
});
this.equips = res.detail;
},
async getDetail() {
const res = await show({
id: this.id
})
console.log(res)
id: this.id,
});
console.log(res);
this.form = {
name: res?.name,
confinementServicesId: res?.common_services_id, //
roomType: res?.room_type,
sortNumber: res?.sort_number,
featuredLabel: res?.featured_label?.split(',') || [], //
featuredLabel: res?.featured_label?.split(",") || [], //
roomOrientation: res?.room_orientation, //
roomFacility: res?.room_facility?.split(',').map(item => Number(item)) || [], //
roomFacility:
res?.room_facility?.split(",").map((item) => Number(item)) || [], //
roomArea: res?.room_area,
price: res?.price,
state: !!res?.state,
recommend: !!res?.recommend,
coverPicture: res?.cover_picture,
timeLimit: res?.time_limit?.split(','),
timeLimit: res?.time_limit?.split(","),
content: res?.content,
video: res?.video,
set_list: [],
picture_list: []
}
this.$refs['tinymce'].setContent(this.form.content);
this.picfileList = this.getPic();
this.set_list = this.getCombo();
},
loadMoreClub() {
this.clubSelect.page++
this.getClubs()
},
async getCombo() {
let list = []
const res = await getCombo({
common_products_id: this.id
})
list.push(...res);
return list;
},
async getPic() {
let list = []
const res = await getPicture({
common_products_id: this.id
})
list.push(...res.map(item => {
set_list: res?.set.map((item) => {
return {
name: item.name,
content: item.content,
};
}),
picture_list: [],
};
this.picfileList = res?.picture.map((item) => {
return {
url: item.picture,
name: item.name || item.picture,
id: item.id
}
}))
return list;
name: item.created_at,
};
});
},
loadMoreClub() {
this.clubSelect.page++;
this.getClubs();
},
submit() {
let list = [];
this.picfileList.map(item => {
list.push({
picture: item.response.url,type:0
});
})
let _form = {
name: this.form.name,
room_type: this.form.roomType,
@ -530,63 +627,61 @@
time_limit: this.form.timeLimit?.toString(),
video: this.form.video,
set_list: this.form.set_list,
picture_list: list
}
if (this.type === 'add') {
store(_form).then(res => {
picture_list: this.form.picture_list,
};
if (this.type === "add") {
store(_form).then((res) => {
Message({
type: 'success',
message: '新增产品成功'
})
this.isShow = false
this.$emit('refresh')
})
} else if (this.type === 'editor') {
type: "success",
message: "新增产品成功",
});
this.isShow = false;
this.$emit("refresh");
});
} else if (this.type === "editor") {
save({
id: this.id,
..._form
}).then(res => {
..._form,
}).then((res) => {
Message({
type: 'success',
message: '编辑产品成功'
})
this.isShow = false
this.$emit('refresh')
})
}
type: "success",
message: "编辑产品成功",
});
this.isShow = false;
this.$emit("refresh");
});
}
},
},
watch: {
isShow(newVal) {
if (newVal) {
this.getClubs()
this.getClubs();
if (this.type === 'editor') {
this.getDetail()
if (this.type === "editor") {
this.getDetail();
}
} else {
this.id = ''
this.type = ''
this.clubs = []
this.clubSelect.page = 1
this.$refs['tinymce'].setContent(" ")
this.$refs['dialog'].reset()
}
}
}
this.id = "";
this.type = "";
this.clubs = [];
this.clubSelect.page = 1;
this.init()
}
},
},
};
</script>
<style scoped lang="scss">
::v-deep .ivu-select-dropdown {}
::v-deep .ivu-select-dropdown {
}
::v-deep .ivu-scroll-container {
height: 140px !important;
&::after {
content: '加载更多..';
content: "加载更多..";
text-align: center;
font-size: 10px;
zoom: 0.8;
@ -621,7 +716,7 @@
font-size: 10px;
white-space: nowrap;
word-break: keep-all;
content: '建议尺寸 800*450';
content: "建议尺寸 800*450";
zoom: 0.84;
position: absolute;
@ -638,7 +733,7 @@
position: absolute;
right: 0;
top: 0;
content: '(平方米)'
content: "(平方米)";
}
::v-deep .el-input__clear {
@ -668,7 +763,7 @@
}
.avatar-uploader .el-upload:hover {
border-color: #BF617C;
border-color: #bf617c;
}
.avatar-uploader-icon {

Loading…
Cancel
Save