Richtext.html 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  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. </div>
  90. </div>
  91. <div class="ddd">
  92. 参与人员:<input id="input_participants" class="inp" type="text">
  93. </div>
  94. <div class="ddd">
  95. 解决方式:<input id="input_solution" class="inp" type="text">
  96. </div>
  97. <div class="ddd">
  98. 解决效果:<input id="input_solutioneffect" class="inp" type="text">
  99. </div>
  100. <form enctype="multipart/form-data">
  101. <div id="presetFileName" class="ddd">
  102. <span id="filename"></span>
  103. <button type="button" class="ddd" style="padding-top:0; " onclick="deletefile()">删除</button>
  104. <button type="button" class="ddd" style="padding-top:0; " onclick="downfile()">下载已上传文件</button>
  105. </div>
  106. <div id="isopen" class="ddd">
  107. 上传附件:
  108. <input id="ff" type="file" style="font-size: 20px; " data-options="required:true,prompt:'',tipPosition:'bottom',buttonText:'选择文件',buttonAlign:'right',accept='*/*'">
  109. </div>
  110. </form>
  111. <div style=" padding-top: 10px; display: flex; align-items: center;" class="ddd">
  112. 问题:
  113. <div id="editor—wrapper" style="flex:10">
  114. <div id="toolbar-container"><!-- 工具栏 --></div>
  115. <div id="editor-container"><!-- 编辑器 --></div>
  116. <div id="editor-text-area" class="editor-text-area"></div>
  117. </div>
  118. </div>
  119. <div class="ddd" style="text-align:center">
  120. <button type="button" class="ddd" style="padding-top: 0; margin:0 auto" onclick="add()">提交/修改</button>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. <script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>
  126. <script>
  127. //加载前调用
  128. $(document).ready(function () {
  129. getproductmodel();
  130. getQueryParam();
  131. });
  132. //创建富文本编辑器初始对象
  133. const E = window.wangEditor
  134. //语言切换(没用上 放着吧)
  135. const LANG = location.href.indexOf('lang=en') > 0 ? 'en' : 'zh-CN'
  136. E.i18nChangeLanguage(LANG)
  137. //创建初始项
  138. const editorConfig = {
  139. //自定义配置项
  140. MENU_CONF: {},
  141. //将画布上的内容添加到对象中
  142. onChange(editor) {
  143. const html = editor.getHtml()
  144. addsb.problem = html;
  145. },
  146. }
  147. //上传图片
  148. editorConfig.MENU_CONF['uploadImage'] = {
  149. server: 'Richtext.ashx?m=0',
  150. }
  151. // 上传视频
  152. editorConfig.MENU_CONF['uploadVideo'] = {
  153. server: 'Richtext.ashx?m=0',
  154. }
  155. //画布初始化
  156. const editor = E.createEditor({
  157. selector: '#editor-container',
  158. html: '<p><br></p>',
  159. config: editorConfig,
  160. mode: 'default',
  161. })
  162. //顶栏自定义
  163. const toolbarConfig = {}
  164. //顶栏配置项
  165. const toolbar = E.createToolbar({
  166. editor,
  167. selector: '#toolbar-container',
  168. config: toolbarConfig,
  169. mode: 'default', // or 'simple'
  170. })
  171. // 响应式数据:产品型号列表
  172. let models = [];
  173. /** 加载型号到 select 元素中 */
  174. const loadModelsToSelect=()=> {
  175. const select = document.getElementById('modelSelect');
  176. // 遍历模型数组并添加选项
  177. models.forEach(model => {
  178. const option = document.createElement('option');
  179. option.value = model.ID;
  180. option.textContent = model.GOODSCODE;
  181. select.appendChild(option);
  182. });
  183. // 设置默认选中的型号
  184. if (addsb.modelid) {
  185. const selectedOption = select.querySelector(`option[value="${addsb.modelid}"]`);
  186. if (selectedOption) {
  187. selectedOption.selected = true;
  188. }
  189. }
  190. // 监听选择变化
  191. select.addEventListener('change', function () {
  192. // 更新 addsb.model
  193. addsb.modelid = this.value;
  194. addsb.modelname = models.find(ex => ex.ID == addsb.modelid).GOODSCODE;
  195. });
  196. };
  197. //提交内容
  198. const addsb = {
  199. /**id*/
  200. id: '',
  201. /**项目名称*/
  202. name: '',
  203. /**产品型号id*/
  204. modelid: '',
  205. /**产品型号*/
  206. modelname: '',
  207. /**参与人员*/
  208. participants: '',
  209. /**问题*/
  210. problem: '',
  211. /**解决方式*/
  212. solution: '',
  213. /**解决效果*/
  214. solutioneffect: '',
  215. /**附件*/
  216. annex: ''
  217. };
  218. /**监视输入框*/
  219. $('#input_name, #input_participants,#input_solution,#input_solutioneffect').on('input', function () {
  220. const key = this.id.replace('input_', '');;
  221. addsb[key] = $(this).val();
  222. });
  223. /**上传文件子服务器*/
  224. document.getElementById('ff').addEventListener('change', function (event) {
  225. // 检查是否有文件被选中
  226. if (event.target.files.length > 0) {
  227. // 调用自定义的 submitForm 方法
  228. submitForm();
  229. }
  230. });
  231. /** 添加/修改按钮 */
  232. const add = async() => {
  233. if (addsb.name == '') {
  234. alert('请填写产品名称');
  235. return;
  236. }
  237. if (addsb.model == '') {
  238. alert('请填写产品型号');
  239. return;
  240. }
  241. const data= await $.ajax({
  242. url: "Richtext.ashx?m=add",
  243. type: "POST",
  244. data: addsb,
  245. dataType: "json"
  246. });
  247. if (data != false) {
  248. await $.messager.alert("保存", "保存成功");
  249. await history.pushState(null, null, '?id=' + parseInt(data, 10));
  250. await getQueryParam();
  251. }
  252. else {
  253. await $.messager.alert("保存", "保存失败");
  254. }
  255. }
  256. /** 上传附件 */
  257. const submitForm = () => {
  258. /**找到id为ff的文件上传框*/
  259. var fileInput = document.getElementById('ff');
  260. /**找到上传文件*/
  261. var file = fileInput.files[0];
  262. /**创建文件对象*/
  263. var formData = new FormData();
  264. formData.append('file', file);
  265. /**创建连接*/
  266. var xhr = new XMLHttpRequest();
  267. xhr.open('POST', '/mes/pc/intelligence/Richtext.ashx?m=0', true);
  268. /**发送文件*/
  269. xhr.send(formData);
  270. /**返回值赋值*/
  271. xhr.onload = function () {
  272. if (xhr.status === 200) {
  273. try {
  274. /**将JSON字符串解析为JavaScript对象 */
  275. var responseData = JSON.parse(xhr.response);
  276. /**检查errno是否为0,以确认请求成功 */
  277. if (responseData.errno === 0) {
  278. /**设置addsb.annex为响应中的url */
  279. addsb.annex = responseData.data.url;
  280. // messager(true);
  281. $.messager.alert("上传附件", "附件上传至服务器成功");
  282. } else {
  283. console.error('请求成功但发生错误', responseData.errno);
  284. // messager(false);
  285. $.messager.alert("上传附件", "附件上传至服务器失败");
  286. }
  287. } catch (e) {
  288. console.error('解析JSON失败', e);
  289. //messager(false);
  290. $.messager.alert("上传附件", "附件上传至服务器失败");
  291. }
  292. } else {
  293. console.error('请求失败', xhr.status);
  294. // messager(false);
  295. $.messager.alert("上传附件", "附件上传至服务器失败");
  296. }
  297. }
  298. };
  299. /** 获取产品型号 */
  300. const getproductmodel = () => {
  301. $.get("Richtext.ashx?m=getproductmodel", function (data) {
  302. var json = JSON.parse(data);
  303. models = json;
  304. loadModelsToSelect();
  305. })
  306. };
  307. /** 获取当前记录 */
  308. const getlibrary = async (libraryid) => {
  309. return new Promise((resolve, reject) => {
  310. $.ajax({
  311. url: "Richtext.ashx?m=get",
  312. type: "POST",
  313. data: { id: libraryid },
  314. dataType: "json",
  315. success: function (response) {
  316. if (response && response.length > 0) {
  317. const data = response[0];
  318. addsb.id = data.id;
  319. addsb.name = data.name;
  320. addsb.modelid = data.modelid;
  321. addsb.modelname = data.modelname;
  322. addsb.participants = data.participants;
  323. addsb.problem = data.problem;
  324. addsb.solution = data.solution;
  325. addsb.solutioneffect = data.solutioneffect;
  326. addsb.annex = data.annex;
  327. // 设置输入框的初始值
  328. input_name.value = addsb.name;
  329. input_participants.value = addsb.participants;
  330. input_solution.value = addsb.solution;
  331. input_solutioneffect.value = addsb.solutioneffect;
  332. //异步完成标识
  333. resolve();
  334. } else {
  335. reject(new Error("没有获取到有效的数据"));
  336. }
  337. },
  338. error: function (xhr, status, error) {
  339. reject(new Error("请求失败: " + error));
  340. }
  341. });
  342. });
  343. };
  344. /**获取url内的id */
  345. const getQueryParam = async () => {
  346. let libraryIdFound = false;
  347. let libraryPromise = null;
  348. // 获取URL的查询字符串部分
  349. var search = window.location.search.substring(1);
  350. // 将查询字符串分割成键值对数组
  351. var params = search.split("&");
  352. for (var i = 0; i < params.length; i++) {
  353. var val = params[i].split("=");
  354. // 如果找到了匹配的参数名,则返回其值
  355. if (val[0] == 'id') {
  356. libraryIdFound = true;
  357. libraryPromise = getlibrary(val[1]);
  358. break;
  359. }
  360. }
  361. if (libraryIdFound) {
  362. // 等待getlibrary完成
  363. await libraryPromise;
  364. }
  365. opendiv();
  366. loadModelsToSelect();
  367. };
  368. /**删除按钮 */
  369. const deletefile = () => {
  370. //文件重新赋值
  371. addsb.annex = '';
  372. /**上传附件 */
  373. let isopen = document.getElementById('isopen');
  374. //展示
  375. isopen.style.display = 'block';
  376. /**显示附件 */
  377. let presetFileName = document.getElementById('presetFileName');
  378. // 隐藏文件输入字段
  379. presetFileName.style.display = 'none';
  380. //调用删除附件(只是删除数据库,物理路径并未删除)
  381. $.ajax({
  382. url: "Richtext.ashx?m=deletefile",
  383. type: "POST",
  384. data: { id: addsb.id },
  385. })
  386. };
  387. /**下载附件 */
  388. const downfile = () => {
  389. var a = document.createElement("a");
  390. a.href = addsb.annex;
  391. a.download = addsb.annex.substr(addsb.annex.lastIndexOf('/') + 1);
  392. document.body.appendChild(a);
  393. a.click();
  394. document.body.removeChild(a);
  395. };
  396. /**判断是否开启div*/
  397. const opendiv = () => {
  398. /**上传附件 */
  399. let isopen = document.getElementById('isopen');
  400. /**显示附件 */
  401. let presetFileName = document.getElementById('presetFileName');
  402. //判断上传文档是否开启
  403. if (addsb.annex) {
  404. // 隐藏
  405. isopen.style.display = 'none';
  406. let filename = document.getElementById('filename');
  407. filename.innerHTML = '已上传文件: ' + addsb.annex.substr(addsb.annex.lastIndexOf('/') + 1);
  408. presetFileName.style.display = 'block';
  409. } else {
  410. presetFileName.style.display = 'none';
  411. isopen.style.display = 'block';
  412. }
  413. // 假设您已经有一个全局的编辑器实例变量 `editor`
  414. if (editor && typeof editor.setHtml === 'function') {
  415. // 设置编辑器的内容为从服务器返回的问题数据
  416. editor.setHtml(addsb.problem);
  417. }
  418. }
  419. </script>
  420. </body>
  421. </html >