Browse Source

Merge branch 'skzx' of cms/cms-admin-ui into master

asd123a20 1 month ago
parent
commit
a6adb6ed8c

+ 1 - 1
.env.development

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 平信办管理系统
+VUE_APP_TITLE = 社会科学战线管理系统
 
 # 开发环境配置
 ENV = 'development'

+ 1 - 1
.env.embed

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 平信办管理系统
+VUE_APP_TITLE = 社会科学战线管理系统
 
 # 生产环境配置
 ENV = 'production'

+ 1 - 1
.env.production

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 平信办管理系统
+VUE_APP_TITLE = 社会科学战线管理系统
 
 # 生产环境配置
 ENV = 'production'

+ 1 - 1
.env.staging

@@ -1,5 +1,5 @@
 # 页面标题
-VUE_APP_TITLE = 平信办管理系统
+VUE_APP_TITLE = 社会科学战线管理系统
 
 NODE_ENV = production
 

+ 12 - 0
README.md

@@ -12,7 +12,19 @@
 
 ##### 详细环境配置,请参考若依官方文档
 
+### 配置关系
+1、term.vue  负责配置栏目相关的,根据路由传入参数匹配termconfig文件夹下的catalog.js、journal.js、menu.js、tag.js、wxAppMenu.js配置文件
+路由参数为:{ "classify": "term", "type": "catalog" }
 
+2、post.vue 负责配置文章内容相关的,根据路由传入参数匹配postconfig文件夹下的article.js、dictionary.js、page.js、tag.js、配置文件
+设置了默认查询的类型catalog,查询栏目为catalog的文章内容,如需改变查询的类型,需要配置taxonomy参数, taxonomy为可选参数
+路由参数为:{ "classify": "page", "type": "article", "taxonomy": "journal" }
+
+3、link.vue 负责配置外链相关的,根据路由传入参数匹配linkconfig文件夹下的appid.js、external.js、rote.js、配置文件
+设置了默认查询的类型wxAppMenu,查询栏目为wxAppMenu的内容,如需改变查询的类型,需要配置taxonomy参数, taxonomy为可选参数
+路由参数为:{ "classify": "page", "type": "article" }
+
+### 目录结构
 ```
 equal-credit-ui
 ├─ .editorconfig

+ 2 - 2
package.json

@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.8.3",
-  "description": "平信办管理系统",
+  "description": "社会科学战线管理系统",
   "author": "若依",
   "license": "MIT",
   "scripts": {
@@ -90,4 +90,4 @@
     "> 1%",
     "last 2 versions"
   ]
-}
+}

+ 46 - 0
src/api/journal/index.js

@@ -0,0 +1,46 @@
+
+import request from '@/utils/request'
+
+// 新增
+export function journalAdd(data, type) {
+  return request({
+    url: `/journal/${type}`,
+    method: 'post',
+    data
+  })
+}
+
+// 删除
+export function journalDel(type, id) {
+  return request({
+      url: `/journal/${type}/${id}`,
+      method: 'delete'
+  })
+}
+
+// 修改
+export function journalUpdate(data, type) {
+  return request({
+    url: `/journal/${type}`,
+    method: 'put',
+    data: data
+  })
+}
+
+// 查询List
+export function journalQuery(query, type, alias) {
+  return request({
+    url: `/journal/${type}${alias ? '/' + alias : ''}/list`,
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询详情
+export function journalFetch(suffix, type) {
+  return request({
+    url: `/journal/${type}/${suffix}`,
+    method: 'get'
+  })
+}
+

+ 1 - 1
src/components/DynamicForm/index.vue

@@ -21,7 +21,7 @@
         <!-- 图片上传 -->
         <ImageUpload v-if="item.formater == 'imageUpload'" :fileUrl="item.fileUrl || ''"  @input="fileUpload(item.name, $event)" :disabled="item.disabled || readOnly" :value="formdata[item.name]" :limit="item.limit || 1" :fileSize="item.fileSize || 5" :isShowTip="item.isShowTip || true"></ImageUpload>
         <!-- 文件上传 -->
-        <FileUpload v-if="item.formater == 'fileUpload'" :type="item.type" :fileUrl="item.fileUrl || ''" @uploadFileInput="fileUpload(item.name, $event)" @input="fileUpload(item.name, $event)" :disabled="item.disabled || readOnly" :value="formdata[item.name]" :limit="item.limit" :fileSize="item.fileSize || 5" :isShowTip="item.isShowTip || true"></FileUpload>
+        <FileUpload v-if="item.formater == 'fileUpload'" :fileType="item.fileType" :type="item.type" :fileUrl="item.fileUrl || ''" @uploadFileInput="fileUpload(item.name, $event)" @input="fileUpload(item.name, $event)" :disabled="item.disabled || readOnly" :value="formdata[item.name]" :limit="item.limit" :fileSize="item.fileSize || 5" :isShowTip="item.isShowTip || true"></FileUpload>
         <!-- 开关 -->
         <el-switch  @change="$emit('switchtChange', { item, formdata })" v-if="item.formater == 'switch'" :disabled="item.disabled || readOnly" v-model="formdata[item.name]" :active-text="item.activeText" :inactive-text="item.inactiveText" :active-color="item.activeColor" :inactive-color="item.inactiveColor" :active-value="item.activeValue || true" :inactive-value="item.inactiveValue || false"></el-switch>
         <!-- 资源选择组件 -->

+ 9 - 4
src/layout/components/Sidebar/Logo.vue

@@ -1,13 +1,18 @@
 <template>
-  <div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
+  <div class="sidebar-logo-container" :class="{ 'collapse': collapse }"
+    :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }">
     <transition name="sidebarLogoFade">
       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 v-else class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <h1 v-else class="sidebar-title"
+          :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{
+          title }} </h1>
       </router-link>
       <router-link v-else key="expand" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="logo" class="sidebar-logo" />
-        <h1 class="sidebar-title" :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
+        <h1 class="sidebar-title"
+          :style="{ color: sideTheme === 'theme-dark' ? variables.logoTitleColor : variables.logoLightTitleColor }">{{
+          title }} </h1>
       </router-link>
     </transition>
   </div>
@@ -35,7 +40,7 @@ export default {
   },
   data() {
     return {
-      title: '平信办管理系统',
+      title: '社会科学战线管理系统',
       logo: logoImg
     }
   }

+ 1 - 1
src/views/cms/link.vue

@@ -67,7 +67,7 @@
       },
       async getCatalog() {
         this.mydata.loading = true;
-        const res = await cmsQuery({ paging: false }, 'wxAppMenu');
+        const res = await cmsQuery({ paging: false }, this.$route.query.taxonomy ?? 'wxAppMenu');
         if (res.code == 200) {
           this.$set(this.mydata, 'treeData', this.handleTree(res.rows, 'termId'))
           if (this.mydata.treeData[0]) {

+ 5 - 5
src/views/cms/post.vue

@@ -99,7 +99,7 @@ export default {
     },
     // 查询文章
     async getarticle(e) {
-      const res = await cmsQuery({ ...e, pageNum: e?.pageNum ?? 1, pageSize: e?.pageSize ?? 10 }, 'article', this.$refs.dynamicForm.formdata['meta.catalog']);
+      const res = await cmsQuery({ pageNum: 1, pageSize: 10, ...e }, 'article', this.$refs.dynamicForm.formdata['meta.catalog']);
       console.log(res, 'res');
       if (res.code == 200) {
         this.$set(this.mydata, 'articleList', res.rows)
@@ -108,15 +108,15 @@ export default {
     },
     // 所有栏目查询
     async getCatalogs() {
-      const res = await cmsQuery({ paging: false }, 'catalog');
+      const res = await cmsQuery({ paging: false }, this.$route.query.taxonomy ?? 'catalog');
       if (res.code == 200) this.mydata.catalog = res.rows;
     },
     // 查询分类栏目
     async getCatalog() {
       this.mydata.loading = true;
-      const res = await cmsQuery({ paging: false, type: this.mydata.type }, 'catalog');
+      const res = await cmsQuery({ paging: false, type: this.mydata.type }, this.$route.query.taxonomy ?? 'catalog');
       if (res.code == 200) this.mydata.catalog = res.rows;
-      if (res.code == 200) {
+      if (res.code == 200 && res.rows.length > 0) {
         this.$set(this.mydata, 'treeData', this.handleTree(res.rows, 'termId'))
         if (this.mydata.treeData[0]) this.mydata.alias = this.mydata.treeData[0].alias;
         this.nodeClick(this.mydata.treeData[0]);
@@ -139,7 +139,7 @@ export default {
       this.mydata.formData = {};
       this.mydata.formData.parentId = e[`${this.mydata.classify}Id`];
       const dict = this.dict.type.term_type.find(j => j.value == this.mydata.type);
-      this.mydata.dialogInfo.title = `添加${dict.label}`;
+      this.mydata.dialogInfo.title = `添加${dict?.label}`;
       this.mydata.dialogInfo.dialogVisible = true;
     },
     // 列表修改

+ 17 - 0
src/views/cms/postconfig/dictionary.js

@@ -0,0 +1,17 @@
+export default {
+    listFileds: [
+      { label: "标题", name: "title", filter: true, placeholder: "输入摘要" },
+      { label: "显示/隐藏", name: "visible", formater: 'dict:cms_show_hide' },
+    ],
+    formFiled: [
+      { label: "标题", name: "title" },
+      { label: "发布时间", name: "publish_time", formater: 'date', dateType: 'datetime' },
+      { label: "显示/隐藏", name: "visible", formater: 'switch', activeValue: '0', inactiveValue: '1' },
+      { label: "附件上传", name: "urls", formater: "fileUpload" },
+      { label: "内容", name: "content", formater: 'editor' },
+    ],
+    operation: [
+      { name: 'edit', label: '修改', icon: 'el-icon-edit' },
+      { name: 'delete', label: '删除', icon: 'el-icon-delete' }
+    ]
+  };

+ 1 - 1
src/views/cms/term.vue

@@ -114,7 +114,7 @@ export default {
       if (this.mydata.type == 'catalog') this.setType();
       this.mydata.formData.parentId = e[`${this.mydata.classify}Id`];
       const dict = this.dict.type.term_type.find(j => j.value == this.mydata.type);
-      this.mydata.dialogInfo.title = `添加${dict.label}`;
+      this.mydata.dialogInfo.title = `添加${dict?.label}`;
       this.mydata.dialogInfo.dialogVisible = true;
     },
     // 列表修改

+ 1 - 0
src/views/cms/termconfig/catalog.js

@@ -10,6 +10,7 @@ export default {
     { label: "别名", name: "alias", placeholder: "输入别名" },
     { label: "类型", name: "type", placeholder: "选择类型", formater: "dict:cms_term" },
     { label: "排序", name: "number", formater: "number" },
+    { label: "显示/隐藏", name: "visible", formater: 'switch', activeValue: '0', inactiveValue: '1' },
     { label: "描述", name: "description", placeholder: "输入描述", formater: "textarea" },
   ],
   operation: [

+ 32 - 0
src/views/cms/termconfig/journal.js

@@ -0,0 +1,32 @@
+export default {
+    listFileds: [
+      { label: "名称", name: "name", filter: true, placeholder: "输入名字" },
+      { label: "图标", name: "image", formater: "image" },
+      { label: "别名", name: "alias", filter: true, placeholder: "输入别名" },
+      { label: "类型", name: "type", placeholder: "选择类型", formater: "dict:journal_type" },
+      { label: "排序", name: "number" }
+    ],
+    formFiled: [
+      { label: "图标", name: "image", formater: "selectFile" },
+      { label: "名称", name: "name", placeholder: "输入名字" },
+      { label: "别名", name: "alias", placeholder: "输入别名" },
+      { label: "类型", name: "type", placeholder: "选择类型", formater: 'dict:journal_type' },
+      { label: "排序", name: "number", formater: "number" },
+      { label: "显示/隐藏", name: "visible", formater: 'switch', activeValue: '0', inactiveValue: '1' },
+      { label: "描述", name: "description", placeholder: "输入描述", formater: "textarea" },
+    ],
+    operation: [
+      { name: 'itemadd', label: '新增', icon: 'el-icon-plus' },
+      { name: 'edit', label: '修改', icon: 'el-icon-edit' },
+      { name: 'delete', label: '删除', icon: 'el-icon-delete' }
+    ],
+    options: {
+      'tree-props': {
+        hasChildren: 'hasChildren', children: 'children'
+      },
+      'default-expand-all': false,
+      'row-key': "termId",
+      treeId: 'termId'
+    },
+    pagination: false,
+  };

+ 1 - 0
src/views/cms/termconfig/menu.js

@@ -12,6 +12,7 @@ export default {
     { label: "别名", name: "alias", placeholder: "输入别名" },
     { label: "类型", name: "type", placeholder: "选择类型", formater: "dict:cms_term" },
     { label: "排序", name: "number", formater: "number" },
+    { label: "显示/隐藏", name: "visible", formater: 'switch', activeValue: '0', inactiveValue: '1' },
     { label: "描述", name: "description", placeholder: "输入描述", formater: "textarea" },
   ],
   operation: [

+ 1 - 0
src/views/cms/termconfig/tag.js

@@ -10,6 +10,7 @@ export default {
     { label: "别名", name: "alias", placeholder: "输入别名" },
     { label: "类型", name: "type", placeholder: "选择类型", formater: "dict:cms_term" },
     { label: "排序", name: "number", formater: "number" },
+    { label: "显示/隐藏", name: "visible", formater: 'switch', activeValue: '0', inactiveValue: '1' },
     { label: "描述", name: "description", placeholder: "输入描述", formater: "textarea" },
   ],
   operation: [

+ 1 - 0
src/views/cms/termconfig/wxAppMenu.js

@@ -16,6 +16,7 @@ export default {
     { label: "是否登录", name: "meta.isuser", formater: 'switch', activeValue: '0', inactiveValue: '1' },
     { label: "webview", name: "meta.view", formater: 'switch', activeValue: 'webview', inactiveValue: 'details' },
     { label: "排序", name: "number", formater: "number" },
+    { label: "显示/隐藏", name: "visible", formater: 'switch', activeValue: '0', inactiveValue: '1' },
     { label: "描述", name: "description", placeholder: "输入描述", formater: "textarea" },
   ],
   operation: [

+ 20 - 31
src/views/login.vue

@@ -1,51 +1,31 @@
 <template>
   <div class="login">
     <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
-      <h3 class="title">平信办后台管理系统</h3>
+      <h3 class="title">社会科学战线后台管理系统</h3>
       <el-form-item prop="username">
-        <el-input
-          v-model="loginForm.username"
-          type="text"
-          auto-complete="off"
-          placeholder="账号"
-        >
+        <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
         </el-input>
       </el-form-item>
       <el-form-item prop="password">
-        <el-input
-          v-model="loginForm.password"
-          type="password"
-          auto-complete="off"
-          placeholder="密码"
-          @keyup.enter.native="handleLogin"
-        >
+        <el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
+          @keyup.enter.native="handleLogin">
           <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
         </el-input>
       </el-form-item>
       <el-form-item prop="code" v-if="captchaEnabled">
-        <el-input
-          v-model="loginForm.code"
-          auto-complete="off"
-          placeholder="验证码"
-          style="width: 63%"
-          @keyup.enter.native="handleLogin"
-        >
+        <el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
+          @keyup.enter.native="handleLogin">
           <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
         </el-input>
         <div class="login-code">
-          <img :src="codeUrl" @click="getCode" class="login-code-img"/>
+          <img :src="codeUrl" @click="getCode" class="login-code-img" />
         </div>
       </el-form-item>
       <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">记住密码</el-checkbox>
       <el-form-item style="width:100%;">
-        <el-button
-          :loading="loading"
-          size="medium"
-          type="primary"
-          style="width:100%;"
-          @click.native.prevent="handleLogin"
-        >
+        <el-button :loading="loading" size="medium" type="primary" style="width:100%;"
+          @click.native.prevent="handleLogin">
           <span v-if="!loading">登 录</span>
           <span v-else>登 录 中...</span>
         </el-button>
@@ -97,7 +77,7 @@ export default {
   },
   watch: {
     $route: {
-      handler: function(route) {
+      handler: function (route) {
         this.redirect = route.query && route.query.redirect;
       },
       immediate: true
@@ -141,7 +121,7 @@ export default {
             Cookies.remove('rememberMe');
           }
           this.$store.dispatch("Login", this.loginForm).then(() => {
-            this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
+            this.$router.push({ path: this.redirect || "/" }).catch(() => { });
           }).catch(() => {
             this.loading = false;
             if (this.captchaEnabled) {
@@ -164,6 +144,7 @@ export default {
   background-image: url("../assets/images/login-background.jpg");
   background-size: cover;
 }
+
 .title {
   margin: 0px auto 30px auto;
   text-align: center;
@@ -175,32 +156,39 @@ export default {
   background: #ffffff;
   width: 400px;
   padding: 25px 25px 5px 25px;
+
   .el-input {
     height: 38px;
+
     input {
       height: 38px;
     }
   }
+
   .input-icon {
     height: 39px;
     width: 14px;
     margin-left: 2px;
   }
 }
+
 .login-tip {
   font-size: 13px;
   text-align: center;
   color: #bfbfbf;
 }
+
 .login-code {
   width: 33%;
   height: 38px;
   float: right;
+
   img {
     cursor: pointer;
     vertical-align: middle;
   }
 }
+
 .el-login-footer {
   height: 40px;
   line-height: 40px;
@@ -213,6 +201,7 @@ export default {
   font-size: 12px;
   letter-spacing: 1px;
 }
+
 .login-code-img {
   height: 38px;
 }

+ 20 - 31
src/views/register.vue

@@ -1,56 +1,36 @@
 <template>
   <div class="register">
     <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
-      <h3 class="title">平信办后台管理系统</h3>
+      <h3 class="title">社会科学战线后台管理系统</h3>
       <el-form-item prop="username">
         <el-input v-model="registerForm.username" type="text" auto-complete="off" placeholder="账号">
           <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
         </el-input>
       </el-form-item>
       <el-form-item prop="password">
-        <el-input
-          v-model="registerForm.password"
-          type="password"
-          auto-complete="off"
-          placeholder="密码"
-          @keyup.enter.native="handleRegister"
-        >
+        <el-input v-model="registerForm.password" type="password" auto-complete="off" placeholder="密码"
+          @keyup.enter.native="handleRegister">
           <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
         </el-input>
       </el-form-item>
       <el-form-item prop="confirmPassword">
-        <el-input
-          v-model="registerForm.confirmPassword"
-          type="password"
-          auto-complete="off"
-          placeholder="确认密码"
-          @keyup.enter.native="handleRegister"
-        >
+        <el-input v-model="registerForm.confirmPassword" type="password" auto-complete="off" placeholder="确认密码"
+          @keyup.enter.native="handleRegister">
           <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
         </el-input>
       </el-form-item>
       <el-form-item prop="code" v-if="captchaEnabled">
-        <el-input
-          v-model="registerForm.code"
-          auto-complete="off"
-          placeholder="验证码"
-          style="width: 63%"
-          @keyup.enter.native="handleRegister"
-        >
+        <el-input v-model="registerForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
+          @keyup.enter.native="handleRegister">
           <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
         </el-input>
         <div class="register-code">
-          <img :src="codeUrl" @click="getCode" class="register-code-img"/>
+          <img :src="codeUrl" @click="getCode" class="register-code-img" />
         </div>
       </el-form-item>
       <el-form-item style="width:100%;">
-        <el-button
-          :loading="loading"
-          size="medium"
-          type="primary"
-          style="width:100%;"
-          @click.native.prevent="handleRegister"
-        >
+        <el-button :loading="loading" size="medium" type="primary" style="width:100%;"
+          @click.native.prevent="handleRegister">
           <span v-if="!loading">注 册</span>
           <span v-else>注 册 中...</span>
         </el-button>
@@ -131,7 +111,7 @@ export default {
               type: 'success'
             }).then(() => {
               this.$router.push("/login");
-            }).catch(() => {});
+            }).catch(() => { });
           }).catch(() => {
             this.loading = false;
             if (this.captchaEnabled) {
@@ -154,6 +134,7 @@ export default {
   background-image: url("../assets/images/login-background.jpg");
   background-size: cover;
 }
+
 .title {
   margin: 0px auto 30px auto;
   text-align: center;
@@ -165,32 +146,39 @@ export default {
   background: #ffffff;
   width: 400px;
   padding: 25px 25px 5px 25px;
+
   .el-input {
     height: 38px;
+
     input {
       height: 38px;
     }
   }
+
   .input-icon {
     height: 39px;
     width: 14px;
     margin-left: 2px;
   }
 }
+
 .register-tip {
   font-size: 13px;
   text-align: center;
   color: #bfbfbf;
 }
+
 .register-code {
   width: 33%;
   height: 38px;
   float: right;
+
   img {
     cursor: pointer;
     vertical-align: middle;
   }
 }
+
 .el-register-footer {
   height: 40px;
   line-height: 40px;
@@ -203,6 +191,7 @@ export default {
   font-size: 12px;
   letter-spacing: 1px;
 }
+
 .register-code-img {
   height: 38px;
 }

+ 4 - 4
vue.config.js

@@ -7,7 +7,7 @@ function resolve(dir) {
 
 const CompressionPlugin = require('compression-webpack-plugin')
 
-const name = process.env.VUE_APP_TITLE || '平信办管理系统' // 网页标题
+const name = process.env.VUE_APP_TITLE || '社会科学战线管理系统' // 网页标题
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口
 
@@ -112,7 +112,7 @@ module.exports = {
             .plugin('ScriptExtHtmlWebpackPlugin')
             .after('html')
             .use('script-ext-html-webpack-plugin', [{
-            // `runtime` must same as runtimeChunk name. default is `runtime`
+              // `runtime` must same as runtimeChunk name. default is `runtime`
               inline: /runtime\..*\.js$/
             }])
             .end()
@@ -142,8 +142,8 @@ module.exports = {
             })
           config.optimization.runtimeChunk('single'),
           {
-             from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
-             to: './' //到根目录下
+            from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
+            to: './' //到根目录下
           }
         }
       )