zhangjie 3 年 前
コミット
92a1e671d3
51 ファイル変更1836 行追加847 行削除
  1. 363 0
      public/ckeditor/plugins/confighelper/LICENSE
  2. 5 0
      public/ckeditor/plugins/confighelper/README.md
  3. 142 0
      public/ckeditor/plugins/confighelper/docs/install.html
  4. 59 0
      public/ckeditor/plugins/confighelper/docs/styles.css
  5. 392 0
      public/ckeditor/plugins/confighelper/plugin.js
  6. BIN
      src/assets/images/icon-export-white.png
  7. 14 1
      src/assets/styles/base.scss
  8. 53 0
      src/assets/styles/element-ui-costom.scss
  9. 4 0
      src/assets/styles/home.scss
  10. 8 0
      src/assets/styles/icons.scss
  11. 8 0
      src/assets/styles/pages.scss
  12. 0 10
      src/components/ckeditor.vue
  13. 5 3
      src/modules/portal/views/home/Home.vue
  14. 25 6
      src/modules/portal/views/home/HomeSide.vue
  15. 7 11
      src/modules/questions/component/ckeditor.vue
  16. 0 1
      src/modules/questions/views/AuditInfo.vue
  17. 2 5
      src/modules/questions/views/BluePaperStructure.vue
  18. 5 1
      src/modules/questions/views/CheckDuplicateInfo.vue
  19. 16 6
      src/modules/questions/views/CheckDuplicateList.vue
  20. 15 53
      src/modules/questions/views/Course.vue
  21. 7 13
      src/modules/questions/views/CourseProperty.vue
  22. 223 230
      src/modules/questions/views/EditOtherQuestion.vue
  23. 74 30
      src/modules/questions/views/EditPaper.vue
  24. 1 1
      src/modules/questions/views/EditPaperPendingTrial.vue
  25. 10 10
      src/modules/questions/views/EditSelectQuestion.vue
  26. 6 9
      src/modules/questions/views/ExamPaperPendingTrial.vue
  27. 4 23
      src/modules/questions/views/ExportTemplate.vue
  28. 4 8
      src/modules/questions/views/GenPaper.vue
  29. 8 11
      src/modules/questions/views/ImportPaper.vue
  30. 11 3
      src/modules/questions/views/ImportPaperInfo.vue
  31. 33 24
      src/modules/questions/views/InsertBluePaperStructure.vue
  32. 15 9
      src/modules/questions/views/InsertBluePaperStructureInfo.vue
  33. 19 20
      src/modules/questions/views/InsertPaperStructure.vue
  34. 8 6
      src/modules/questions/views/InsertPaperStructureInfo.vue
  35. 2 2
      src/modules/questions/views/InsertPaperTitle.vue
  36. 1 1
      src/modules/questions/views/OrgProperty.vue
  37. 31 34
      src/modules/questions/views/PaperBasicComposition.vue
  38. 50 63
      src/modules/questions/views/PaperBlue.vue
  39. 6 13
      src/modules/questions/views/PaperPendingTrial.vue
  40. 37 55
      src/modules/questions/views/PaperQuestionType.vue
  41. 3 7
      src/modules/questions/views/PaperStorage.vue
  42. 2 5
      src/modules/questions/views/PaperStructure.vue
  43. 29 14
      src/modules/questions/views/PropertyInfo.vue
  44. 3 3
      src/modules/questions/views/Question.vue
  45. 9 3
      src/modules/questions/views/QuestionInfo.vue
  46. 4 16
      src/modules/questions/views/School.vue
  47. 86 87
      src/modules/questions/views/SelectQuestion.vue
  48. 0 11
      src/modules/questions/views/ViewPaper.vue
  49. 11 12
      src/modules/questions/views/data_previllege.vue
  50. 2 2
      src/modules/questions/views/data_previllege_add_course.vue
  51. 14 25
      src/modules/questions/views/user.vue

+ 363 - 0
public/ckeditor/plugins/confighelper/LICENSE

@@ -0,0 +1,363 @@
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. "Contributor"
+
+     means each individual or legal entity that creates, contributes to the
+     creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+
+     means the combination of the Contributions of others (if any) used by a
+     Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+
+     means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+
+     means Source Code Form to which the initial Contributor has attached the
+     notice in Exhibit A, the Executable Form of such Source Code Form, and
+     Modifications of such Source Code Form, in each case including portions
+     thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+     means
+
+     a. that the initial Contributor has attached the notice described in
+        Exhibit B to the Covered Software; or
+
+     b. that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the terms of
+        a Secondary License.
+
+1.6. "Executable Form"
+
+     means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+
+     means a work that combines Covered Software with other material, in a
+     separate file or files, that is not Covered Software.
+
+1.8. "License"
+
+     means this document.
+
+1.9. "Licensable"
+
+     means having the right to grant, to the maximum extent possible, whether
+     at the time of the initial grant or subsequently, any and all of the
+     rights conveyed by this License.
+
+1.10. "Modifications"
+
+     means any of the following:
+
+     a. any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered Software; or
+
+     b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. "Patent Claims" of a Contributor
+
+      means any patent claim(s), including without limitation, method,
+      process, and apparatus claims, in any patent Licensable by such
+      Contributor that would be infringed, but for the grant of the License,
+      by the making, using, selling, offering for sale, having made, import,
+      or transfer of either its Contributions or its Contributor Version.
+
+1.12. "Secondary License"
+
+      means either the GNU General Public License, Version 2.0, the GNU Lesser
+      General Public License, Version 2.1, the GNU Affero General Public
+      License, Version 3.0, or any later versions of those licenses.
+
+1.13. "Source Code Form"
+
+      means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+
+      means an individual or a legal entity exercising rights under this
+      License. For legal entities, "You" includes any entity that controls, is
+      controlled by, or is under common control with You. For purposes of this
+      definition, "control" means (a) the power, direct or indirect, to cause
+      the direction or management of such entity, whether by contract or
+      otherwise, or (b) ownership of more than fifty percent (50%) of the
+      outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+     Each Contributor hereby grants You a world-wide, royalty-free,
+     non-exclusive license:
+
+     a. under intellectual property rights (other than patent or trademark)
+        Licensable by such Contributor to use, reproduce, make available,
+        modify, display, perform, distribute, and otherwise exploit its
+        Contributions, either on an unmodified basis, with Modifications, or
+        as part of a Larger Work; and
+
+     b. under Patent Claims of such Contributor to make, use, sell, offer for
+        sale, have made, import, and otherwise transfer either its
+        Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+     The licenses granted in Section 2.1 with respect to any Contribution
+     become effective for each Contribution on the date the Contributor first
+     distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+     The licenses granted in this Section 2 are the only rights granted under
+     this License. No additional rights or licenses will be implied from the
+     distribution or licensing of Covered Software under this License.
+     Notwithstanding Section 2.1(b) above, no patent license is granted by a
+     Contributor:
+
+     a. for any code that a Contributor has removed from Covered Software; or
+
+     b. for infringements caused by: (i) Your and any other third party's
+        modifications of Covered Software, or (ii) the combination of its
+        Contributions with other software (except as part of its Contributor
+        Version); or
+
+     c. under Patent Claims infringed by Covered Software in the absence of
+        its Contributions.
+
+     This License does not grant any rights in the trademarks, service marks,
+     or logos of any Contributor (except as may be necessary to comply with
+     the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+     No Contributor makes additional grants as a result of Your choice to
+     distribute the Covered Software under a subsequent version of this
+     License (see Section 10.2) or under the terms of a Secondary License (if
+     permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+     Each Contributor represents that the Contributor believes its
+     Contributions are its original creation(s) or it has sufficient rights to
+     grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+     This License is not intended to limit any rights You have under
+     applicable copyright doctrines of fair use, fair dealing, or other
+     equivalents.
+
+2.7. Conditions
+
+     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+     Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+     All distribution of Covered Software in Source Code Form, including any
+     Modifications that You create or to which You contribute, must be under
+     the terms of this License. You must inform recipients that the Source
+     Code Form of the Covered Software is governed by the terms of this
+     License, and how they can obtain a copy of this License. You may not
+     attempt to alter or restrict the recipients' rights in the Source Code
+     Form.
+
+3.2. Distribution of Executable Form
+
+     If You distribute Covered Software in Executable Form then:
+
+     a. such Covered Software must also be made available in Source Code Form,
+        as described in Section 3.1, and You must inform recipients of the
+        Executable Form how they can obtain a copy of such Source Code Form by
+        reasonable means in a timely manner, at a charge no more than the cost
+        of distribution to the recipient; and
+
+     b. You may distribute such Executable Form under the terms of this
+        License, or sublicense it under different terms, provided that the
+        license for the Executable Form does not attempt to limit or alter the
+        recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+     You may create and distribute a Larger Work under terms of Your choice,
+     provided that You also comply with the requirements of this License for
+     the Covered Software. If the Larger Work is a combination of Covered
+     Software with a work governed by one or more Secondary Licenses, and the
+     Covered Software is not Incompatible With Secondary Licenses, this
+     License permits You to additionally distribute such Covered Software
+     under the terms of such Secondary License(s), so that the recipient of
+     the Larger Work may, at their option, further distribute the Covered
+     Software under the terms of either this License or such Secondary
+     License(s).
+
+3.4. Notices
+
+     You may not remove or alter the substance of any license notices
+     (including copyright notices, patent notices, disclaimers of warranty, or
+     limitations of liability) contained within the Source Code Form of the
+     Covered Software, except that You may alter any license notices to the
+     extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+     You may choose to offer, and to charge a fee for, warranty, support,
+     indemnity or liability obligations to one or more recipients of Covered
+     Software. However, You may do so only on Your own behalf, and not on
+     behalf of any Contributor. You must make it absolutely clear that any
+     such warranty, support, indemnity, or liability obligation is offered by
+     You alone, and You hereby agree to indemnify every Contributor for any
+     liability incurred by such Contributor as a result of warranty, support,
+     indemnity or liability terms You offer. You may include additional
+     disclaimers of warranty and limitations of liability specific to any
+     jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+   If it is impossible for You to comply with any of the terms of this License
+   with respect to some or all of the Covered Software due to statute,
+   judicial order, or regulation then You must: (a) comply with the terms of
+   this License to the maximum extent possible; and (b) describe the
+   limitations and the code they affect. Such description must be placed in a
+   text file included with all distributions of the Covered Software under
+   this License. Except to the extent prohibited by statute or regulation,
+   such description must be sufficiently detailed for a recipient of ordinary
+   skill to be able to understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+     fail to comply with any of its terms. However, if You become compliant,
+     then the rights granted under this License from a particular Contributor
+     are reinstated (a) provisionally, unless and until such Contributor
+     explicitly and finally terminates Your grants, and (b) on an ongoing
+     basis, if such Contributor fails to notify You of the non-compliance by
+     some reasonable means prior to 60 days after You have come back into
+     compliance. Moreover, Your grants from a particular Contributor are
+     reinstated on an ongoing basis if such Contributor notifies You of the
+     non-compliance by some reasonable means, this is the first time You have
+     received notice of non-compliance with this License from such
+     Contributor, and You become compliant prior to 30 days after Your receipt
+     of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+     infringement claim (excluding declaratory judgment actions,
+     counter-claims, and cross-claims) alleging that a Contributor Version
+     directly or indirectly infringes any patent, then the rights granted to
+     You by any and all Contributors for the Covered Software under Section
+     2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+     license agreements (excluding distributors and resellers) which have been
+     validly granted by You or Your distributors under this License prior to
+     termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+   Covered Software is provided under this License on an "as is" basis,
+   without warranty of any kind, either expressed, implied, or statutory,
+   including, without limitation, warranties that the Covered Software is free
+   of defects, merchantable, fit for a particular purpose or non-infringing.
+   The entire risk as to the quality and performance of the Covered Software
+   is with You. Should any Covered Software prove defective in any respect,
+   You (not any Contributor) assume the cost of any necessary servicing,
+   repair, or correction. This disclaimer of warranty constitutes an essential
+   part of this License. No use of  any Covered Software is authorized under
+   this License except under this disclaimer.
+
+7. Limitation of Liability
+
+   Under no circumstances and under no legal theory, whether tort (including
+   negligence), contract, or otherwise, shall any Contributor, or anyone who
+   distributes Covered Software as permitted above, be liable to You for any
+   direct, indirect, special, incidental, or consequential damages of any
+   character including, without limitation, damages for lost profits, loss of
+   goodwill, work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses, even if such party shall have been
+   informed of the possibility of such damages. This limitation of liability
+   shall not apply to liability for death or personal injury resulting from
+   such party's negligence to the extent applicable law prohibits such
+   limitation. Some jurisdictions do not allow the exclusion or limitation of
+   incidental or consequential damages, so this exclusion and limitation may
+   not apply to You.
+
+8. Litigation
+
+   Any litigation relating to this License may be brought only in the courts
+   of a jurisdiction where the defendant maintains its principal place of
+   business and such litigation shall be governed by laws of that
+   jurisdiction, without reference to its conflict-of-law provisions. Nothing
+   in this Section shall prevent a party's ability to bring cross-claims or
+   counter-claims.
+
+9. Miscellaneous
+
+   This License represents the complete agreement concerning the subject
+   matter hereof. If any provision of this License is held to be
+   unenforceable, such provision shall be reformed only to the extent
+   necessary to make it enforceable. Any law or regulation which provides that
+   the language of a contract shall be construed against the drafter shall not
+   be used to construe this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+      Mozilla Foundation is the license steward. Except as provided in Section
+      10.3, no one other than the license steward has the right to modify or
+      publish new versions of this License. Each version will be given a
+      distinguishing version number.
+
+10.2. Effect of New Versions
+
+      You may distribute the Covered Software under the terms of the version
+      of the License under which You originally received the Covered Software,
+      or under the terms of any subsequent version published by the license
+      steward.
+
+10.3. Modified Versions
+
+      If you create software not governed by this License, and you want to
+      create a new license for such software, you may create and use a
+      modified version of this License if you rename the license and remove
+      any references to the name of the license steward (except to note that
+      such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+      Licenses If You choose to distribute Source Code Form that is
+      Incompatible With Secondary Licenses under the terms of this version of
+      the License, the notice described in Exhibit B of this License must be
+      attached.
+
+Exhibit A - Source Code Form License Notice
+
+      This Source Code Form is subject to the
+      terms of the Mozilla Public License, v.
+      2.0. If a copy of the MPL was not
+      distributed with this file, You can
+      obtain one at
+      http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file,
+then You may include the notice in a location (such as a LICENSE file in a
+relevant directory) where a recipient would be likely to look for such a
+notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+
+      This Source Code Form is "Incompatible
+      With Secondary Licenses", as defined by
+      the Mozilla Public License, v. 2.0.
+

+ 5 - 0
public/ckeditor/plugins/confighelper/README.md

@@ -0,0 +1,5 @@
+confighelper
+============
+
+Configuration Helper + HTML5 placeholder for CKEditor.
+See docs/install.html for full details and install instructions

+ 142 - 0
public/ckeditor/plugins/confighelper/docs/install.html

@@ -0,0 +1,142 @@
+<!DOCTYPE HTML>
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>Configuration Helper plugin</title>
+<link href="styles.css" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+<h1>Configuration Helper Plugin for CKEditor</h1>
+
+<h2>Introduction</h2>
+<p>This plugin tries to help setup <a href="http://www.ckeditor.com">CKEditor</a> by providing additional configuration options to perform some
+kind of common tasks.</p>
+<p>Currently if offers a "removeDialogFields" that allows to remove individual fields in the dialogs (versus removing whole tabs with
+<a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.removeDialogTabs">removeDialogTabs</a>, and "dialogFieldsDefaultValues"
+defines default values for dialog fields.</p>
+
+<h3 id="contact">Author:</h3>
+<p><a href="mailto:amla70@gmail.com">Alfonso Mart&iacute;nez de Lizarrondo</a></p>
+
+<h3>Version history: </h3>
+<ol>
+  <li>1.0: 26-February-2012. First version.</li>
+  <li>1.1: 16-February-2012. Added placeholder.</li>
+  <li>1.2: 23-April-2012. Added hideDialogFields.</li>
+  <li>1.3: 1-December-2012. Compatibility with CKEditor 4.</li>
+  <li>1.4: 28-March-2013. Compatibility of the "placeholder" attribute with the inline mode of CKEditor 4.</li>
+  <li>1.5: 16-April-2013. Version 1.4 was broken in CKEditor 3.</li>
+  <li>1.6: 16-August-2013. Handle the setData method to update the "placeholder" status</li>
+  <li>1.7: 6-October-2013. <a href="https://github.com/AlfonsoML/confighelper/pull/2">Patch by bfavors</a> to fix handling placeholder on initial load of editor</li>
+  <li>1.8: 9-March-2014. <a href="http://ckeditor.com/comment/reply/128664/130294">Check for IE11 by Russel Ward</a><br>
+		Set caret into the empty paragraph correctly on first focus, <a href="https://github.com/AlfonsoML/confighelper/pull/5">patch by glanchow</a>
+	</li>
+  <li>1.8.1: 5-April-2014. <a href="https://github.com/AlfonsoML/confighelper/issues/6">Fix IE8 & IE9 problem with "inline textarea" if it's empty on start</a>
+	</li>
+  <li>1.8.2: 12-April-2014. <a href="https://github.com/AlfonsoML/confighelper/pull/8">Protect detection of empty content</a>. Thanks to tanihito.
+	</li>
+  <li>1.8.3: 30-November-2014. Force SCAYT to use the language that it's specified as the language for the contents.<br>
+			<a href="https://github.com/AlfonsoML/confighelper/pull/13">Listen to the contentDom event to avoid problems when calling setData in WYSIWYG mode</a>. Thanks to noam-si.
+	</li>
+  <li>1.8.4: 25-November-2018:
+	<a href="https://github.com/AlfonsoML/confighelper/pull/16">Catch errors from localStorage</a> Thanks to <a href="https://github.com/nikgt">nikgt</a><br>
+	Fix UTF-8 issue<br>
+	Fix missing assigment with tableProperties dialog<br>
+	Add license file<br>
+	<a href="https://github.com/AlfonsoML/confighelper/pull/23">Prevent editing the placeholder text if startupFocus is true</a>. Thanks to <a href="https://github.com/albincepa">Albince Paliakkara</a><br>
+	<a href="https://github.com/AlfonsoML/confighelper/pull/24">Prevent leaking editor instances on destroy</a>. Thanks to <a href="https://github.com/bendemboski">Ben Demboski </a>
+  <li>1.9.0: Removed compatibility with CKEditor 3.<br>
+			Code clean up with EsLint<br>
+			Safety check that requested dialog tabs exist before trying to work with them.<br>
+			<a href="https://github.com/AlfonsoML/confighelper/pull/25">Check editor.enterMode in removePlaceholder</a>. Thanks to <a href="https://github.com/JulesAchiel">Jules Achiel</a>.
+	</li>
+	<li>1.10: 16-June-2019<br>
+			<a href="https://github.com/AlfonsoML/confighelper/pull/26">removePlaceholder adds carriage return in Firefox and IE</a>. Thanks to <a href="https://github.com/JulesAchiel">Jules Achiel</a>.<br>
+			<a href="https://github.com/AlfonsoML/confighelper/pull/28">Do not add placeholder when CKE is readOnly</a>. Thanks to <a href="https://github.com/JulesAchiel">Jules Achiel</a>.<br>
+	</li>
+	<li>1.10.1: 17-June-2019<br>
+			Fix unterminated string error.
+	</li>
+</ol>
+
+<h2>Installation</h2>
+<h3>1. Copying the files</h3>
+<p>Extract the contents of the zip in you plugins directory, so it ends up like
+    this<br>
+    <!--<img src="installation.png" alt="Screenshot of installation" width="311" height="346" longdesc="#install">-->
+    </p>
+<pre id="--install">
+ckeditor\
+	...
+	images\
+	lang\
+	plugins\
+		...
+		confighelper\
+			plugin.js
+			docs\
+				install.html
+		...
+	skins\
+	themes\
+</pre>
+<h3>2. Adding it to CKEditor</h3>
+<p>Now add the plugin in your <em>config.js</em> or custom js configuration
+file:
+<code>config.extraPlugins='confighelper'; </code>
+</p>
+
+<h3>3. Configuration</h3>
+<h4>config.removeDialogFields</h4>
+<p>This entry is a string, the fields are defined as dialogName + ":" + tab + ":" + field. Fields are joined with semicolons.
+In order to learn the name of the parameters you can use the "Developer Tools plugin", launch that sample and open the dialog that you want to customize.
+Now a little popup with appear showing the info about that field, for example:
+<pre><u>Element Information</u>
+Dialog window name : image
+Tab name : info
+Element ID : txtBorder
+Element type : text
+</pre>
+so in order to remove the class attribute for images the config is:
+<pre>config.removeDialogFields="image:info:txtBorder";</pre>
+removing another field
+<pre>config.removeDialogFields="image:info:txtBorder;image:info:txtHSpace";</pre>
+
+<h4>config.dialogFieldsDefaultValues</h4>
+<p>This setting uses directly a JSON object as the configuration value, first an object that has the dialog names as properties, each property is
+a new object with the name of the tabs and finally each property name maps to the field name and it's value is the default value to use for the field.</p>
+<p>An example might be much better as I might have messed up something in the description:</p>
+<pre>config.dialogFieldsDefaultValues =
+{
+	image:
+		{
+			advanced:
+				{
+					txtGenClass : 'myClass',
+					txtGenTitle : 'Image title'
+				}
+		}
+};
+</pre>
+
+<h4>config.placeholder</h4>
+<p>This a text that will be shown when the editor is empty following the HTML5 placeholder attribute. When the user focus the editor, the content is
+cleared automatically.</p>
+<p>The value can be set in the configuration or as an attribute of the replaced element</p>
+<pre>config.placeholder = 'Type here...';</pre>
+
+<h4>config.hideDialogFields</h4>
+<p>This entry uses the same sintax that the 'removeDialogFields' option. The difference is that some fields can't be removed easily as other parts of the dialog
+might not be ready and might try to always use it, generating a javascript error. In other cases the layout might be broken if the field is removed instead of hidden.<br>
+In those cases it's possible to hide the fields using this entry, and the preview in the image dialog is an example of such a field.</p>
+<pre>config.hideDialogFields="image:info:htmlPreview";</pre>
+
+<!--
+<h2>Final notes</h2>
+-->
+
+<h2>Disclaimers</h2>
+<p>CKEditor is  &copy; CKSource.com</p>
+</body>
+</html>

+ 59 - 0
public/ckeditor/plugins/confighelper/docs/styles.css

@@ -0,0 +1,59 @@
+body {
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 90%;
+}
+h1 {
+	text-align:center;
+	font-size:180%;
+}
+h2 {
+	border-bottom:2px solid #CCC;
+	margin:1em 0 0.4em 0;
+}
+h3 {
+	margin-bottom:0.4em;
+}
+p {
+	margin:0 0 1em 1em;
+	text-align:justify;
+}
+ol {
+	margin:0 0 1.2em 1em;
+	padding:0;
+	list-style-type:none;
+}
+ol li {
+	margin:0.2em 0;
+}
+pre, code {
+	font-size:100%;
+	font-family:"Courier New", Courier, mono;
+	background-color: #CCCCCC;
+	border:1px solid #999;
+	padding:0.2em 1em;
+	margin: 0.4em 0;
+	display:block;
+	white-space: pre;
+	overflow: auto;
+}
+form {
+	margin:0 0 0 1em;
+}
+span.key {
+	color: #006600;
+}
+#install {
+	display:none
+}
+#languages ul {
+	display:inline;
+	list-style-type:none;
+	margin:0;
+	padding:0;
+}
+#languages li {
+	display:inline;
+	margin:0;
+	padding:0;
+	vertical-align:bottom;
+}

+ 392 - 0
public/ckeditor/plugins/confighelper/plugin.js

@@ -0,0 +1,392 @@
+/**
+ * @file Configuration helper plugin for CKEditor
+ * Copyright (C) 2012 Alfonso Martínez de Lizarrondo
+ *
+ */
+/* global CKEDITOR */
+(function () {
+  "use strict";
+
+  // Check if the browser supports the placeholder attribute on textareas natively.
+  var supportsPlaceholder = "placeholder" in document.createElement("textarea");
+
+  // If the data is "empty" (BR, P) or the placeholder then return an empty string.
+  // Otherwise return the original data
+  function dataIsEmpty(data) {
+    if (!data) return true;
+
+    if (data.length > 20) return false;
+
+    var value = data.replace(/[\n|\t]*/g, "").toLowerCase();
+    if (
+      !value ||
+      value == "<br>" ||
+      value == "<p>&nbsp;<br></p>" ||
+      value == "<p><br></p>" ||
+      value == "<div><br></div>" ||
+      value == "<p>&nbsp;</p>" ||
+      value == "&nbsp;" ||
+      value == " " ||
+      value == "&nbsp;<br>" ||
+      value == " <br>"
+    )
+      return true;
+
+    return false;
+  }
+
+  function addPlaceholder(ev) {
+    var editor = ev.editor;
+
+    // do not add placeholder in readOnly mode
+    if (editor.readOnly) return;
+
+    var root = editor.editable();
+    var placeholder = ev.listenerData;
+    if (!root) return;
+
+    if (editor.mode == "wysiwyg") {
+      // If the blur is due to a dialog, don't apply the placeholder
+      if (CKEDITOR.dialog._.currentTop) return;
+
+      if (!root) return;
+
+      if (dataIsEmpty(root.getHtml())) {
+        root.setHtml(placeholder);
+        root.addClass("placeholder");
+      }
+    }
+
+    if (editor.mode == "source") {
+      if (supportsPlaceholder) {
+        if (ev.name == "mode") {
+          root.setAttribute("placeholder", placeholder);
+        }
+        return;
+      }
+
+      if (dataIsEmpty(root.getValue())) {
+        root.setValue(placeholder);
+        root.addClass("placeholder");
+      }
+    }
+  }
+
+  function removePlaceholder(ev) {
+    var editor = ev.editor;
+    var root = editor.editable();
+    if (!root) return;
+
+    if (editor.mode == "wysiwyg") {
+      if (!root.hasClass("placeholder")) return;
+
+      root.removeClass("placeholder");
+      // fill it properly
+      if (CKEDITOR.dtd[root.getName()]["p"]) {
+        var value = "";
+        if (editor.enterMode === CKEDITOR.ENTER_P) {
+          value = "<p><br/></p>";
+        } else if (editor.enterMode === CKEDITOR.ENTER_DIV) {
+          value = "<div><br/></div>";
+        } else {
+          // This is for CKEDITOR.ENTER_BR
+          value = "<br/>";
+          // FireFox prepends an additional line
+          if (CKEDITOR.env.gecko || CKEDITOR.env.ie) {
+            value = " ";
+          }
+        }
+        root.setHtml(value);
+        // Set caret in position
+        var range = new CKEDITOR.dom.range(editor.document);
+        range.moveToElementEditablePosition(root.getFirst(), true);
+        editor.getSelection().selectRanges([range]);
+      } else {
+        root.setHtml(" ");
+      }
+    }
+
+    if (editor.mode == "source") {
+      if (!root.hasClass("placeholder")) return;
+
+      root.removeClass("placeholder");
+      root.setValue("");
+    }
+  }
+
+  function handleReadOnlyChange(ev) {
+    var editor = ev.editor;
+    if (editor.readOnly) {
+      removePlaceholder(ev);
+    } else {
+      addPlaceholder(ev);
+    }
+  }
+
+  function getLang(element) {
+    if (!element) return null;
+
+    return element.getAttribute("lang") || getLang(element.getParent());
+  }
+
+  CKEDITOR.plugins.add("confighelper", {
+    getPlaceholderCss: function () {
+      return ".placeholder{ color: #999; }";
+    },
+
+    onLoad: function () {
+      CKEDITOR.addCss(this.getPlaceholderCss());
+    },
+
+    init: function (editor) {
+      // correct focus status after switch mode
+      editor.on("mode", function (ev) {
+        // Let's update to match reality
+        ev.editor.focusManager.hasFocus = false;
+        // Now focus it:
+      });
+
+      // Placeholder - Start
+      // Get the placeholder from the replaced element or from the configuration
+      var placeholder =
+        editor.element.getAttribute("placeholder") || editor.config.placeholder;
+
+      if (placeholder) {
+        // CSS for textarea mode
+        var node = CKEDITOR.document.getHead().append("style");
+        node.setAttribute("type", "text/css");
+        var content =
+          "textarea.placeholder { color: #999; font-style: italic; }";
+
+        if (CKEDITOR.env.ie && CKEDITOR.env.version < 11)
+          node.$.styleSheet.cssText = content;
+        else node.$.innerHTML = content;
+
+        // Watch for the calls to getData to remove the placeholder
+        editor.on("getData", function (ev) {
+          var element = editor.editable();
+
+          if (element && element.hasClass("placeholder"))
+            ev.data.dataValue = "";
+        });
+
+        // Watch for setData to remove placeholder class
+        editor.on("setData", function (ev) {
+          if (CKEDITOR.dialog._.currentTop) return;
+
+          if (editor.mode == "source" && supportsPlaceholder) return;
+
+          var root = editor.editable();
+
+          if (!root) return;
+
+          if (!dataIsEmpty(ev.data.dataValue)) {
+            // Remove the class if new data is not empty
+            if (root.hasClass("placeholder")) root.removeClass("placeholder");
+          } else {
+            // if data is empty, set it to the placeholder
+            addPlaceholder(ev);
+          }
+        });
+
+        editor.on("blur", addPlaceholder, null, placeholder);
+        editor.on("mode", addPlaceholder, null, placeholder);
+        editor.on("contentDom", addPlaceholder, null, placeholder);
+
+        editor.on("focus", removePlaceholder);
+        editor.on("key", removePlaceholder);
+        editor.on("beforeModeUnload", removePlaceholder);
+
+        editor.on("readOnly", handleReadOnlyChange, null, placeholder);
+      } // Placeholder - End
+
+      // SCAYT lang from element lang:
+      var lang = editor.config.contentsLanguage || getLang(editor.element);
+      if (lang && editor.plugins.scayt && !editor.config.scayt_sLang) {
+        try {
+          // Remove the stored language
+          if (localStorage) localStorage.removeItem("scayt_0_lang");
+        } catch (e) {
+          /* */
+        }
+
+        // Convert from HTML5 Lang to spellchecker.net values
+        var map = {
+          en: "en_US",
+          "en-us": "en_US",
+          "en-gb": "en_GB",
+          "pt-br": "pt_BR",
+          da: "da_DK",
+          "da-dk": "da_DK",
+          "nl-nl": "nl_NL",
+          "en-ca": "en_CA",
+          "fi-fi": "fi_FI",
+          fr: "fr_FR",
+          "fr-fr": "fr_FR",
+          "fr-ca": "fr_CA",
+          de: "de_DE",
+          "de-de": "de_DE",
+          "el-gr": "el_GR",
+          it: "it_IT",
+          "it-it": "it_IT",
+          "nb-no": "nb_NO",
+          pt: "pt_PT",
+          "pt-pt": "pt_PT",
+          es: "es_ES",
+          "es-es": "es_ES",
+          "sv-se": "sv_SE",
+        };
+        editor.config.scayt_sLang = map[lang.toLowerCase()];
+      }
+
+      // Parse the config to turn it into a js object
+      // format= dialogName:tabName:fieldName
+      var parseDefinitionToObject = function (value) {
+        // Allow JSON definitions
+        if (typeof value == "object") return value;
+
+        var contents = value.split(";"),
+          tabsToProcess = {},
+          i;
+
+        for (i = 0; i < contents.length; i++) {
+          var parts = contents[i].split(":");
+          if (parts.length == 3) {
+            var dialogName = parts[0],
+              tabName = parts[1],
+              fieldName = parts[2];
+
+            if (!tabsToProcess[dialogName]) tabsToProcess[dialogName] = {};
+            if (!tabsToProcess[dialogName][tabName])
+              tabsToProcess[dialogName][tabName] = [];
+
+            tabsToProcess[dialogName][tabName].push(fieldName);
+          }
+        }
+        return tabsToProcess;
+      };
+
+      // Customize dialogs:
+      function customizeDialogs(ev) {
+        if (editor != ev.editor) return;
+
+        var dialogName = ev.data.name,
+          dialogDefinition = ev.data.definition,
+          tabsToProcess,
+          i,
+          name,
+          fields,
+          tab;
+
+        if (dialogName == "tableProperties") dialogName = "table";
+
+        // Parse the config to turn it into a js object
+        if (
+          !("removeDialogFields" in editor._) &&
+          editor.config.removeDialogFields
+        )
+          editor._.removeDialogFields = parseDefinitionToObject(
+            editor.config.removeDialogFields
+          );
+
+        // Remove fields of this dialog.
+        if (
+          editor._.removeDialogFields &&
+          (tabsToProcess = editor._.removeDialogFields[dialogName])
+        ) {
+          for (name in tabsToProcess) {
+            fields = tabsToProcess[name];
+            tab = dialogDefinition.getContents(name);
+            if (!tab) continue;
+
+            for (i = 0; i < fields.length; i++) tab.remove(fields[i]);
+          }
+        }
+
+        if (!("hideDialogFields" in editor._) && editor.config.hideDialogFields)
+          editor._.hideDialogFields = parseDefinitionToObject(
+            editor.config.hideDialogFields
+          );
+
+        // Remove fields of this dialog.
+        if (
+          editor._.hideDialogFields &&
+          (tabsToProcess = editor._.hideDialogFields[dialogName])
+        ) {
+          for (name in tabsToProcess) {
+            fields = tabsToProcess[name];
+            tab = dialogDefinition.getContents(name);
+            if (!tab) continue;
+
+            for (i = 0; i < fields.length; i++)
+              tab.get(fields[i]).hidden = true;
+          }
+        }
+
+        // Set default values.
+        if (
+          editor.config.dialogFieldsDefaultValues &&
+          (tabsToProcess = editor.config.dialogFieldsDefaultValues[dialogName])
+        ) {
+          for (name in tabsToProcess) {
+            fields = tabsToProcess[name];
+            tab = dialogDefinition.getContents(name);
+            if (!tab) continue;
+
+            for (var fieldName in fields) {
+              var dialogField = tab.get(fieldName);
+              if (dialogField) dialogField["default"] = fields[fieldName];
+            }
+          }
+        }
+      }
+
+      CKEDITOR.on("dialogDefinition", customizeDialogs);
+      editor.once("beforeDestroy", function () {
+        CKEDITOR.removeListener("dialogDefinition", customizeDialogs);
+      });
+    },
+  });
+})();
+
+/**
+ * Allows to define which dialog fiels must be removed
+ * @name CKEDITOR.config.removeDialogFields
+ * @type {String}
+ * @example
+ *	editor.config.removeDialogFields = "image:info:txtBorder;image:info:txtHSpace";
+ */
+
+/**
+ * Allows to define which dialog fiels must be hidden
+ * @name CKEDITOR.config.hideDialogFields
+ * @type {String}
+ * @example
+ *	editor.config.hideDialogFields = "image:info:htmlPreview";
+ */
+
+/**
+  * Allows to define default values for dialog fields
+  * @name CKEDITOR.config.dialogFieldsDefaultValues
+  * @type {Object}
+  * @example
+	config.dialogFieldsDefaultValues =
+	{
+		image:
+			{
+				advanced:
+					{
+						txtGenClass : 'myClass',
+						txtGenTitle : 'Image title'
+					}
+			}
+	};
+  */
+
+/**
+ * Placeholder text for empty editor
+ * @name CKEDITOR.config.placeholder
+ * @type {String}
+ * @example
+ *	editor.config.placeholder = "Please, type here...";
+ */

BIN
src/assets/images/icon-export-white.png


+ 14 - 1
src/assets/styles/base.scss

@@ -223,11 +223,18 @@ body {
   .cke_focus {
     border-color: $--color-text-secondary;
   }
-
+  .cke_button__image {
+    display: none !important;
+  }
   p {
     margin: 0;
   }
 }
+.area-ckeditor {
+  .cke_textarea_inline {
+    min-height: 200px;
+  }
+}
 // other
 .box-justify {
   display: flex;
@@ -237,6 +244,9 @@ body {
 .padding-tb-20 {
   padding: 20px 0;
 }
+.padding-top-6 {
+  padding-top: 6px;
+}
 .padding-none {
   padding: 0 !important;
 }
@@ -272,6 +282,9 @@ body {
   height: 25px;
   line-height: 25px;
 }
+.pull_length {
+  width: 180px;
+}
 .select_width {
   width: 150px;
 }

+ 53 - 0
src/assets/styles/element-ui-costom.scss

@@ -50,6 +50,54 @@
     }
   }
 }
+.action-dropdown {
+  background-color: $--color-text-primary;
+  padding: 0 19px;
+  .el-dropdown-menu__item {
+    padding: 0;
+    line-height: 40px;
+    border-bottom: 1px solid #434555;
+    background-color: transparent !important;
+
+    &:hover {
+      .el-button {
+        color: $--color-white !important;
+      }
+      .el-button--danger {
+        color: $--color-danger !important;
+      }
+    }
+  }
+  .el-button {
+    color: #aaa !important;
+    background-color: transparent !important;
+    border: none !important;
+    outline: none !important;
+    padding: 0 3px !important;
+    font-size: 13px;
+
+    &:hover {
+      color: $--color-white !important;
+    }
+  }
+
+  &.el-popper[x-placement^="bottom"] {
+    .popper__arrow {
+      border-bottom-color: $--color-text-primary;
+      &::after {
+        border-bottom-color: $--color-text-primary;
+      }
+    }
+  }
+  &.el-popper[x-placement^="top"] {
+    .popper__arrow {
+      border-top-color: $--color-text-primary;
+      &::after {
+        border-bottom-color: $--color-text-primary;
+      }
+    }
+  }
+}
 // el-form
 .el-form-linemess {
   .el-form {
@@ -96,6 +144,11 @@
       }
     }
   }
+  &.is-plain:focus {
+    .icon {
+      filter: brightness(250%);
+    }
+  }
   &.is-disabled {
     .icon {
       opacity: 0.5;

+ 4 - 0
src/assets/styles/home.scss

@@ -147,6 +147,10 @@
     height: 50px;
     line-height: 50px;
     font-weight: 600;
+
+    > .icon {
+      margin-right: 12px;
+    }
   }
   .el-submenu .el-menu-item {
     padding-left: 64px !important;

+ 8 - 0
src/assets/styles/icons.scss

@@ -52,6 +52,10 @@
     background-image: url(../images/icon-delete.png);
     @include icon-12;
   }
+  &-delete-white {
+    background-image: url(../images/icon-delete-white.png);
+    @include icon-12;
+  }
   &-save {
     background-image: url(../images/icon-save.png);
     @include icon-12;
@@ -104,6 +108,10 @@
     background-image: url(../images/icon-export.png);
     @include icon-12;
   }
+  &-export-white {
+    background-image: url(../images/icon-export-white.png);
+    @include icon-12;
+  }
   &-audit {
     background-image: url(../images/icon-audit.png);
     @include icon-12;

+ 8 - 0
src/assets/styles/pages.scss

@@ -115,6 +115,14 @@
     }
   }
 }
+.topic-set-list {
+  .topic-set {
+    min-width: 100px;
+    display: inline-block;
+    vertical-align: top;
+    margin: 0 5px;
+  }
+}
 // edit paper
 .edit-paper {
   .edit-header {

+ 0 - 10
src/components/ckeditor.vue

@@ -96,13 +96,3 @@ export default {
   },
 };
 </script>
-<style>
-.ckeditor::after {
-  content: "";
-  display: table;
-  clear: both;
-}
-.cke_button__image {
-  display: none !important;
-}
-</style>

+ 5 - 3
src/modules/portal/views/home/Home.vue

@@ -90,8 +90,10 @@
         </el-tab-pane>
       </el-tabs>
       <div v-if="userTabName === 'second'" slot="footer">
-        <el-button type="primary" @click="submitForm">保 存</el-button>
-        <el-button @click="userDialog = false">取 消</el-button>
+        <el-button type="primary" @click="submitForm">保存</el-button>
+        <el-button type="danger" plain @click="userDialog = false"
+          >取消</el-button
+        >
       </div>
     </el-dialog>
     <el-dialog
@@ -147,7 +149,7 @@
           <el-button type="primary" @click="submitPassWeakForm"
             >确 认</el-button
           >
-          <el-button @click="logout">取 消</el-button>
+          <el-button type="danger" plain @click="logout">取消</el-button>
         </el-row>
       </el-form>
     </el-dialog>

+ 25 - 6
src/modules/portal/views/home/HomeSide.vue

@@ -10,7 +10,7 @@
       active-text-color="#705eff"
       text-color="#383b4a"
       router
-      :default-active="$route.path"
+      :default-active="curRoutePath"
     >
       <el-submenu
         v-for="menu1 in menuList1"
@@ -18,7 +18,8 @@
         :index="menu1.nodeCode"
       >
         <template slot="title">
-          <i class="el-icon-menu"></i> <span>{{ menu1.name }}</span>
+          <!-- <i class="el-icon-menu"></i> <span>{{ menu1.name }}</span> -->
+          <i :class="menu1.icon"></i> <span>{{ menu1.name }}</span>
         </template>
 
         <el-menu-item
@@ -79,6 +80,14 @@ const routesToMenu = [
     groupCode: "REPORTS_MENUS",
   },
 ];
+const MENU_ICONS = {
+  base_info: "base",
+  course_manage: "course",
+  structure_manage: "create-paper",
+  question_bank: "question-book",
+  paper_manage: "paper-book",
+  ques_manage: "question",
+};
 
 import { mapMutations } from "vuex";
 import { UPDATE_CURRENT_PATHS } from "../../store/currentPaths";
@@ -90,15 +99,19 @@ export default {
     return {
       group: null,
       menuList: [],
+      curRoutePath: "",
       isCollapse: false,
     };
   },
   computed: {
     ...mapState({ user: (state) => state.user }),
     menuList1() {
-      return this.menuList.filter(
-        (m) => m.parentId === null && m.ext1 === "menu"
-      );
+      return this.menuList
+        .filter((m) => m.parentId === null && m.ext1 === "menu")
+        .map((m) => {
+          m.icon = `icon icon-${MENU_ICONS[m.code]}`;
+          return m;
+        });
     },
   },
   watch: {
@@ -133,8 +146,14 @@ export default {
       );
     },
     updatePath() {
+      // console.log("home update");
+      let curRoutePath = this.$route.path;
+      if (curRoutePath.endsWith("/1")) {
+        curRoutePath = curRoutePath.slice(0, -2) + "/0";
+      }
+      this.curRoutePath = curRoutePath;
       let currentPaths = [];
-      let part = this.menuList.find((v) => v.ext5 === this.$route.path);
+      let part = this.menuList.find((v) => v.ext5 === curRoutePath);
       if (!part) {
         this.UPDATE_CURRENT_PATHS([]);
         return;

+ 7 - 11
src/modules/questions/component/ckeditor.vue

@@ -41,6 +41,10 @@ export default {
       type: String,
       default: "",
     },
+    placeholder: {
+      type: String,
+      default: "请输入内容",
+    },
   },
   computed: {
     instance() {
@@ -57,7 +61,8 @@ export default {
       language: this.language,
       height: this.height,
       width: this.width,
-      extraPlugins: this.extraplugins + ",base64image,pastebase64,image2",
+      extraPlugins:
+        this.extraplugins + ",base64image,pastebase64,image2,confighelper",
       toolbarGroups: [
         { name: "clipboard", groups: ["clipboard", "undo"] },
         {
@@ -80,6 +85,7 @@ export default {
         { name: "colors", groups: ["colors"] },
         { name: "about", groups: ["about"] },
       ],
+      placeholder: this.placeholder,
       removePlugins: "bidi,colorbutton,image",
       removeButtons:
         "Table,Font,FontSize,Styles,Format,ShowBlocks,Iframe,PageBreak,Smiley,Flash,Language,JustifyBlock,JustifyRight,JustifyCenter,JustifyLeft,CreateDiv,CopyFormatting,ImageButton,Button,HiddenField,Select,Textarea,TextField,Radio,Checkbox,Form,BGColor,SelectAll,Replace,Find,Templates,Print,Preview,NewPage,Save,HorizontalRule,Unlink,Link,Scayt,Cut,Copy,Paste,PasteText,PasteFromWord,Maximize,NumberedList,BulletedList,Indent,Outdent,Blockquote,About,RemoveFormat,Strike",
@@ -104,13 +110,3 @@ export default {
   },
 };
 </script>
-<style>
-.ckeditor::after {
-  content: "";
-  display: table;
-  clear: both;
-}
-.cke_button__image {
-  display: none !important;
-}
-</style>

+ 0 - 1
src/modules/questions/views/AuditInfo.vue

@@ -84,4 +84,3 @@ export default {
   },
 };
 </script>
-<style scoped src="../styles/EditPaper.css"></style>

+ 2 - 5
src/modules/questions/views/BluePaperStructure.vue

@@ -1,8 +1,5 @@
 <template>
   <section class="content">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['基础信息', '蓝图试卷结构']" />
-    </div>
     <!-- 正文信息 -->
     <div class="part-box">
       <h2 class="part-box-title">蓝图试卷结构</h2>
@@ -111,6 +108,7 @@
               <el-button
                 size="mini"
                 type="danger"
+                plain
                 @click="deleteStruct(scope.row)"
                 >删除</el-button
               >
@@ -134,9 +132,8 @@
 </template>
 <script>
 import { QUESTION_API } from "@/constants/constants";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  components: { LinkTitlesCustom },
   data() {
     return {
       formSearch: {

+ 5 - 1
src/modules/questions/views/CheckDuplicateInfo.vue

@@ -73,7 +73,6 @@ export default {
   computed: {
     ...mapState({ user: (state) => state.user }),
   },
-  watch: {},
   //钩子函数
   created() {
     this.from = this.$route.params.from;
@@ -125,6 +124,11 @@ export default {
       }
     }
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", ["题库查重", "试题详情"]);
+    }, 200);
+  },
   methods: {
     next() {
       this.$http

+ 16 - 6
src/modules/questions/views/CheckDuplicateList.vue

@@ -173,7 +173,7 @@
                 <el-button type="primary" size="mini" plain>
                   快速审核<i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       size="mini"
@@ -241,13 +241,19 @@
           </el-select>
         </el-form-item>
         <el-form-item label="题干">
-          <span class="ques-body" v-html="quesModel.quesBody"></span>
+          <div
+            class="paper-question-body padding-top-6"
+            v-html="quesModel.quesBody"
+          ></div>
         </el-form-item>
         <!-- 非套题 -->
         <div v-if="quesModel.questionType !== 'NESTED_ANSWER_QUESTION'">
           <template v-for="(quesOption, index) in quesModel.quesOptions">
-            <el-form-item :key="index" :label="index | optionOrderWordFilter">
-              <span class="ques-body" v-html="quesOption.optionBody"></span>
+            <el-form-item :key="index">
+              <div class="paper-question-option">
+                <span>{{ index | optionOrderWordFilter }}. </span>
+                <span v-html="quesOption.optionBody"></span>
+              </div>
             </el-form-item>
           </template>
         </div>
@@ -288,16 +294,20 @@
         <!-- 非套题答案 -->
         <div v-if="quesModel.questionType !== 'NESTED_ANSWER_QUESTION'">
           <el-form-item label="答案">
-            <span v-html="answer"></span>
+            <div
+              class="paper-question-body padding-top-6"
+              v-html="answer"
+            ></div>
           </el-form-item>
         </div>
       </el-form>
     </el-dialog>
+
     <el-dialog title="提示" :visible.sync="deleteDialogVisible">
       <span>{{ deleteInfo }}</span>
       <span slot="footer" class="dialog-footer">
         <el-button type="primary" @click="deleteDialogVisible = false"
-          >确 定</el-button
+          >确定</el-button
         >
       </span>
     </el-dialog>

+ 15 - 53
src/modules/questions/views/Course.vue

@@ -15,26 +15,13 @@
         :model="formSearch"
       >
         <el-form-item label="课程名称">
-          <el-input
-            v-model="formSearch.name"
-            class="input_width_lg"
-            placeholder="请输入课程名称"
-          />
+          <el-input v-model="formSearch.name" placeholder="请输入课程名称" />
         </el-form-item>
         <el-form-item label="课程代码">
-          <el-input
-            v-model="formSearch.code"
-            class="input_width_lg"
-            placeholder="请输入课程代码"
-          />
+          <el-input v-model="formSearch.code" placeholder="请输入课程代码" />
         </el-form-item>
         <el-form-item label="课程状态">
-          <el-select
-            v-model="formSearch.enable"
-            class="input_width_lg"
-            placeholder="请选择"
-            clearable
-          >
+          <el-select v-model="formSearch.enable" placeholder="请选择" clearable>
             <el-option
               v-for="item in statusList"
               :key="item.value"
@@ -44,12 +31,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="层次">
-          <el-select
-            v-model="formSearch.level"
-            class="input_width_lg"
-            placeholder="请选择"
-            clearable
-          >
+          <el-select v-model="formSearch.level" placeholder="请选择" clearable>
             <el-option
               v-for="item in levelList"
               :key="item.value"
@@ -61,7 +43,6 @@
         <el-form-item label="专业" prop="specialtyId">
           <el-select
             v-model="formSearch.specialtyId"
-            class="input_width_lg"
             remote
             :remote-method="getSpecialtyList4Search"
             :loading="specialtyLoading4Search"
@@ -283,14 +264,16 @@
       </el-form>
 
       <div slot="footer">
-        <el-button type="primary" @click="submitForm">保 存</el-button>
-        <el-button @click="courseDialog = false">取 消</el-button>
+        <el-button type="primary" @click="submitForm">保存</el-button>
+        <el-button type="danger" plain @click="courseDialog = false"
+          >取消</el-button
+        >
       </div>
     </el-dialog>
 
     <!-- 导入弹窗 -->
     <el-dialog
-      title="导入窗口"
+      title="导入课程"
       width="520px"
       :visible.sync="impDialog"
       :modal="false"
@@ -318,15 +301,14 @@
               slot="trigger"
               size="small"
               type="primary"
-              icon="el-icon-search"
+              icon="icon icon-search-white"
             >
               选择文件
             </el-button>
-            &nbsp;
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-check"
+              icon="icon icon-save-white"
               @click="submitUpload"
             >
               确认上传
@@ -334,7 +316,7 @@
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-refresh"
+              icon="icon icon-delete-white"
               @click="removeFile"
             >
               清空文件
@@ -342,7 +324,7 @@
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-download"
+              icon="icon icon-export-white"
               @click="exportFile"
             >
               下载模板
@@ -381,14 +363,12 @@
         <el-form-item label="专业名称">
           <el-input
             v-model="specialtySearchForm.name"
-            class="input_width_lg"
             placeholder="请输入专业名称"
           />
         </el-form-item>
         <el-form-item label="专业代码">
           <el-input
             v-model="specialtySearchForm.code"
-            class="input_width_lg"
             placeholder="请输入专业代码"
           />
         </el-form-item>
@@ -491,9 +471,9 @@
       </el-form>
       <div slot="footer">
         <el-button type="primary" @click="submitAddRelationForm">
-          保 
+          保存
         </el-button>
-        <el-button @click="addRelationDialog = false">取 消</el-button>
+        <el-button @click="addRelationDialog = false">取消</el-button>
       </div>
     </el-dialog>
   </section>
@@ -1152,21 +1132,3 @@ export default {
   },
 };
 </script>
-
-<style scoped>
-.page {
-  margin-top: 10px;
-}
-
-.input_width_lg {
-  width: 180px;
-}
-
-.pull_length {
-  width: 180px;
-}
-
-.pull-center {
-  margin-left: 30%;
-}
-</style>

+ 7 - 13
src/modules/questions/views/CourseProperty.vue

@@ -1,8 +1,5 @@
 <template>
   <section class="content">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['基础信息', '课程属性预设']" />
-    </div>
     <!-- 正文信息 -->
     <div class="part-box">
       <h2 class="part-box-title">课程属性</h2>
@@ -213,10 +210,10 @@
       </el-form>
       <div slot="footer">
         <el-button type="primary" @click="submit('coursePropertyForm')"
-          >保 存</el-button
+          >保存</el-button
         >
         <el-button type="danger" plain @click="resetForm('coursePropertyForm')"
-          >重 置</el-button
+          >重置</el-button
         >
         <el-button type="danger" plain @click="back('coursePropertyForm')"
           >返 回</el-button
@@ -225,7 +222,7 @@
     </el-dialog>
     <!-- 导入弹窗 -->
     <el-dialog
-      title="导入窗口"
+      title="导入课程"
       width="520px"
       :visible.sync="impDialog"
       :modal="false"
@@ -253,15 +250,14 @@
               slot="trigger"
               size="small"
               type="primary"
-              icon="el-icon-search"
+              icon="icon icon-search-white"
             >
               选择文件
             </el-button>
-            &nbsp;
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-check"
+              icon="icon icon-save-white"
               @click="submitUpload"
             >
               确认上传
@@ -269,7 +265,7 @@
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-refresh"
+              icon="icon icon-delete-white"
               @click="removeFile"
             >
               清空文件
@@ -277,7 +273,7 @@
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-download"
+              icon="icon icon-export-white"
               @click="exportFile"
             >
               下载模板
@@ -306,10 +302,8 @@
 
 <script>
 import { QUESTION_API } from "@/constants/constants";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import { mapState } from "vuex";
 export default {
-  components: { LinkTitlesCustom },
   data() {
     return {
       formSearch: {

+ 223 - 230
src/modules/questions/views/EditOtherQuestion.vue

@@ -1,258 +1,244 @@
 <!-- 编辑填空,问答,判断题 -->
 <template>
-  <div id="editOtherApp">
-    <section v-loading="fullscreenLoading" class="content">
-      <h3 class="box-title">
-        <span v-if="!quesModel.id"
-          ><LinkTitlesCustom :current-paths="['试题管理', '试题新增']"
-        /></span>
-        <span v-if="quesModel.id"
-          ><LinkTitlesCustom :current-paths="['试题管理', '试题修改']"
-        /></span>
-      </h3>
-      <div class="box-body">
-        <el-form
-          ref="quesModel"
-          :model="quesModel"
-          :rules="rules"
-          label-position="right"
-          label-width="80px"
-        >
-          <el-row :gutter="10">
-            <el-col :xs="10" :sm="10" :md="10" :lg="10">
-              <el-form-item label="题型">
-                <el-select
-                  v-model="quesModel.questionType"
-                  :disabled="true"
-                  placeholder="请输入题型"
+  <section v-loading="fullscreenLoading" class="content">
+    <div class="box-body">
+      <el-form
+        ref="quesModel"
+        :model="quesModel"
+        :rules="rules"
+        label-position="right"
+        label-width="80px"
+      >
+        <el-row :gutter="10">
+          <el-col :xs="10" :sm="10" :md="10" :lg="10">
+            <el-form-item label="题型">
+              <el-select
+                v-model="quesModel.questionType"
+                :disabled="true"
+                placeholder="请输入题型"
+              >
+                <el-option
+                  v-for="item in questionTypes"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
                 >
-                  <el-option
-                    v-for="item in questionTypes"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <!-- created by weiwenhai -->
-          <el-form-item label="难度">
-            <el-select
-              v-model="quesModel.difficultyDegree"
-              placeholder="请输入难度"
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <!-- created by weiwenhai -->
+        <el-form-item label="难度">
+          <el-select
+            v-model="quesModel.difficultyDegree"
+            placeholder="请输入难度"
+          >
+            <el-option
+              v-for="item in difficultyDegreeList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
             >
-              <el-option
-                v-for="item in difficultyDegreeList"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="公开度">
-            <el-select v-model="quesModel.publicity" placeholder="请输入公开度">
-              <el-option
-                v-for="item in publicityList"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              >
-              </el-option>
-            </el-select>
-          </el-form-item>
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="公开度">
+          <el-select v-model="quesModel.publicity" placeholder="请输入公开度">
+            <el-option
+              v-for="item in publicityList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
 
-          <el-form-item
-            v-if="quesModel.questionType == 'TEXT_ANSWER_QUESTION'"
-            label="作答类型"
+        <el-form-item
+          v-if="quesModel.questionType == 'TEXT_ANSWER_QUESTION'"
+          label="作答类型"
+        >
+          <el-select v-model="quesModel.answerType">
+            <el-option
+              v-for="item in answerTypes"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="属性列表">
+          <el-tooltip
+            v-for="(content, index) in quesModel.quesProperties"
+            :key="index"
+            placement="top"
           >
-            <el-select v-model="quesModel.answerType">
-              <el-option
-                v-for="item in answerTypes"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
+            <div slot="content">
+              <span v-if="content.firstProperty != null"
+                >一级属性:{{ content.firstProperty.name }}</span
+              ><br />
+              <span v-if="content.secondProperty != null"
+                >二级属性:{{ content.secondProperty.name }}</span
               >
-              </el-option>
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="属性列表">
-            <el-tooltip
-              v-for="(content, index) in quesModel.quesProperties"
-              :key="index"
-              placement="top"
+            </div>
+            <el-tag
+              :key="content.id"
+              style="margin-right: 5px"
+              closable
+              effect="dark"
+              type="primary"
+              @close="handleClose(content)"
             >
-              <div slot="content">
-                <span v-if="content.firstProperty != null"
-                  >一级属性:{{ content.firstProperty.name }}</span
-                ><br />
-                <span v-if="content.secondProperty != null"
-                  >二级属性:{{ content.secondProperty.name }}</span
-                >
-              </div>
-              <el-tag
-                :key="content.id"
-                style="margin-right: 5px"
-                closable
-                effect="dark"
-                type="primary"
-                @close="handleClose(content)"
+              {{ content.coursePropertyName }}
+            </el-tag>
+          </el-tooltip>
+        </el-form-item>
+        <el-row :gutter="20">
+          <el-col :xs="6" :sm="6" :md="6" :lg="6">
+            <el-form-item label="属性名">
+              <el-select
+                v-model="coursePropertyName"
+                placeholder="属性名"
+                class="property_with"
+                @change="searchFirst"
               >
-                {{ content.coursePropertyName }}
-              </el-tag>
-            </el-tooltip>
-          </el-form-item>
-          <el-row :gutter="20">
-            <el-col :xs="6" :sm="6" :md="6" :lg="6">
-              <el-form-item label="属性名">
-                <el-select
-                  v-model="coursePropertyName"
-                  placeholder="属性名"
-                  class="property_with"
-                  @change="searchFirst"
+                <el-option
+                  v-for="item in coursePropertyList"
+                  :key="item.name"
+                  :label="item.name"
+                  :value="item.name"
                 >
-                  <el-option
-                    v-for="item in coursePropertyList"
-                    :key="item.name"
-                    :label="item.name"
-                    :value="item.name"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :xs="6" :sm="6" :md="6" :lg="6">
-              <el-form-item label="一级">
-                <el-select
-                  v-model="firstPropertyId"
-                  placeholder="一级"
-                  class="property_with"
-                  @change="searchSecond"
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="6" :sm="6" :md="6" :lg="6">
+            <el-form-item label="一级">
+              <el-select
+                v-model="firstPropertyId"
+                placeholder="一级"
+                class="property_with"
+                @change="searchSecond"
+              >
+                <el-option
+                  v-for="item in firstPropertyList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
                 >
-                  <el-option
-                    v-for="item in firstPropertyList"
-                    :key="item.id"
-                    :label="item.name"
-                    :value="item.id"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :xs="6" :sm="6" :md="6" :lg="6">
-              <el-form-item label="二级">
-                <el-select
-                  v-model="secondPropertyId"
-                  placeholder="二级"
-                  class="property_with"
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="6" :sm="6" :md="6" :lg="6">
+            <el-form-item label="二级">
+              <el-select
+                v-model="secondPropertyId"
+                placeholder="二级"
+                class="property_with"
+              >
+                <el-option
+                  v-for="item in secondPropertyList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
                 >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="3" :sm="3" :md="3" :lg="3">
+            <el-form-item>
+              <el-button
+                type="primary"
+                style="margin-left: -30px"
+                @click="insertProperty"
+                ><i class="el-icon-plus"></i> 新增属性</el-button
+              >
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <!-- end -->
+        <el-row :gutter="10">
+          <el-col :xs="30" :sm="30" :md="30" :lg="30">
+            <el-form-item label="题干" prop="quesBody">
+              <ckeditor v-model="quesModel.quesBody"></ckeditor>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row
+          v-for="quesOption in quesModel.quesOptions"
+          :key="quesOption"
+          :gutter="10"
+        >
+          <el-col :xs="30" :sm="30" :md="30" :lg="30">
+            <el-form-item :label="quesOption.number">
+              <ckeditor v-model="quesOption.quesBody"></ckeditor>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <!-- 非套题 -->
+        <div
+          v-if="
+            quesModel.questionType !== 'NESTED_ANSWER_QUESTION' &&
+            quesModel.questionType !== 'BOOL_ANSWER_QUESTION'
+          "
+          style="height: 80px"
+        >
+          <el-form-item label="答案" prop="quesAnswer">
+            <ckeditor v-model="quesModel.quesAnswer"></ckeditor>
+          </el-form-item>
+        </div>
+        <div
+          v-if="quesModel.questionType == 'BOOL_ANSWER_QUESTION'"
+          style="height: 80px"
+        >
+          <el-row>
+            <el-col>
+              <el-form-item label="答案" prop="quesAnswer">
+                <el-select v-model="quesModel.quesAnswer" placeholder="请选择">
                   <el-option
-                    v-for="item in secondPropertyList"
-                    :key="item.id"
-                    :label="item.name"
-                    :value="item.id"
+                    v-for="op in options"
+                    :key="op"
+                    :label="op"
+                    :value="op"
                   >
                   </el-option>
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :xs="3" :sm="3" :md="3" :lg="3">
-              <el-form-item>
-                <el-button
-                  type="primary"
-                  style="margin-left: -30px"
-                  @click="insertProperty"
-                  ><i class="el-icon-plus"></i> 新增属性</el-button
-                >
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <!-- end -->
-          <el-row :gutter="10">
-            <el-col :xs="30" :sm="30" :md="30" :lg="30">
-              <el-form-item label="题干" prop="quesBody">
-                <ckeditor v-model="quesModel.quesBody"></ckeditor>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row
-            v-for="quesOption in quesModel.quesOptions"
-            :key="quesOption"
-            :gutter="10"
-          >
-            <el-col :xs="30" :sm="30" :md="30" :lg="30">
-              <el-form-item :label="quesOption.number">
-                <ckeditor v-model="quesOption.quesBody"></ckeditor>
-              </el-form-item>
-            </el-col>
           </el-row>
-
-          <!-- 非套题 -->
-          <div
-            v-if="
-              quesModel.questionType !== 'NESTED_ANSWER_QUESTION' &&
-              quesModel.questionType !== 'BOOL_ANSWER_QUESTION'
-            "
-            style="height: 80px"
-          >
-            <el-form-item label="答案" prop="quesAnswer">
-              <ckeditor v-model="quesModel.quesAnswer"></ckeditor>
-            </el-form-item>
-          </div>
-          <div
-            v-if="quesModel.questionType == 'BOOL_ANSWER_QUESTION'"
-            style="height: 80px"
-          >
-            <el-row>
-              <el-col>
-                <el-form-item label="答案" prop="quesAnswer">
-                  <el-select
-                    v-model="quesModel.quesAnswer"
-                    placeholder="请选择"
-                  >
-                    <el-option
-                      v-for="op in options"
-                      :key="op"
-                      :label="op"
-                      :value="op"
-                    >
-                    </el-option>
-                  </el-select>
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </div>
-          <div class="paper-top">
-            <el-form-item>
-              <el-button type="primary" @click="saveQues('quesModel')"
-                >保存</el-button
-              >
-              <el-button
-                type="primary"
-                icon="caret-left"
-                @click="backToQuesList()"
-                >返回列表</el-button
-              >
-            </el-form-item>
-          </div>
-        </el-form>
-      </div>
-    </section>
-  </div>
+        </div>
+        <div class="paper-top">
+          <el-form-item>
+            <el-button type="primary" @click="saveQues('quesModel')"
+              >保存</el-button
+            >
+            <el-button
+              type="primary"
+              icon="caret-left"
+              @click="backToQuesList()"
+              >返回列表</el-button
+            >
+          </el-form-item>
+        </div>
+      </el-form>
+    </div>
+  </section>
 </template>
 <script>
 import { QUESTION_API } from "@/constants/constants";
 import { isEmptyStr, QUESTION_TYPES } from "../constants/constants";
 import ckeditor from "../component/ckeditor.vue";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 
 export default {
   name: "EditOtherApp",
-  components: { ckeditor, LinkTitlesCustom },
+  components: { ckeditor },
   data() {
     return {
       fullscreenLoading: false,
@@ -311,7 +297,6 @@ export default {
       },
     };
   },
-  computed: {},
   created() {
     this.paperId = this.$route.params.paperId;
     this.paperDetailId = this.$route.params.paperDetailId;
@@ -338,7 +323,15 @@ export default {
       this.quesModel.answerType = "DIVERSIFIED_TEXT";
     }
   },
-  mounted() {},
+  mounted() {
+    setTimeout(() => {
+      if (this.quesModel.id) {
+        this.$store.commit("UPDATE_CURRENT_PATHS", ["试题管理", "试题修改"]);
+      } else {
+        this.$store.commit("UPDATE_CURRENT_PATHS", ["试题管理", "试题新增"]);
+      }
+    }, 200);
+  },
   methods: {
     saveQues(formName) {
       if (!this.quesModel.difficultyDegree) {

+ 74 - 30
src/modules/questions/views/EditPaper.vue

@@ -60,7 +60,7 @@
             <el-button type="primary" size="small" plain>
               更多<i class="el-icon-more el-icon--right"></i>
             </el-button>
-            <el-dropdown-menu slot="dropdown">
+            <el-dropdown-menu slot="dropdown" class="action-dropdown">
               <el-dropdown-item>
                 <el-button type="primary" plain size="small" @click="openDialog"
                   >上传音频
@@ -989,22 +989,30 @@
       :visible.sync="dialogRadioFile"
       :before-close="closeAudioDialog"
       :modal="false"
+      width="520px"
       append-to-body
       custom-class="side-dialog"
     >
-      <form
-        id="radioForm"
-        method="post"
-        action=""
-        enctype="multipart/form-data"
-      >
-        <input
-          id="radioFile"
-          name="files"
-          type="file"
-          value="上传音频文件"
-          webkitdirectory
-        />
+      <div>
+        <div tabindex="0" class="el-upload el-upload--text">
+          <button
+            type="button"
+            class="el-button el-button--primary el-button--medium"
+            @click="selectAudioFile"
+          >
+            <i class="icon icon-search-white"></i>
+            <span>选择文件</span>
+          </button>
+          <input
+            id="radioFile"
+            class="el-upload__input"
+            name="files"
+            type="file"
+            value="上传音频文件"
+            webkitdirectory
+            @change="audioFileChange"
+          />
+        </div>
         <el-button type="warning" @click="checkFile">检查文件名</el-button>
         <el-button
           type="info"
@@ -1015,7 +1023,8 @@
           <span v-show="!uploadAudioLoading">开始上传</span>
           <span v-show="uploadAudioLoading">正在上传中...</span>
         </el-button>
-      </form>
+      </div>
+      <p v-if="audioFileName" class="tips-info">文件: {{ audioFileName }}</p>
       <div v-if="checkResult" style="margin-top: 20px">
         <span>检查结果:</span><br /><br />
         <span v-show="message == 'OK!'" style="color: #13ce66">OK!</span>
@@ -1030,22 +1039,30 @@
       :visible.sync="dialogAnswerFile"
       :before-close="closeAnswerDialog"
       :modal="false"
+      width="520px"
       append-to-body
       custom-class="side-dialog"
     >
-      <form
-        id="answerForm"
-        method="post"
-        action=""
-        enctype="multipart/form-data"
-      >
-        <input
-          id="answerFile"
-          name="answerFiles"
-          type="file"
-          value="上传答案文件"
-          accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
-        />
+      <div>
+        <div tabindex="0" class="el-upload el-upload--text">
+          <button
+            type="button"
+            class="el-button el-button--primary el-button--medium"
+            @click="selectAnswerFile"
+          >
+            <i class="icon icon-search-white"></i>
+            <span>选择文件</span>
+          </button>
+          <input
+            id="answerFile"
+            class="el-upload__input"
+            name="answerFiles"
+            type="file"
+            value="上传答案文件"
+            accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+            @change="answerFileChange"
+          />
+        </div>
         <el-button type="primary" @click="downAnswerTemplate">
           <span>下载模板</span>
         </el-button>
@@ -1058,7 +1075,8 @@
           <span v-show="!uploadAnswerLoading">开始上传</span>
           <span v-show="uploadAnswerLoading">正在上传中...</span>
         </el-button>
-      </form>
+      </div>
+      <p v-if="answerFileName" class="tips-info">文件: {{ answerFileName }}</p>
       <div style="margin-top: 20px">
         <span v-show="answerMessage != ''" style="color: #ff4949">{{
           answerMessage
@@ -1192,6 +1210,8 @@ export default {
       isUploadAnswer: true,
       message: "",
       answerMessage: "",
+      answerFileName: "",
+      audioFileName: "",
       checkResult: false,
       checkResultAnswer: false,
       fileNameList: [],
@@ -1565,6 +1585,7 @@ export default {
       if (document.getElementById("answerFile")) {
         document.getElementById("answerFile").value = "";
       }
+      this.answerFileName = "";
       this.dialogAnswerFile = true;
       this.answerFileList = [];
     },
@@ -1573,6 +1594,17 @@ export default {
       this.answerMessage = "";
       this.dialogAnswerFile = this.uploadAnswerLoading;
     },
+    selectAnswerFile() {
+      document.getElementById("answerFile").click();
+    },
+    answerFileChange() {
+      let fileList = document.getElementById("answerFile").files;
+      if (fileList.length == 0) {
+        this.answerFileName = "";
+      } else {
+        this.answerFileName = fileList[0].name;
+      }
+    },
     uploadAnswerFile() {
       this.answerMessage = "";
       var fileList = document.getElementById("answerFile").files;
@@ -2401,6 +2433,7 @@ export default {
       if (document.getElementById("radioFile")) {
         document.getElementById("radioFile").value = "";
       }
+      this.audioFileName = "";
       this.dialogRadioFile = true;
       this.fileList = [];
     },
@@ -2483,7 +2516,18 @@ export default {
           console.log(error);
         });
     },
-    //读取文件
+    // 音频文件
+    selectAudioFile() {
+      document.getElementById("radioFile").click();
+    },
+    audioFileChange() {
+      let fileList = document.getElementById("radioFile").files;
+      if (fileList.length == 0) {
+        this.audioFileName = "";
+      } else {
+        this.audioFileName = fileList[0].name;
+      }
+    },
     uploadAudioFile() {
       let param = new FormData();
       var fileList = document.getElementById("radioFile").files;

+ 1 - 1
src/modules/questions/views/EditPaperPendingTrial.vue

@@ -88,7 +88,7 @@
             <el-button type="primary" size="small" plain>
               更多 <i class="el-icon-more el-icon--right"></i>
             </el-button>
-            <el-dropdown-menu slot="dropdown">
+            <el-dropdown-menu slot="dropdown" class="action-dropdown">
               <el-dropdown-item>
                 <el-button type="primary" plain size="small" @click="openDialog"
                   >上传音频

+ 10 - 10
src/modules/questions/views/EditSelectQuestion.vue

@@ -1,14 +1,6 @@
 <template>
   <div v-loading="fullscreenLoading">
     <!-- 头信息 -->
-    <h3 class="box-title">
-      <span v-if="!quesModel.id"
-        ><LinkTitlesCustom :current-paths="['试题管理', '试题新增']"
-      /></span>
-      <span v-if="quesModel.id"
-        ><LinkTitlesCustom :current-paths="['试题管理', '试题修改']"
-      /></span>
-    </h3>
     <div class="part-box">
       <div class="part-box-header">
         <h1 class="part-box-title">
@@ -256,11 +248,10 @@
 import { QUESTION_API } from "@/constants/constants";
 import { isEmptyStr, QUESTION_TYPES } from "../constants/constants";
 import ckeditor from "../component/ckeditor.vue";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 
 export default {
   name: "EditSelectApp",
-  components: { ckeditor, LinkTitlesCustom },
+  components: { ckeditor },
   data() {
     return {
       questionTypes: QUESTION_TYPES,
@@ -360,6 +351,15 @@ export default {
       this.quesModel.answerType = "DIVERSIFIED_TEXT";
     }
   },
+  mounted() {
+    setTimeout(() => {
+      if (this.quesModel.id) {
+        this.$store.commit("UPDATE_CURRENT_PATHS", ["试题管理", "试题修改"]);
+      } else {
+        this.$store.commit("UPDATE_CURRENT_PATHS", ["试题管理", "试题新增"]);
+      }
+    }, 200);
+  },
   methods: {
     findQuestionById(questionId) {
       this.$http

+ 6 - 9
src/modules/questions/views/ExamPaperPendingTrial.vue

@@ -1,8 +1,5 @@
 <template>
   <section class="content">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['卷库管理 ', '待审列表']" />
-    </div>
     <div class="part-box">
       <h2 class="part-box-title">考卷待审</h2>
       <el-form class="part-filter-form" :inline="true" :model="formSearch">
@@ -65,8 +62,8 @@
           ></el-input>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="searchFrom"> 查询</el-button>
-          <el-button type="danger" plain @click="resetForm">重 置</el-button>
+          <el-button type="danger" @click="searchFrom">查询</el-button>
+          <el-button type="danger" plain @click="resetForm">重置</el-button>
         </el-form-item>
       </el-form>
       <div class="part-box-action">
@@ -206,7 +203,7 @@
                 <el-button type="primary" size="mini" plain>
                   审核<i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       size="mini"
@@ -233,7 +230,7 @@
                 <el-button type="primary" size="mini" plain>
                   更多 <i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       v-show="isShowDeleteBtn(scope.row)"
@@ -315,10 +312,10 @@
 import { QUESTION_API } from "@/constants/constants";
 import { LEVEL_TYPE } from "../constants/constants";
 import { mapState } from "vuex";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import AuditPaper from "./AuditPaper.vue";
+
 export default {
-  components: { LinkTitlesCustom, AuditPaper },
+  components: { AuditPaper },
   data() {
     return {
       auditPaperDialog: false,

+ 4 - 23
src/modules/questions/views/ExportTemplate.vue

@@ -208,7 +208,7 @@
         <el-button type="primary" :loading="fileForm.loading" @click="subFile"
           >确定</el-button
         >
-        <el-button @click="closeFileModel">取消</el-button>
+        <el-button type="danger" plain @click="closeFileModel">取消</el-button>
       </div>
     </el-dialog>
 
@@ -252,7 +252,9 @@
           @click="subConfig"
           >确定</el-button
         >
-        <el-button @click="closeConfigModel">取消</el-button>
+        <el-button type="danger" plain @click="closeConfigModel"
+          >取消</el-button
+        >
       </div>
     </el-dialog>
   </section>
@@ -610,24 +612,3 @@ export default {
   },
 };
 </script>
-
-<style scoped>
-.page {
-  margin-top: 10px;
-}
-.pull-length {
-  width: 300px;
-}
-.details-length {
-  width: 400px;
-}
-.pull-center {
-  margin-top: 20px;
-}
-.editForm .el-form-item {
-  margin-bottom: 12px;
-}
-.form-row {
-  margin-top: 20px;
-}
-</style>

+ 4 - 8
src/modules/questions/views/GenPaper.vue

@@ -1,8 +1,5 @@
 <template>
   <section class="content gen-paper">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['题库管理 ', '考试试卷管理']" />
-    </div>
     <div class="part-box">
       <h2 class="part-box-title">卷库列表</h2>
 
@@ -200,7 +197,7 @@
                 <el-button type="primary" size="mini" plain>
                   更多 <i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       size="mini"
@@ -355,10 +352,10 @@
           v-loading.fullscreen.lock="quesLoading"
           type="primary"
           @click="updateQuesPropertyByPaper()"
-          >保 存</el-button
+          >保存</el-button
         >
         <el-button type="danger" plain @click="resetQuesProForm"
-          >重 置</el-button
+          >重置</el-button
         >
         <el-button type="danger" plain @click="closePropertyDialog"
           >返 回</el-button
@@ -372,9 +369,8 @@
 import { QUESTION_API } from "@/constants/constants";
 import { LEVEL_TYPE, PUBLICITY_LIST } from "../constants/constants";
 import { mapState } from "vuex";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  components: { LinkTitlesCustom },
   data() {
     return {
       publicityDis: false,

+ 8 - 11
src/modules/questions/views/ImportPaper.vue

@@ -1,8 +1,5 @@
 <template>
   <section class="content">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['题库管理 ', '导入试卷管理']" />
-    </div>
     <!-- 正文信息 -->
     <div class="part-box">
       <h2 class="part-box-title">题库列表</h2>
@@ -100,7 +97,7 @@
             <el-button type="primary" plain>
               更多 <i class="el-icon-more el-icon--right"></i>
             </el-button>
-            <el-dropdown-menu slot="dropdown">
+            <el-dropdown-menu slot="dropdown" class="action-dropdown">
               <el-dropdown-item>
                 <el-button type="primary" plain @click="expQuesType"
                   >试题分布</el-button
@@ -228,7 +225,7 @@
                 <el-button type="primary" size="mini" plain>
                   更多 <i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       size="mini"
@@ -342,10 +339,10 @@
       </el-form>
       <div slot="footer">
         <el-button type="primary" @click="submitCopy('copyPaperForm')"
-          >保 存</el-button
+          >保存</el-button
         >
         <el-button type="danger" plain @click="resetForm2('copyPaperForm')"
-          >重 置</el-button
+          >重置</el-button
         >
         <el-button type="danger" plain @click="back2('copyPaperForm')"
           >返 回</el-button
@@ -388,9 +385,9 @@
           v-loading.fullscreen.lock="quesLoading"
           type="primary"
           @click="submitUpdate()"
-          >保 存</el-button
+          >保存</el-button
         >
-        <el-button type="danger" plain @click="resetForm">重 置</el-button>
+        <el-button type="danger" plain @click="resetForm">重置</el-button>
         <el-button type="danger" plain @click="closePropertyDialog"
           >返 回</el-button
         >
@@ -417,10 +414,10 @@
 import { QUESTION_API } from "@/constants/constants";
 import { LEVEL_TYPE, PUBLICITY_LIST } from "../constants/constants";
 import { mapState } from "vuex";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import AuditInfo from "./AuditInfo.vue";
+
 export default {
-  components: { LinkTitlesCustom, AuditInfo },
+  components: { AuditInfo },
   data() {
     return {
       auditInfoPaperId: null,

+ 11 - 3
src/modules/questions/views/ImportPaperInfo.vue

@@ -1,6 +1,5 @@
 <template>
   <section class="content">
-    <LinkTitlesCustom :current-paths="['word文件上传']" />
     <!-- 正文信息 -->
     <div
       v-loading.body="fileLoading"
@@ -115,9 +114,9 @@
 <script>
 import { QUESTION_API } from "@/constants/constants";
 import { mapState } from "vuex";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  components: { LinkTitlesCustom },
+  name: "ImportPaperInfo",
   data() {
     return {
       importType: "word",
@@ -176,6 +175,15 @@ export default {
       token: this.user.token,
     };
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", [
+        "题库管理",
+        "题库列表",
+        "文件上传",
+      ]);
+    }, 200);
+  },
   methods: {
     searchCourseName() {
       for (let course of this.courseList) {

+ 33 - 24
src/modules/questions/views/InsertBluePaperStructure.vue

@@ -1,20 +1,23 @@
 <template>
-  <div id="insertBlueApp">
-    <LinkTitlesCustom
-      :current-paths="['基础信息 ', '蓝图结构预设', '蓝图结构创建']"
-    />
+  <div class="insert-blue-paper-structure">
     <div class="part-box">
       <div class="part-box-header">
         <h1 class="part-box-title">蓝图结构创建</h1>
         <div>
-          <el-button type="primary" @click="saveBlueStruct"
+          <el-button
+            type="primary"
+            icon="icon icon-save-white"
+            @click="saveBlueStruct"
             >保存试卷结构</el-button
           >
-          <el-button type="primary" @click="insertDetail"
-            ><i class="el-icon-plus"></i> 添加大题</el-button
+          <el-button
+            type="primary"
+            icon="icon icon-plus-white"
+            @click="insertDetail"
+            >添加大题</el-button
           >
-          <el-button type="danger" plain @click="back"
-            ><i class="el-icon-arrow-left"></i> 返 回</el-button
+          <el-button type="danger" icon="icon icon-back" plain @click="back"
+            >返回</el-button
           >
         </div>
       </div>
@@ -84,16 +87,14 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <br />
-        <el-form-item label-width="0px">
-          <ckeditor
-            v-model="blueStruct.examRemark"
-            :display="display"
-            :width="wValue"
-            :height="hValue"
-          ></ckeditor>
-        </el-form-item>
+        <el-form-item label-width="0px"> </el-form-item>
       </el-form>
+      <ckeditor
+        v-model="blueStruct.examRemark"
+        class="area-ckeditor"
+        :height="hValue"
+        placeholder="请输入考试说明"
+      ></ckeditor>
     </div>
     <div class="part-box">
       <!-- 页面列表 -->
@@ -187,19 +188,19 @@
           v-if="dialogType == 'ADD'"
           type="primary"
           @click="saveDetail('paperDetailStructForm')"
-          >保 存</el-button
+          >保存</el-button
         >
         <el-button
           v-else
           type="primary"
           @click="saveEditDetail('paperDetailStructForm')"
-          >保 存</el-button
+          >保存</el-button
         >
         <el-button
           type="danger"
           plain
           @click="resetForm('paperDetailStructForm')"
-          >重 置</el-button
+          >重置</el-button
         >
         <el-button
           type="danger"
@@ -215,12 +216,11 @@
 import { QUESTION_TYPES } from "../constants/constants";
 import { QUESTION_API } from "@/constants/constants";
 import ckeditor from "../component/ckeditor.vue";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  name: "InsertBlueApp",
+  name: "InsertBluePaperStructure",
   components: {
     ckeditor,
-    LinkTitlesCustom,
   },
   data() {
     return {
@@ -302,6 +302,15 @@ export default {
     this.paperStructId = this.$route.params.id;
     this.searchForm();
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", [
+        "组卷结构预设 ",
+        "蓝图试卷结构",
+        this.paperStructId ? "蓝图结构编辑" : "蓝图结构创建",
+      ]);
+    }, 200);
+  },
   methods: {
     accAdd(num1, num2) {
       let sq1, sq2, m;

+ 15 - 9
src/modules/questions/views/InsertBluePaperStructureInfo.vue

@@ -1,7 +1,5 @@
 <template>
   <section class="content">
-    <LinkTitlesCustom :current-paths="['大题详情']" />
-
     <div class="part-box">
       <h2 class="part-box-title">大题详情</h2>
 
@@ -62,9 +60,14 @@
           ></el-input>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="saveForm">保存</el-button>
-          <el-button type="danger" plain @click="back"
-            ><i class="el-icon-arrow-left"></i>返回</el-button
+          <el-button
+            type="primary"
+            icon="icon icon-save-white"
+            @click="saveForm"
+            >保存</el-button
+          >
+          <el-button type="danger" icon="icon icon-back" plain @click="back"
+            >返回</el-button
           >
         </el-form-item>
       </el-form>
@@ -290,12 +293,10 @@
 <script>
 import { QUESTION_API } from "@/constants/constants";
 import { QUESTION_TYPES } from "../constants/constants";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import { mapState } from "vuex";
+
 export default {
-  components: {
-    LinkTitlesCustom,
-  },
+  name: "InsertBluePaperStructureInfo",
   data() {
     return {
       paperDetailStruct: {
@@ -368,6 +369,11 @@ export default {
     this.paperDetailStructId = this.$route.params.id;
     this.searchPaperDetail();
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", ["组卷结构预设", "大题详情"]);
+    }, 200);
+  },
   methods: {
     tableRowClassName(row) {
       if (row.disable) {

+ 19 - 20
src/modules/questions/views/InsertPaperStructure.vue

@@ -1,9 +1,5 @@
 <template>
-  <div id="insertApp">
-    <LinkTitlesCustom
-      :current-paths="['基础信息 ', '精确结构预设', '精确结构创建']"
-    />
-
+  <div class="insert-paper-structure">
     <div class="part-box">
       <div class="part-box-header">
         <h1 class="part-box-title">精确结构创建</h1>
@@ -52,7 +48,6 @@
         <el-form-item label="制定课程">
           <el-select
             v-model="paperStruct.courseNo"
-            class="search_width"
             filterable
             :remote-method="getCourses"
             remote
@@ -70,16 +65,14 @@
             </el-option>
           </el-select>
         </el-form-item>
-        <br />
-        <el-form-item label-width="0px">
-          <ckeditor
-            v-model="paperStruct.examRemark"
-            :display="display"
-            :width="wValue"
-            :height="hValue"
-          ></ckeditor>
-        </el-form-item>
+        <el-form-item label-width="0px"> </el-form-item>
       </el-form>
+      <ckeditor
+        v-model="paperStruct.examRemark"
+        class="area-ckeditor"
+        :height="hValue"
+        placeholder="请输入考试说明"
+      ></ckeditor>
     </div>
     <div class="part-box">
       <!-- 页面列表 -->
@@ -194,14 +187,12 @@
 <script>
 import { QUESTION_API } from "@/constants/constants";
 import ckeditor from "../component/ckeditor.vue";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  name: "InsertApp",
+  name: "InsertPaperStructure",
   components: {
     ckeditor,
-    LinkTitlesCustom,
   },
-
   data() {
     return {
       hValue: "100px",
@@ -278,7 +269,15 @@ export default {
     this.paperStructId = this.$route.params.id;
     this.searchForm();
   },
-
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", [
+        "组卷结构预设",
+        "精确结构预设",
+        this.paperStructId ? "精确结构编辑" : "精确结构创建",
+      ]);
+    }, 200);
+  },
   methods: {
     accAdd(num1, num2) {
       let sq1, sq2, m;

+ 8 - 6
src/modules/questions/views/InsertPaperStructureInfo.vue

@@ -1,7 +1,5 @@
 <template>
   <section class="content">
-    <LinkTitlesCustom :current-paths="['题型创建', detailName]" />
-
     <div class="part-box">
       <h2 class="part-box-title">{{ detailName }}</h2>
       <el-form
@@ -429,7 +427,7 @@
 
       <div slot="footer">
         <el-button type="primary" @click="editSubmitForm('paperUnitForm2')"
-          >保 存</el-button
+          >保存</el-button
         >
       </div>
     </el-dialog>
@@ -618,7 +616,7 @@
       </el-row>
       <div slot="footer">
         <el-button type="primary" @click="propertyDialog = false"
-          >保 存</el-button
+          >保存</el-button
         >
         <el-button type="danger" plain @click="propertyDialog = false"
           >返 回</el-button
@@ -632,10 +630,9 @@
 import { QUESTION_API } from "@/constants/constants";
 import { QUESTION_TYPES } from "../constants/constants";
 import _ from "lodash";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import { mapState } from "vuex";
+
 export default {
-  components: { LinkTitlesCustom },
   data() {
     var checkIntegerNumber = (rule, value, callback) => {
       if (!value) {
@@ -786,6 +783,11 @@ export default {
     this.courseNo = this.$route.params.courseNo;
     this.searchForm();
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", ["题型创建", this.detailName]);
+    }, 200);
+  },
   methods: {
     //查询来源大题名称
     getQuesNameList(quesType) {

+ 2 - 2
src/modules/questions/views/InsertPaperTitle.vue

@@ -122,10 +122,10 @@
       </el-form>
       <div slot="footer">
         <el-button type="primary" @click="submitPaperForm('paperForm')"
-          >保 存</el-button
+          >保存</el-button
         >
         <el-button type="danger" plain @click="resetPaperForm('paperForm')"
-          >重 置</el-button
+          >重置</el-button
         >
       </div>
     </el-dialog>

+ 1 - 1
src/modules/questions/views/OrgProperty.vue

@@ -23,7 +23,7 @@
               <el-col :span="4"
                 ><div>
                   <el-button type="primary" size="small" @click="save"
-                    >保 存</el-button
+                    >保存</el-button
                   >
                   <el-button
                     type="primary"

+ 31 - 34
src/modules/questions/views/PaperBasicComposition.vue

@@ -1,39 +1,36 @@
 <template>
-  <section class="content">
-    <div class="box-body">
-      <div class="ques-tag-main2">
-        <div>整卷属性</div>
-        <div
-          v-for="(paperTag, tagIndex) in paperData.tags"
-          :key="tagIndex"
-          class="ques-tag-container"
-        >
-          <div class="ques-tag">
-            <div class="ques-tag-title">{{ paperTag.tag }}</div>
-            <div>{{ paperTag.content }}</div>
+  <section class="paper-basic-composition">
+    <el-form>
+      <el-form-item label="整卷属性">
+        <div class="topic-set-list">
+          <div
+            v-for="(paperTag, tagIndex) in paperData.tags"
+            :key="tagIndex"
+            class="topic-set"
+          >
+            <div class="topic-set-title">{{ paperTag.tag }}</div>
+            <div class="topic-set-content">
+              {{ paperTag.content }}
+            </div>
           </div>
         </div>
-      </div>
-      <div class="ques-tag-main2">
-        <div>组成结构</div>
-        <div style="width: 100%">
-          <el-table :data="paperData.data" border>
-            <el-table-column
-              v-for="(colval, colIndex) in paperData.head"
-              :key="colIndex"
-              width="100"
-            >
-              <template slot="header">
-                <span style="margin-left: 10px">{{ colval }}</span>
-              </template>
-              <template slot-scope="scope">
-                <span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-      </div>
-    </div>
+      </el-form-item>
+      <el-form-item label="组成结构">
+        <el-table :data="paperData.data" border>
+          <el-table-column
+            v-for="(colval, colIndex) in paperData.head"
+            :key="colIndex"
+          >
+            <template slot="header">
+              <span style="margin-left: 10px">{{ colval }}</span>
+            </template>
+            <template slot-scope="scope">
+              <span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+    </el-form>
   </section>
 </template>
 <script>
@@ -41,6 +38,7 @@ import { QUESTION_API } from "@/constants/constants.js";
 import { mapState } from "vuex";
 
 export default {
+  name: "PaperBasicComposition",
   props: {
     paperId: {
       type: String,
@@ -71,4 +69,3 @@ export default {
   },
 };
 </script>
-<style scoped src="../styles/EditPaper.css"></style>

+ 50 - 63
src/modules/questions/views/PaperBlue.vue

@@ -1,70 +1,58 @@
 <template>
   <section class="content">
-    <div class="box-body">
-      <div class="ques-tag-main3">
-        <div>可选属性</div>
-        <div>
-          <el-select
-            v-model="coursePropertyId"
-            placeholder="属性名"
-            @change="onSelChange"
+    <el-form>
+      <el-form-item label="可选属性">
+        <el-select
+          v-model="coursePropertyId"
+          placeholder="属性名"
+          @change="onSelChange"
+        >
+          <el-option
+            v-for="item in coursePropertyList"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
           >
-            <el-option
-              v-for="item in coursePropertyList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            >
-            </el-option>
-          </el-select>
-        </div>
-      </div>
-      <div class="ques-tag-main2">
-        <div style="width: 100%">
-          <el-table
-            :data="paperData.data"
-            style="width: 100%"
-            border
-            :span-method="objectSpanMethod"
-          >
-            <el-table-column label="蓝图属性" align="center">
-              <el-table-column
-                v-for="(colval, colIndex) in headFirst"
-                :key="colIndex"
-                width="120"
-              >
-                <template slot="header">
-                  <span style="margin-left: 10px">{{ colval }}</span>
-                </template>
-                <template slot-scope="scope">
-                  <span style="margin-left: 10px">{{
-                    scope.row[colIndex]
-                  }}</span>
-                </template>
-              </el-table-column>
-            </el-table-column>
-            <el-table-column label="大题" align="center">
-              <el-table-column
-                v-for="(colval, colIndex) in headSecond"
-                :key="colIndex"
-                width="120"
-              >
-                <template slot="header">
-                  <span style="margin-left: 10px">{{ colval }}</span>
-                </template>
-                <template slot-scope="scope">
-                  <span style="margin-left: 10px">{{
-                    scope.row[colIndex + 2]
-                  }}</span>
-                </template>
-              </el-table-column>
-            </el-table-column>
-          </el-table>
-        </div>
-      </div>
-    </div>
+          </el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <el-table
+      :data="paperData.data"
+      style="width: 100%"
+      border
+      :span-method="objectSpanMethod"
+    >
+      <el-table-column label="蓝图属性" align="center">
+        <el-table-column
+          v-for="(colval, colIndex) in headFirst"
+          :key="colIndex"
+        >
+          <template slot="header">
+            <span style="margin-left: 10px">{{ colval }}</span>
+          </template>
+          <template slot-scope="scope">
+            <span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+      <el-table-column label="大题" align="center">
+        <el-table-column
+          v-for="(colval, colIndex) in headSecond"
+          :key="colIndex"
+        >
+          <template slot="header">
+            <span style="margin-left: 10px">{{ colval }}</span>
+          </template>
+          <template slot-scope="scope">
+            <span style="margin-left: 10px">{{ scope.row[colIndex + 2] }}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
   </section>
 </template>
+
 <script>
 import { QUESTION_API } from "@/constants/constants.js";
 import { mapState } from "vuex";
@@ -151,4 +139,3 @@ export default {
   },
 };
 </script>
-<style scoped src="../styles/EditPaper.css"></style>

+ 6 - 13
src/modules/questions/views/PaperPendingTrial.vue

@@ -1,9 +1,5 @@
 <template>
   <section class="content">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['题库管理 ', '待审列表']" />
-    </div>
-
     <div class="part-box">
       <h2 class="part-box-title">题库待审</h2>
 
@@ -68,7 +64,7 @@
         </el-form-item>
         <el-form-item>
           <el-button type="danger" @click="searchFrom">查询</el-button>
-          <el-button type="danger" plain @click="resetForm">重 置</el-button>
+          <el-button type="danger" plain @click="resetForm">重置</el-button>
         </el-form-item>
       </el-form>
       <div class="part-box-action">
@@ -203,14 +199,11 @@
                 @click="editImportPaper(scope.row)"
                 >详情</el-button
               >
-              <el-dropdown
-                v-show="isShowAuditBtn(scope.row)"
-                class="button_left"
-              >
+              <el-dropdown v-if="isShowAuditBtn(scope.row)">
                 <el-button type="primary" size="mini" plain>
                   审核<i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       size="mini"
@@ -237,7 +230,7 @@
                 <el-button type="primary" size="mini" plain>
                   更多 <i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       v-show="isShowDeleteBtn(scope.row)"
@@ -319,10 +312,10 @@
 import { QUESTION_API } from "@/constants/constants";
 import { LEVEL_TYPE } from "../constants/constants";
 import { mapState } from "vuex";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import AuditPaper from "./AuditPaper.vue";
+
 export default {
-  components: { LinkTitlesCustom, AuditPaper },
+  components: { AuditPaper },
   data() {
     return {
       auditPaperDialog: false,

+ 37 - 55
src/modules/questions/views/PaperQuestionType.vue

@@ -1,59 +1,42 @@
 <template>
   <section class="content">
-    <div class="box-body">
-      <div class="ques-tag-main3">
-        <div>统计维度</div>
-        <div>
-          <el-select v-model="type" @change="onSelChange">
-            <el-option label="题数" value="count"></el-option>
-            <el-option label="分值" value="score"></el-option>
-          </el-select>
-        </div>
-      </div>
-      <div class="ques-tag-main2">
-        <div style="width: 100%">
-          <el-table
-            :data="paperData.data"
-            style="width: 100%"
-            border
-            :span-method="objectSpanMethod"
-          >
-            <el-table-column label="题型" align="center">
-              <el-table-column
-                v-for="(colval, colIndex) in headFirst"
-                :key="colIndex"
-                width="120"
-              >
-                <template slot="header">
-                  <span style="margin-left: 10px">{{ colval }}</span>
-                </template>
-                <template slot-scope="scope">
-                  <span style="margin-left: 10px">{{
-                    scope.row[colIndex]
-                  }}</span>
-                </template>
-              </el-table-column>
-            </el-table-column>
-            <el-table-column label="大题" align="center">
-              <el-table-column
-                v-for="(colval, colIndex) in headSecond"
-                :key="colIndex"
-                width="120"
-              >
-                <template slot="header">
-                  <span style="margin-left: 10px">{{ colval }}</span>
-                </template>
-                <template slot-scope="scope">
-                  <span style="margin-left: 10px">{{
-                    scope.row[colIndex + 2]
-                  }}</span>
-                </template>
-              </el-table-column>
-            </el-table-column>
-          </el-table>
-        </div>
-      </div>
-    </div>
+    <el-form>
+      <el-form-item label="统计维度">
+        <el-select v-model="type" @change="onSelChange">
+          <el-option label="题数" value="count"></el-option>
+          <el-option label="分值" value="score"></el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="paperData.data" border :span-method="objectSpanMethod">
+      <el-table-column label="题型" align="center">
+        <el-table-column
+          v-for="(colval, colIndex) in headFirst"
+          :key="colIndex"
+        >
+          <template slot="header">
+            <span style="margin-left: 10px">{{ colval }}</span>
+          </template>
+          <template slot-scope="scope">
+            <span style="margin-left: 10px">{{ scope.row[colIndex] }}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+      <el-table-column label="大题" align="center">
+        <el-table-column
+          v-for="(colval, colIndex) in headSecond"
+          :key="colIndex"
+        >
+          <template slot="header">
+            <span style="margin-left: 10px">{{ colval }}</span>
+          </template>
+          <template slot-scope="scope">
+            <span style="margin-left: 10px">{{ scope.row[colIndex + 2] }}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+    </el-table>
   </section>
 </template>
 <script>
@@ -141,4 +124,3 @@ export default {
   },
 };
 </script>
-<style scoped src="../styles/EditPaper.css"></style>

+ 3 - 7
src/modules/questions/views/PaperStorage.vue

@@ -1,8 +1,5 @@
 <template>
   <section class="content">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['卷库管理 ', '试卷仓库管理']" />
-    </div>
     <div class="part-box">
       <h2 class="part-box-title">试卷仓库</h2>
 
@@ -65,8 +62,8 @@
           ></el-input>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="searchFrom">查询</el-button>
-          <el-button type="danger" plain @click="resetForm">重 置</el-button>
+          <el-button type="danger" @click="searchFrom">查询</el-button>
+          <el-button type="danger" plain @click="resetForm">重置</el-button>
         </el-form-item>
       </el-form>
       <div class="part-box-action">
@@ -193,9 +190,8 @@
 import { QUESTION_API } from "@/constants/constants";
 import { LEVEL_TYPE } from "../constants/constants";
 import { mapState } from "vuex";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  components: { LinkTitlesCustom },
   data() {
     return {
       publicityDis: false,

+ 2 - 5
src/modules/questions/views/PaperStructure.vue

@@ -1,8 +1,5 @@
 <template>
   <section class="content">
-    <div v-show="isClear == 1">
-      <LinkTitlesCustom :current-paths="['基础信息', '精确结构预设']" />
-    </div>
     <!-- 正文信息 -->
     <div class="part-box">
       <h2 class="part-box-title">精确结构预设</h2>
@@ -126,6 +123,7 @@
               <el-button
                 size="mini"
                 type="danger"
+                plain
                 @click="deletePaper(scope.$index, scope.row)"
                 >删除</el-button
               >
@@ -150,9 +148,8 @@
 
 <script>
 import { QUESTION_API } from "@/constants/constants";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  components: { LinkTitlesCustom },
   data() {
     return {
       courseLoading: false,

+ 29 - 14
src/modules/questions/views/PropertyInfo.vue

@@ -1,6 +1,5 @@
 <template>
   <section class="property-info">
-    <LinkTitlesCustom :current-paths="['属性结构']" />
     <!-- 正文信息 -->
     <div class="part-box">
       <h2 class="part-box-title">属性结构</h2>
@@ -42,47 +41,55 @@
 
       <div class="part-box-action">
         <div>
-          <el-button type="primary" @click="insertParent"
-            ><i class="el-icon-plus"></i> 新增一级</el-button
+          <el-button
+            type="primary"
+            icon="icon icon-plus-white"
+            @click="insertParent"
+            >新增一级</el-button
           >
           <el-button
             type="primary"
+            icon="icon icon-plus-white"
             :disabled="showSonButtton"
             @click="insertSon"
-            ><i class="el-icon-plus"></i> 新增二级</el-button
+            >新增二级</el-button
           >
           <el-button
             type="primary"
             plain
+            icon="icon icon-edit"
             :disabled="showButton"
             @click="updateProperty"
-            ><i class="el-icon-edit"></i>编辑</el-button
+            >编辑</el-button
           >
           <el-button
             type="danger"
             plain
+            icon="icon icon-delete"
             :disabled="showButton"
             @click="deleteProperty"
-            ><i class="el-icon-delete"></i> 删除</el-button
+            >删除</el-button
           >
           <el-button
             type="primary"
             plain
+            icon="icon icon-import"
             :disabled="showMoveButtton"
             @click="moveUp"
-            ><i class="el-icon-arrow-up"></i> 上移</el-button
+            >上移</el-button
           >
           <el-button
             type="primary"
             plain
+            icon="icon icon-export"
             :disabled="showMoveButtton"
             @click="moveDown"
-            ><i class="el-icon-arrow-down"></i> 下移</el-button
+            >下移</el-button
           >
         </div>
         <div>
-          <el-button type="danger" plain icon="caret-left" @click="back"
-            ><i class="el-icon-arrow-left"></i>  回</el-button
+          <el-button type="danger" plain icon="icon icon-back" @click="back"
+            >返回</el-button
           >
         </div>
       </div>
@@ -161,8 +168,8 @@
         </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submit">确 定</el-button>
-        <el-button @click="closeModel">取 消</el-button>
+        <el-button type="primary" @click="submit">确定</el-button>
+        <el-button type="danger" plain @click="closeModel">取消</el-button>
       </div>
     </el-dialog>
   </section>
@@ -170,9 +177,8 @@
 
 <script>
 import { QUESTION_API } from "@/constants/constants";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
+
 export default {
-  components: { LinkTitlesCustom },
   data() {
     return {
       courseProperty: {
@@ -245,6 +251,15 @@ export default {
     this.coursePropertyId = this.$route.params.id;
     this.searchProperty();
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", [
+        "课程管理",
+        "课程属性",
+        "属性结构",
+      ]);
+    }, 200);
+  },
   methods: {
     disAllBtn() {
       this.showButton = true;

+ 3 - 3
src/modules/questions/views/Question.vue

@@ -131,8 +131,8 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="searchFrom">查询</el-button>
-          <el-button type="danger" plain @click="resetForm">重 置</el-button>
+          <el-button type="danger" @click="searchFrom">查询</el-button>
+          <el-button type="danger" plain @click="resetForm">重置</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -299,7 +299,7 @@
       <span>{{ deleteInfo }}</span>
       <span slot="footer" class="dialog-footer">
         <el-button type="primary" @click="deleteDialogVisible = false"
-          >确 定</el-button
+          >确定</el-button
         >
       </span>
     </el-dialog>

+ 9 - 3
src/modules/questions/views/QuestionInfo.vue

@@ -2,20 +2,26 @@
   <section class="question-info">
     <el-form :model="quesModel" label-position="left" label-width="80px">
       <el-form-item label="题目">
-        <div class="paper-question-body" v-html="quesModel.quesBody"></div>
+        <div
+          class="paper-question-body padding-top-6"
+          v-html="quesModel.quesBody"
+        ></div>
       </el-form-item>
       <el-form-item
         v-for="(quesOption, optIndex) in quesModel.quesOptions"
         :key="optIndex"
       >
         <div class="paper-question-option">
-          <span>{{ optIndex | optionOrderWordFilter }}:</span>
+          <span>{{ optIndex | optionOrderWordFilter }}. </span>
           <span v-html="quesOption.optionBody"></span>
         </div>
       </el-form-item>
 
       <el-form-item label="答案">
-        <div class="paper-question-body" v-html="quesModel.quesAnswer"></div>
+        <div
+          class="paper-question-body padding-top-6"
+          v-html="quesModel.quesAnswer"
+        ></div>
       </el-form-item>
 
       <div class="line-seperator"></div>

+ 4 - 16
src/modules/questions/views/School.vue

@@ -146,8 +146,10 @@
             </el-form-item>
           </el-row>
           <el-row class="d-flex justify-content-center">
-            <el-button type="primary" @click="submitForm">保 存</el-button>
-            <el-button @click="schoolDialog = false">取 消</el-button>
+            <el-button type="primary" @click="submitForm">保存</el-button>
+            <el-button type="danger" plain @click="schoolDialog = false"
+              >取消</el-button
+            >
           </el-row>
         </el-form>
       </el-dialog>
@@ -538,17 +540,3 @@ export default {
   },
 };
 </script>
-
-<style scoped>
-.page {
-  margin-top: 10px;
-}
-
-.el-upload {
-  width: 80px;
-}
-
-.checkbox_length {
-  width: 70px;
-}
-</style>

+ 86 - 87
src/modules/questions/views/SelectQuestion.vue

@@ -1,6 +1,5 @@
 <template>
   <section class="content">
-    <LinkTitlesCustom :current-paths="['添加试题']" />
     <!-- 正文信息 -->
     <div class="box-body">
       <el-form
@@ -127,107 +126,102 @@
       </div>
     </div>
 
-    <div class="text-left">
-      <el-dialog
-        v-loading.body="dialogLoading"
-        title="试题预览"
-        :visible.sync="quesDialog"
-        @close="closeQuesDialog"
-      >
-        <el-form :model="quesModel" label-position="right" label-width="80px">
-          <el-row :gutter="10">
-            <el-col :xs="10" :sm="10" :md="10" :lg="10">
-              <el-form-item label="题型">
-                <el-select
-                  v-model="quesModel.questionType"
-                  :disabled="true"
-                  placeholder="题型"
+    <el-dialog
+      v-loading.body="dialogLoading"
+      title="试题预览"
+      :visible.sync="quesDialog"
+      @close="closeQuesDialog"
+    >
+      <el-form :model="quesModel" label-position="right" label-width="80px">
+        <el-row :gutter="10">
+          <el-col :xs="10" :sm="10" :md="10" :lg="10">
+            <el-form-item label="题型">
+              <el-select
+                v-model="quesModel.questionType"
+                :disabled="true"
+                placeholder="题型"
+              >
+                <el-option
+                  v-for="item in questionTypes"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
                 >
-                  <el-option
-                    v-for="item in questionTypes"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row :gutter="10">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="10">
+          <el-col :xs="30" :sm="30" :md="30" :lg="30">
+            <el-form-item label="题干">
+              <span v-html="quesModel.quesBody"></span>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <!--非套题-->
+        <div v-if="quesModel.questionType !== 'NESTED_ANSWER_QUESTION'">
+          <el-row
+            v-for="(quesOption, index) in quesModel.quesOptions"
+            :key="quesOption.number"
+            :gutter="10"
+          >
             <el-col :xs="30" :sm="30" :md="30" :lg="30">
-              <el-form-item label="题干">
-                <span v-html="quesModel.quesBody"></span>
+              <el-form-item :label="index | optionOrderWordFilter">
+                <span v-html="quesOption.optionBody"></span>
               </el-form-item>
             </el-col>
           </el-row>
-          <!--非套题-->
-          <div v-if="quesModel.questionType !== 'NESTED_ANSWER_QUESTION'">
-            <el-row
-              v-for="(quesOption, index) in quesModel.quesOptions"
-              :key="quesOption.number"
-              :gutter="10"
-            >
-              <el-col :xs="30" :sm="30" :md="30" :lg="30">
-                <el-form-item :label="index | optionOrderWordFilter">
-                  <span v-html="quesOption.optionBody"></span>
+        </div>
+        <!--套题-->
+        <div v-if="quesModel.questionType === 'NESTED_ANSWER_QUESTION'">
+          <el-row
+            v-for="(subQuestionModel, index) in quesModel.subQuestions"
+            :key="index"
+            :gutter="10"
+          >
+            <el-col :xs="30" :sm="30" :md="30" :lg="30">
+              <el-row>
+                <el-form-item label="题目">
+                  <span v-html="subQuestionModel.quesBody"></span>
                 </el-form-item>
-              </el-col>
-            </el-row>
-          </div>
-          <!--套题-->
-          <div v-if="quesModel.questionType === 'NESTED_ANSWER_QUESTION'">
-            <el-row
-              v-for="(subQuestionModel, index) in quesModel.subQuestions"
-              :key="index"
-              :gutter="10"
-            >
-              <el-col :xs="30" :sm="30" :md="30" :lg="30">
-                <el-row>
-                  <el-form-item label="题目">
-                    <span v-html="subQuestionModel.quesBody"></span>
-                  </el-form-item>
-                </el-row>
-                <el-row
-                  v-for="(
-                    subQuesOption, index2
-                  ) in subQuestionModel.quesOptions"
-                  :key="index2"
-                  :gutter="10"
-                >
-                  <el-col :xs="30" :sm="30" :md="30" :lg="30">
-                    <el-form-item :label="index2 | optionOrderWordFilter">
-                      <span v-html="subQuesOption.optionBody"></span>
-                    </el-form-item>
-                  </el-col>
-                </el-row>
-                <el-row>
-                  <el-form-item label="答案">
-                    <span v-html="subQuestionModel.quesAnswer"></span>
+              </el-row>
+              <el-row
+                v-for="(subQuesOption, index2) in subQuestionModel.quesOptions"
+                :key="index2"
+                :gutter="10"
+              >
+                <el-col :xs="30" :sm="30" :md="30" :lg="30">
+                  <el-form-item :label="index2 | optionOrderWordFilter">
+                    <span v-html="subQuesOption.optionBody"></span>
                   </el-form-item>
-                </el-row>
-              </el-col>
-            </el-row>
-          </div>
+                </el-col>
+              </el-row>
+              <el-row>
+                <el-form-item label="答案">
+                  <span v-html="subQuestionModel.quesAnswer"></span>
+                </el-form-item>
+              </el-row>
+            </el-col>
+          </el-row>
+        </div>
 
-          <!--非套题答案-->
-          <div v-if="quesModel.questionType !== 'NESTED_ANSWER_QUESTION'">
-            <el-form-item label="答案">
-              <span v-html="quesModel.quesAnswer"></span>
-            </el-form-item>
-          </div>
-        </el-form>
-      </el-dialog>
-    </div>
+        <!--非套题答案-->
+        <div v-if="quesModel.questionType !== 'NESTED_ANSWER_QUESTION'">
+          <el-form-item label="答案">
+            <span v-html="quesModel.quesAnswer"></span>
+          </el-form-item>
+        </div>
+      </el-form>
+    </el-dialog>
   </section>
 </template>
 <script>
 import { QUESTION_API } from "@/constants/constants";
 import { QUESTION_TYPES } from "../constants/constants";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import { mapState } from "vuex";
+
 export default {
-  components: { LinkTitlesCustom },
   data() {
     return {
       formSearch: {
@@ -280,6 +274,11 @@ export default {
     this.course = this.courseList[0].value;
     this.searchQuestionPaper();
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", ["添加试题"]);
+    }, 200);
+  },
   methods: {
     //查询列表
     searchQuestionPaper() {

+ 0 - 11
src/modules/questions/views/ViewPaper.vue

@@ -815,14 +815,3 @@ export default {
   },
 };
 </script>
-<style scoped src="../styles/EditPaper.css">
-.property_with {
-  width: 100px;
-}
-.ck-toolbar {
-  z-index: 9999;
-}
-#app {
-  background-color: white !important;
-}
-</style>

+ 11 - 12
src/modules/questions/views/data_previllege.vue

@@ -1,19 +1,15 @@
 <template>
   <div class="data-privilege">
-    <LinkTitlesCustom :current-paths="['用户管理', '权限设置']" />
-
     <div v-loading.body="loading" class="privilege-part privilege-header">
       <!-- 正文信息 -->
       <div class="privilege-header-top">
-        <div class="box-justify">
-          <h5>{{ userName }}</h5>
+        <div class="part-box-header">
+          <h1 class="part-box-title">{{ userName }}</h1>
           <div>
-            <el-button type="primary" @click="save">保存</el-button>
-            <el-button
-              type="primary"
-              plain
-              icon="el-icon-arrow-left"
-              @click="back"
+            <el-button type="primary" icon="icon icon-save-white" @click="save"
+              >保存</el-button
+            >
+            <el-button type="danger" plain icon="icon icon-back" @click="back"
               >返回</el-button
             >
           </div>
@@ -122,14 +118,12 @@
 <script>
 import { mapState } from "vuex";
 import { QUESTION_API } from "@/constants/constants.js";
-import LinkTitlesCustom from "@/components/LinkTitlesCustom.vue";
 import { object2QueryString } from "@/utils/utils";
 import DataPrevillegeAddCourseDialog from "./data_previllege_add_course";
 
 export default {
   name: "DataPrevillege",
   components: {
-    LinkTitlesCustom,
     DataPrevillegeAddCourseDialog,
   },
   data() {
@@ -183,6 +177,11 @@ export default {
       this.paginationShow = true;
     });
   },
+  mounted() {
+    setTimeout(() => {
+      this.$store.commit("UPDATE_CURRENT_PATHS", ["用户管理", "权限设置"]);
+    }, 200);
+  },
   methods: {
     async save() {
       try {

+ 2 - 2
src/modules/questions/views/data_previllege_add_course.vue

@@ -65,9 +65,9 @@
 
     <div slot="footer">
       <el-button type="primary" :loading="loading" @click="submitForm"
-        >确 定</el-button
+        >确定</el-button
       >
-      <el-button @click="closeDialog">取 消</el-button>
+      <el-button type="danger" plain @click="closeDialog">取消</el-button>
     </div>
   </el-dialog>
 </template>

+ 14 - 25
src/modules/questions/views/user.vue

@@ -220,12 +220,11 @@
               >
                 禁用
               </el-button>
-              &nbsp;
               <el-dropdown>
                 <el-button type="primary" plain size="mini">
                   更多<i class="el-icon-more el-icon--right"></i>
                 </el-button>
-                <el-dropdown-menu slot="dropdown">
+                <el-dropdown-menu slot="dropdown" class="action-dropdown">
                   <el-dropdown-item>
                     <el-button
                       v-if="showUserDataRuleSetting(scope.row)"
@@ -376,8 +375,10 @@
         </el-form-item>
       </el-form>
       <div slot="footer">
-        <el-button type="primary" @click="add">保 存</el-button>
-        <el-button @click="addingDialog = false">取 消</el-button>
+        <el-button type="primary" @click="add">保存</el-button>
+        <el-button type="danger" plain @click="addingDialog = false"
+          >取消</el-button
+        >
       </div>
     </el-dialog>
 
@@ -469,13 +470,15 @@
         </el-form-item>
       </el-form>
       <div slot="footer">
-        <el-button type="primary" @click="update">保 存</el-button>
-        <el-button @click="updateDialog = false">取 消</el-button>
+        <el-button type="primary" @click="update">保存</el-button>
+        <el-button type="danger" plain @click="updateDialog = false"
+          >取消</el-button
+        >
       </div>
     </el-dialog>
     <!-- 导入弹窗 -->
     <el-dialog
-      title="导入窗口"
+      title="导入用户"
       width="520px"
       :visible.sync="impDialog"
       :modal="false"
@@ -501,15 +504,14 @@
               slot="trigger"
               size="small"
               type="primary"
-              icon="el-icon-search"
+              icon="icon icon-search-white"
             >
               选择文件
             </el-button>
-            &nbsp;
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-check"
+              icon="icon icon-save-white"
               @click="submitUpload"
             >
               确认上传
@@ -517,7 +519,7 @@
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-refresh"
+              icon="icon icon-delete-white"
               @click="removeFile"
             >
               清空文件
@@ -525,7 +527,7 @@
             <el-button
               size="small"
               type="primary"
-              icon="el-icon-download"
+              icon="icon icon-export-white"
               @click="exportFile"
             >
               下载模板
@@ -1257,16 +1259,3 @@ export default {
   },
 };
 </script>
-
-<style scoped>
-.page {
-  margin-top: 10px;
-}
-
-.input_width_lg {
-  width: 180px;
-}
-.input_width {
-  width: 150px;
-}
-</style>