Richtext.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="keywords" content="dongke,mes,ibossmes">
  6. <meta name="description" content="制造企业生产过程执行管理系统">
  7. <meta name="author" content="xuwei">
  8. <title>东科软件</title>
  9. <link rel="shortcut icon" href="/img/logo.png" />
  10. <link rel="bookmark" href="/img/logo.png" />
  11. <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/dongke/easyui.css">
  12. <link rel="stylesheet" type="text/css" href="/plugins/easyui/themes/icon.css">
  13. <link rel="stylesheet" type="text/css" href="/plugins/xeasyui/xuwell.css">
  14. <script type="text/javascript" src="/plugins/easyui/jquery.min.js"></script>
  15. <script type="text/javascript" src="/plugins/easyui/jquery.easyui.min.js"></script>
  16. <script type="text/javascript" src="/plugins/easyui/locale/easyui-lang-zh_CN.js"></script>
  17. <script type="text/javascript" src="/plugins/xeasyui/xuwell.js"></script>
  18. <link href="/plugins/xeasyui/toolbar.min.css" rel="stylesheet" />
  19. <link href="https://unpkg.com/@wangeditor/editor@latest/dist/css/style.css" rel="stylesheet">
  20. <style>
  21. .ddd {
  22. padding-top: 10px;
  23. margin: 0 20px;
  24. font-size: 20px
  25. }
  26. .inp {
  27. width:90.5%;
  28. height: 32px;
  29. position: relative;
  30. /* 设置边框样式,以便更容易看到圆角效果 */
  31. /* border: 2px solid #ccc;*/
  32. border:0;
  33. /* 设置圆角半径 */
  34. /* border-radius: 10px; */
  35. }
  36. select {
  37. width: 80%;
  38. height: 32px;
  39. position: relative;
  40. background-color: #444;
  41. color: #fff;
  42. /* 设置边框样式,以便更容易看到圆角效果 */
  43. /* border: 2px solid #ccc;*/
  44. border: 0;
  45. /* 设置圆角半径 */
  46. /* border-radius: 10px; */
  47. }
  48. .bbb {
  49. margin: 0 20px;
  50. font-size: 20px;
  51. width: 400px;
  52. border: 0;
  53. padding: 0 10px;
  54. background-color: #666;
  55. }
  56. .top {
  57. display: flex;
  58. justify-content: space-between; /* 可选,用于在元素之间添加空间,但在这个例子中可能不是必需的 */
  59. width: 100%; /* 确保 .top 容器占据其父容器的全部宽度 */
  60. }
  61. #editor—wrapper {
  62. border: 1px solid #ccc;
  63. z-index: 100; /* 按需定义 */
  64. height: 100%;
  65. /* width: 90%;*/
  66. margin: 0 20px;
  67. }
  68. #toolbar-container {
  69. border-bottom: 1px solid #ccc;
  70. }
  71. #editor-container {
  72. height: 100%;
  73. }
  74. </style>
  75. </head>
  76. <body class="easyui-layout">
  77. <div id="toolbarLayout" data-options="border:false,region:'north',title:'',iconCls:'icon-grid'">
  78. <div style="min-height: 100vh; ">
  79. <div id="tbSearchDiv">
  80. <div class="top">
  81. <div class="ddd" style=" flex: 1;margin-right:0;">
  82. 产品名称:<input id="input_name" style=" width: 80%;" class="inp" type="text">
  83. </div>
  84. <div class="ddd" style=" flex: 1;margin-left:0;">
  85. 产品型号:
  86. <!--<select id="modelSelect">
  87. <option disabled selected value="">请选择型号</option>
  88. </select>-->
  89. <input class="easyui-combobox" id="modelSelect" name="modelSelect" data-options="required:false,prompt:'',tipPosition:'top',url:'../intelligence/Richtext.ashx?m=getproductmodel',method:'get',valueField:'ID',textField:'GOODSCODE',panelHeight:'300px',editable:'true'" style="width:490px;height:32px;">
  90. </div>
  91. </div>
  92. <div class="ddd">
  93. 参与人员:<input id="input_participants" class="inp" type="text">
  94. </div>
  95. <div class="ddd">
  96. 解决方式:<input id="input_solution" class="inp" type="text">
  97. </div>
  98. <div class="ddd">
  99. 解决效果:<input id="input_solutioneffect" class="inp" type="text">
  100. </div>
  101. <form enctype="multipart/form-data">
  102. <div id="presetFileName" class="ddd">
  103. <span id="filename"></span>
  104. <button id="is_delete" type="button" class="ddd" style="padding-top:0; " onclick="deletefile()">删除</button>
  105. <button type="button" class="ddd" style="padding-top:0; " onclick="downfile()">下载已上传文件</button>
  106. </div>
  107. <div id="isopen" class="ddd">
  108. 上传附件:
  109. <input id="ff" type="file" style="font-size: 20px; " data-options="required:true,prompt:'',tipPosition:'bottom',buttonText:'选择文件',buttonAlign:'right',accept='*/*'">
  110. </div>
  111. </form>
  112. <div style=" padding-top: 10px; display: flex; align-items: center;" class="ddd">
  113. 问题:
  114. <div id="editor—wrapper" style="flex:10">
  115. <div id="toolbar-container"><!-- 工具栏 --></div>
  116. <div id="editor-container"><!-- 编辑器 --></div>
  117. <div id="editor-text-area" class="editor-text-area"></div>
  118. </div>
  119. </div>
  120. <div class="ddd" style="text-align:center">
  121. <button id="add_button" type="button" class="ddd" style="padding-top: 0; margin:0 auto" onclick="add()">提交/修改</button>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. <script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>
  127. <script>
  128. //加载前调用
  129. $(document).ready(function () {
  130. //getproductmodel();
  131. getQueryParam();
  132. //input框modelSelect 选择内容放入对象addsb中
  133. $('#modelSelect').combobox({
  134. onSelect: function (rec) {
  135. // 将选中的值存储到对象中
  136. addsb.modelid = rec.ID;
  137. addsb.modelname = rec.GOODSCODE;
  138. console.log('选中的值已存储到对象中:', addsb);
  139. }
  140. });
  141. });
  142. //创建富文本编辑器初始对象
  143. const E = window.wangEditor
  144. //语言切换(没用上 放着吧)
  145. const LANG = location.href.indexOf('lang=en') > 0 ? 'en' : 'zh-CN'
  146. E.i18nChangeLanguage(LANG)
  147. //创建初始项
  148. const editorConfig = {
  149. //自定义配置项
  150. MENU_CONF: {},
  151. //将画布上的内容添加到对象中
  152. onChange(editor) {
  153. const html = editor.getHtml()
  154. addsb.problem = html;
  155. },
  156. }
  157. //上传图片
  158. editorConfig.MENU_CONF['uploadImage'] = {
  159. server: 'Richtext.ashx?m=0',
  160. }
  161. // 上传视频
  162. editorConfig.MENU_CONF['uploadVideo'] = {
  163. server: 'Richtext.ashx?m=0',
  164. }
  165. //画布初始化
  166. const editor = E.createEditor({
  167. selector: '#editor-container',
  168. html: '<p><br></p>',
  169. config: editorConfig,
  170. mode: 'default',
  171. })
  172. //顶栏自定义
  173. const toolbarConfig = {}
  174. //顶栏配置项
  175. const toolbar = E.createToolbar({
  176. editor,
  177. selector: '#toolbar-container',
  178. config: toolbarConfig,
  179. mode: 'default', // or 'simple'
  180. })
  181. // 响应式数据:产品型号列表
  182. let models = [];
  183. /** 加载型号到 select 元素中 */
  184. const loadModelsToSelect=()=> {
  185. const select = document.getElementById('modelSelect');
  186. // 遍历模型数组并添加选项
  187. models.forEach(model => {
  188. const option = document.createElement('option');
  189. option.value = model.ID;
  190. option.textContent = model.GOODSCODE;
  191. select.appendChild(option);
  192. });
  193. // 设置默认选中的型号
  194. if (addsb.modelid) {
  195. const selectedOption = select.querySelector(`option[value="${addsb.modelid}"]`);
  196. if (selectedOption) {
  197. selectedOption.selected = true;
  198. }
  199. }
  200. // 监听选择变化
  201. select.addEventListener('change', function () {
  202. // 更新 addsb.model
  203. addsb.modelid = this.value;
  204. addsb.modelname = models.find(ex => ex.ID == addsb.modelid).GOODSCODE;
  205. });
  206. };
  207. //提交内容
  208. const addsb = {
  209. /**id*/
  210. id: '',
  211. /**项目名称*/
  212. name: '',
  213. /**产品型号id*/
  214. modelid: '',
  215. /**产品型号*/
  216. modelname: '',
  217. /**参与人员*/
  218. participants: '',
  219. /**问题*/
  220. problem: '',
  221. /**解决方式*/
  222. solution: '',
  223. /**解决效果*/
  224. solutioneffect: '',
  225. /**附件*/
  226. annex: ''
  227. };
  228. /**监视输入框*/
  229. $('#input_name, #input_participants,#input_solution,#input_solutioneffect').on('input', function () {
  230. const key = this.id.replace('input_', '');;
  231. addsb[key] = $(this).val();
  232. });
  233. /**上传文件子服务器*/
  234. document.getElementById('ff').addEventListener('change', function (event) {
  235. // 检查是否有文件被选中
  236. if (event.target.files.length > 0) {
  237. // 调用自定义的 submitForm 方法
  238. submitForm();
  239. }
  240. });
  241. /** 添加/修改按钮 */
  242. const add = async() => {
  243. if (addsb.name == '') {
  244. alert('请填写产品名称');
  245. return;
  246. }
  247. if (addsb.modelid == '') {
  248. alert('请填写产品型号');
  249. return;
  250. }
  251. const data= await $.ajax({
  252. url: "Richtext.ashx?m=add",
  253. type: "POST",
  254. data: addsb,
  255. dataType: "json"
  256. });
  257. if (data != false) {
  258. await $.messager.alert("保存", "保存成功");
  259. await history.pushState(null, null, '?id=' + parseInt(data, 10));
  260. await getQueryParam();
  261. }
  262. else {
  263. await $.messager.alert("保存", "保存失败");
  264. }
  265. }
  266. /** 上传附件 */
  267. const submitForm = () => {
  268. /**找到id为ff的文件上传框*/
  269. var fileInput = document.getElementById('ff');
  270. /**找到上传文件*/
  271. var file = fileInput.files[0];
  272. /**创建文件对象*/
  273. var formData = new FormData();
  274. formData.append('file', file);
  275. /**创建连接*/
  276. var xhr = new XMLHttpRequest();
  277. xhr.open('POST', '/mes/pc/intelligence/Richtext.ashx?m=0', true);
  278. /**发送文件*/
  279. xhr.send(formData);
  280. /**返回值赋值*/
  281. xhr.onload = function () {
  282. if (xhr.status === 200) {
  283. try {
  284. /**将JSON字符串解析为JavaScript对象 */
  285. var responseData = JSON.parse(xhr.response);
  286. /**检查errno是否为0,以确认请求成功 */
  287. if (responseData.errno === 0) {
  288. /**设置addsb.annex为响应中的url */
  289. addsb.annex = responseData.data.url;
  290. // messager(true);
  291. $.messager.alert("上传附件", "附件上传至服务器成功");
  292. } else {
  293. console.error('请求成功但发生错误', responseData.errno);
  294. // messager(false);
  295. $.messager.alert("上传附件", "附件上传至服务器失败");
  296. }
  297. } catch (e) {
  298. console.error('解析JSON失败', e);
  299. //messager(false);
  300. $.messager.alert("上传附件", "附件上传至服务器失败");
  301. }
  302. } else {
  303. console.error('请求失败', xhr.status);
  304. // messager(false);
  305. $.messager.alert("上传附件", "附件上传至服务器失败");
  306. }
  307. }
  308. };
  309. /** 获取产品型号 */
  310. const getproductmodel = () => {
  311. $.get("Richtext.ashx?m=getproductmodel", function (data) {
  312. var json = JSON.parse(data);
  313. models = json;
  314. loadModelsToSelect();
  315. })
  316. };
  317. /** 获取当前记录 */
  318. const getlibrary = async (libraryid) => {
  319. return new Promise((resolve, reject) => {
  320. $.ajax({
  321. url: "Richtext.ashx?m=get",
  322. type: "POST",
  323. data: { id: libraryid },
  324. dataType: "json",
  325. success: function (response) {
  326. if (response && response.length > 0) {
  327. const data = response[0];
  328. addsb.id = data.id;
  329. addsb.name = data.name;
  330. addsb.modelid = data.modelid;
  331. addsb.modelname = data.modelname;
  332. addsb.participants = data.participants;
  333. addsb.problem = data.problem;
  334. addsb.solution = data.solution;
  335. addsb.solutioneffect = data.solutioneffect;
  336. addsb.annex = data.annex;
  337. // 设置输入框的初始值
  338. input_name.value = addsb.name;
  339. input_participants.value = addsb.participants;
  340. input_solution.value = addsb.solution;
  341. input_solutioneffect.value = addsb.solutioneffect;
  342. $('#modelSelect').combobox('setValue', addsb.modelid);
  343. $('#modelSelect').combobox('setText', addsb.modelname);
  344. //异步完成标识
  345. resolve();
  346. } else {
  347. reject(new Error("没有获取到有效的数据"));
  348. }
  349. },
  350. error: function (xhr, status, error) {
  351. reject(new Error("请求失败: " + error));
  352. }
  353. });
  354. });
  355. };
  356. /**获取url内的id */
  357. const getQueryParam = async () => {
  358. let libraryIdFound = false;
  359. let libraryPromise = null;
  360. let show = null;
  361. // 获取URL的查询字符串部分
  362. var search = window.location.search.substring(1);
  363. // 将查询字符串分割成键值对数组
  364. var params = search.split("&");
  365. for (var i = 0; i < params.length; i++) {
  366. var val = params[i].split("=");
  367. // 如果找到了匹配的参数名,则返回其值
  368. if (val[0] == 'id') {
  369. libraryPromise = getlibrary(val[1]);
  370. }
  371. if (val[0] == 'show') {
  372. libraryIdFound = true;
  373. show = val[1];
  374. }
  375. }
  376. if (libraryIdFound) {
  377. // 等待getlibrary完成
  378. await libraryPromise;
  379. }
  380. if (show) {
  381. console.log('show', show)
  382. // 获取输入框元素
  383. const input_participants = document.getElementById('input_participants');
  384. input_participants.disabled = true;
  385. const input_name = document.getElementById('input_name');
  386. input_name.disabled = true;
  387. const input_solution = document.getElementById('input_solution');
  388. input_solution.disabled = true;
  389. $('#modelSelect').combobox('disable');
  390. const input_solutioneffect = document.getElementById('input_solutioneffect');
  391. input_solutioneffect.disabled = true;
  392. // 获取按钮元素
  393. const deleteButton = document.getElementById('is_delete');
  394. // 设置按钮为不可点击状态
  395. deleteButton.disabled = true;
  396. const add_button = document.getElementById('add_button');
  397. add_button.disabled = true;
  398. const ff = document.getElementById('ff');
  399. ff.disabled = true;
  400. //富文本编译器不可编辑
  401. editor.disable()
  402. }
  403. opendiv();
  404. /*loadModelsToSelect(); */
  405. };
  406. /**删除按钮 */
  407. const deletefile = () => {
  408. //文件重新赋值
  409. addsb.annex = '';
  410. /**上传附件 */
  411. let isopen = document.getElementById('isopen');
  412. //展示
  413. isopen.style.display = 'block';
  414. /**显示附件 */
  415. let presetFileName = document.getElementById('presetFileName');
  416. // 隐藏文件输入字段
  417. presetFileName.style.display = 'none';
  418. //调用删除附件(只是删除数据库,物理路径并未删除)
  419. $.ajax({
  420. url: "Richtext.ashx?m=deletefile",
  421. type: "POST",
  422. data: { id: addsb.id },
  423. })
  424. };
  425. /**下载附件 */
  426. const downfile = () => {
  427. var a = document.createElement("a");
  428. a.href = addsb.annex;
  429. a.download = addsb.annex.substr(addsb.annex.lastIndexOf('/') + 1);
  430. document.body.appendChild(a);
  431. a.click();
  432. document.body.removeChild(a);
  433. };
  434. /**判断是否开启div*/
  435. const opendiv = () => {
  436. /**上传附件 */
  437. let isopen = document.getElementById('isopen');
  438. /**显示附件 */
  439. let presetFileName = document.getElementById('presetFileName');
  440. //判断上传文档是否开启
  441. if (addsb.annex) {
  442. // 隐藏
  443. isopen.style.display = 'none';
  444. let filename = document.getElementById('filename');
  445. filename.innerHTML = '已上传文件: ' + addsb.annex.substr(addsb.annex.lastIndexOf('/') + 1);
  446. presetFileName.style.display = 'block';
  447. } else {
  448. presetFileName.style.display = 'none';
  449. isopen.style.display = 'block';
  450. }
  451. // 假设您已经有一个全局的编辑器实例变量 `editor`
  452. if (editor && typeof editor.setHtml === 'function') {
  453. // 设置编辑器的内容为从服务器返回的问题数据
  454. editor.setHtml(addsb.problem);
  455. }
  456. }
  457. </script>
  458. </body>
  459. </html >