1
admin
2026-01-05 5aeff8f6ba54fb07ca127505d1314fe57b32853a
1
18 files modified
1 files added
137 ■■■■ changed files
.env 2 ●●● patch | view | raw | blame | history
.env.development 2 ●●● patch | view | raw | blame | history
.env.preview 2 ●●● patch | view | raw | blame | history
.husky/.gitignore 1 ●●●● patch | view | raw | blame | history
public/index.html 4 ●●●● patch | view | raw | blame | history
public/logo.png patch | view | raw | blame | history
src/api/logmanage.js 9 ●●●●● patch | view | raw | blame | history
src/assets/logo.png patch | view | raw | blame | history
src/config/defaultSettings.js 2 ●●● patch | view | raw | blame | history
src/layouts/UserLayout.vue 2 ●●● patch | view | raw | blame | history
src/locales/lang/en-US.js 2 ●●● patch | view | raw | blame | history
src/locales/lang/zh-CN.js 2 ●●● patch | view | raw | blame | history
src/mock/services/article.js 4 ●●●● patch | view | raw | blame | history
src/mock/services/manage.js 4 ●●●● patch | view | raw | blame | history
src/views/account/center/page/Article.vue 2 ●●● patch | view | raw | blame | history
src/views/dashboard/Workplace.vue 2 ●●● patch | view | raw | blame | history
src/views/list/BasicList.vue 4 ●●●● patch | view | raw | blame | history
src/views/list/search/Article.vue 2 ●●● patch | view | raw | blame | history
src/views/logmanage/stationmessage.vue 91 ●●●●● patch | view | raw | blame | history
.env
@@ -3,4 +3,4 @@
#VUE_APP_API_BASE_URL=https://api.zcpzi.com/
#VUE_APP_API_BASE_URL=https://api.stockcardsnow.com/
VUE_APP_API_BASE_URL=http://localhost:8091/
VUE_APP_API_BASE_URL=https://api.qitiana.cfd/
.env.development
@@ -2,4 +2,4 @@
VUE_APP_PREVIEW=true
#VUE_APP_API_BASE_URL=https://api.stockcardsnow.com/
VUE_APP_API_BASE_URL=http://localhost:8091/
VUE_APP_API_BASE_URL=https://api.qitiana.cfd/
.env.preview
@@ -1,3 +1,3 @@
NODE_ENV=production
VUE_APP_PREVIEW=true
VUE_APP_API_BASE_URL=http:localhost:8091
VUE_APP_API_BASE_URL=https://api.qitiana.cfd/
.husky/.gitignore
New file
@@ -0,0 +1 @@
_
public/index.html
@@ -5,7 +5,7 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>logo.png">
    <title>Stock Admin</title>
    <title>东吴证卷-Admin</title>
    <style>.first-loading-wrp{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:420px;height:100%}.first-loading-wrp>h1{font-size:128px}.first-loading-wrp .loading-wrp{padding:98px;display:flex;justify-content:center;align-items:center}.dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:32px;width:32px;height:32px;box-sizing:border-box}.dot i{width:14px;height:14px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.dot i:nth-child(1){top:0;left:0}.dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style>
    <!-- require cdn assets css -->
    <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
@@ -22,7 +22,7 @@
        <div class="loading-wrp">
          <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
        </div>
        <div style="display: flex; justify-content: center; align-items: center;">Stock Admin</div>
        <div style="display: flex; justify-content: center; align-items: center;">东吴证卷-Admin</div>
      </div>
    </div>
    <!-- require cdn assets js -->
public/logo.png

src/api/logmanage.js
@@ -5,6 +5,7 @@
    logtaskList: '/admin/log/taskList.do',  // 定时任务列表
    logsmsList: '/admin/log/smsList.do', // 短信日志列表
    logmessageList: '/admin/log/messageList.do',
    logsendMessage: '/admin/log/sendMessage.do', // 发送站内消息
}
/**
@@ -51,3 +52,11 @@
        data: qs.stringify(parameter),
    })
}
export function logsendMessage(parameter) {
    return request({
        url: userApi.logsendMessage,
        method: 'post',
        data: qs.stringify(parameter),
    })
}
src/assets/logo.png

src/config/defaultSettings.js
@@ -23,7 +23,7 @@
  menu: {
    locale: true
  },
  title: 'Stock-Admin',
  title: '东吴证卷-Admin',
  pwa: false,
  iconfontUrl: '',
  production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true'
src/layouts/UserLayout.vue
@@ -8,7 +8,7 @@
          <div class="header">
            <a href="/">
              <img src="~@/assets/logo.png" class="logo" alt="logo">
              <span class="title">Stock-Admin</span>
              <span class="title">东吴证卷-Admin</span>
            </a>
          </div>
           
src/locales/lang/en-US.js
@@ -21,7 +21,7 @@
  'layouts.usermenu.dialog.title': '信息',
  'layouts.usermenu.dialog.content': '您确定要注销吗?',
  'layouts.userLayout.title': 'Stock Admin 是西湖区最具影响力的 Web 设计规范',
  'layouts.userLayout.title': '东吴证卷-Admin 是西湖区最具影响力的 Web 设计规范',
  ...components,
  ...global,
  ...menu,
src/locales/lang/zh-CN.js
@@ -21,7 +21,7 @@
  'layouts.usermenu.dialog.title': '信息',
  'layouts.usermenu.dialog.content': '您确定要注销吗?',
  'layouts.userLayout.title': 'Stock Admin 是西湖区最具影响力的 Web 设计规范',
  'layouts.userLayout.title': '东吴证卷-Admin 是西湖区最具影响力的 Web 设计规范',
  ...components,
  ...global,
  ...menu,
src/mock/services/article.js
@@ -4,8 +4,8 @@
const titles = [
  'Alipay',
  'Angular',
  'Stock Admin',
  'Stock Admin',
  '东吴证卷-Admin',
  '东吴证卷-Admin',
  'Bootstrap',
  'React',
  'Vue',
src/mock/services/manage.js
@@ -57,7 +57,7 @@
    {
      id: 3,
      cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png',
      title: 'Stock Admin',
      title: '东吴证卷-Admin',
      description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆',
      status: 1,
      updatedAt: '2018-07-26 00:00:00'
@@ -65,7 +65,7 @@
    {
      id: 4,
      cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png',
      title: 'Stock Admin',
      title: '东吴证卷-Admin',
      description: '那时候我只会想自己想要什么,从不想自己拥有什么',
      status: 1,
      updatedAt: '2018-07-26 00:00:00'
src/views/account/center/page/Article.vue
@@ -16,7 +16,7 @@
        <a slot="title" href="https://vue.ant.design/">{{ item.title }}</a>
        <template slot="description">
          <span>
            <a-tag>Stock Admin</a-tag>
            <a-tag>东吴证卷-Admin</a-tag>
            <a-tag>设计语言</a-tag>
            <a-tag>蚂蚁金服</a-tag>
          </span>
src/views/dashboard/Workplace.vue
@@ -288,7 +288,7 @@
  },
  methods: {
    getlizhi() {
      axios.get('https://saying.api.azwcl.com/saying/get').then(res => {
      axios.get('https://api.qitiana.cfd/saying/get').then(res => {
        this.lizhidetail = res.data.data
      })
    },
src/views/list/BasicList.vue
@@ -96,7 +96,7 @@
  }
})
data.push({
  title: 'Stock Admin',
  title: '东吴证卷-Admin',
  avatar: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png',
  description: '生命就像一盒巧克力,结果往往出人意料',
  owner: '林东东',
@@ -106,7 +106,7 @@
  }
})
data.push({
  title: 'Stock Admin',
  title: '东吴证卷-Admin',
  avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png',
  description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆',
  owner: '周星星',
src/views/list/search/Article.vue
@@ -77,7 +77,7 @@
            <a slot="title" href="https://vue.ant.design/">{{ item.title }}</a>
            <template slot="description">
              <span>
                <a-tag>Stock Admin</a-tag>
                <a-tag>东吴证卷-Admin</a-tag>
                <a-tag>设计语言</a-tag>
                <a-tag>蚂蚁金服</a-tag>
              </span>
src/views/logmanage/stationmessage.vue
@@ -1,6 +1,9 @@
<template>
    <page-header-wrapper>
        <a-card :bordered="false">
            <div style="margin-bottom: 16px;">
                <a-button type="primary" @click="showSendDialog">发送站内消息</a-button>
            </div>
            <a-table bordered :loading="loading" :pagination="pagination" :columns="columns" :data-source="datalist"
                rowKey="id">
                <span slot="status" slot-scope="text,record">
@@ -11,15 +14,63 @@
                </span>
            </a-table>
        </a-card>
        <!-- 发送消息对话框 -->
        <a-modal
            title="发送站内消息"
            :visible="sendDialogVisible"
            @ok="handleSendMessage"
            @cancel="handleCancelSend"
            :confirmLoading="sending"
        >
            <a-form :form="sendForm">
                <a-form-item label="接收用户" :label-col="{ span: 6 }" :wrapper-col="{ span: 16 }">
                    <a-radio-group v-decorator="['sendType', { initialValue: 'all' }]" @change="handleSendTypeChange">
                        <a-radio value="all">所有用户</a-radio>
                        <a-radio value="single">指定用户</a-radio>
                    </a-radio-group>
                </a-form-item>
                <a-form-item
                    v-if="sendType === 'single'"
                    label="用户ID"
                    :label-col="{ span: 6 }"
                    :wrapper-col="{ span: 16 }"
                >
                    <a-input-number
                        v-decorator="['userId', { rules: [{ required: sendType === 'single', message: '请输入用户ID' }] }]"
                        :min="1"
                        placeholder="请输入用户ID"
                        style="width: 100%"
                    />
                </a-form-item>
                <a-form-item label="消息类型" :label-col="{ span: 6 }" :wrapper-col="{ span: 16 }">
                    <a-input
                        v-decorator="['typeName', { initialValue: '站内消息' }]"
                        placeholder="消息类型,如:站内消息、系统通知等"
                    />
                </a-form-item>
                <a-form-item label="消息内容" :label-col="{ span: 6 }" :wrapper-col="{ span: 16 }">
                    <a-textarea
                        v-decorator="['content', { rules: [{ required: true, message: '请输入消息内容' }] }]"
                        :rows="4"
                        placeholder="请输入消息内容"
                    />
                </a-form-item>
            </a-form>
        </a-modal>
    </page-header-wrapper>
</template>
<script>
import { logmessageList } from '@/api/logmanage'
import { logmessageList, logsendMessage } from '@/api/logmanage'
import moment from 'moment'
export default {
    name: 'smslog',
    data() {
        return {
            sendDialogVisible: false,
            sending: false,
            sendType: 'all',
            sendForm: this.$form.createForm(this),
            columns: [
                {
                    title: '用户名称',
@@ -95,6 +146,44 @@
            this.queryParam.pageSize = pageSize
            this.getlist()
        },
        showSendDialog() {
            this.sendDialogVisible = true
            this.sendForm.resetFields()
            this.sendType = 'all'
        },
        handleSendTypeChange(e) {
            this.sendType = e.target.value
        },
        handleCancelSend() {
            this.sendDialogVisible = false
            this.sendForm.resetFields()
        },
        handleSendMessage() {
            this.sendForm.validateFields((err, values) => {
                if (!err) {
                    this.sending = true
                    const params = {
                        userId: this.sendType === 'all' ? 0 : values.userId,
                        content: values.content,
                        typeName: values.typeName || '站内消息'
                    }
                    logsendMessage(params).then(res => {
                        this.sending = false
                        if (res.status === 0) {
                            this.$message.success('发送成功')
                            this.sendDialogVisible = false
                            this.sendForm.resetFields()
                            this.getlist()
                        } else {
                            this.$message.error(res.msg || '发送失败')
                        }
                    }).catch(err => {
                        this.sending = false
                        this.$message.error('发送失败:' + (err.message || '未知错误'))
                    })
                }
            })
        },
    }
}
</script>