ui库合并版本完成

This commit is contained in:
aixianling
2022-12-01 09:13:53 +08:00
parent fe3e06e654
commit 02a4b50fc0
39 changed files with 47 additions and 5989 deletions

88
ui/lib/js/area.js Normal file
View File

@@ -0,0 +1,88 @@
import request from "./request";
export default class Area {
constructor(code, hash = {}) {
this.id = code
this.level = Area.getLevelByAreaId(code)
this.areaMap = Object.values(this.getAreaInfo(code))
if (Object.keys(hash).length > 0) {
this.getName(this.areaMap.map(id => hash[id]))
}
}
/**
* 获取地区的行政等级
* @param code 地区编码
* @returns {number}
*/
static getLevelByAreaId(code) {
if (code) {
if (code.length === 2 || /0{10}$/.test(code)) return 0;
else if (/0{8}$/.test(code)) return 1;
else if (/0{6}$/.test(code)) return 2;
else if (/0{3}$/.test(code)) return 3;
else return 4
} else return -1
}
/**
* 根据地区编码获取指定等级的地区编码
* @param value 地区编码
* @param level 指定等级
* @returns {string|null|*}
*/
static getAreaCodeByLevel(value, level) {
if (value) {
const areaNumber = value.toString();
switch (level) {
case 0:
return areaNumber.substring(0, 2) + '0000000000';
case 1:
return areaNumber.substring(0, 4) + '00000000';
case 2:
return areaNumber.substring(0, 6) + '000000';
case 3:
return areaNumber.substring(0, 9) + '000';
case 4:
return areaNumber
}
} else return null
}
static createByAction(areaId, ins = request, action = "/admin/area/getAllParentAreaId") {
return ins.post(action, null, {params: {areaId}, withoutToken: 1}).then(res => res?.data?.reverse() || [])
}
getAreaInfo(id) {
let info = {}
const currentLevel = Area.getLevelByAreaId(id);
for (let i = 0; i <= currentLevel; i++) {
info[i] = Area.getAreaCodeByLevel(id, i);
}
return info
}
async getAreaName() {
const names = await Area.createByAction(this.id);
this.getName(names)
}
getName(names) {
this.meta = names
this.nameMap = names?.map(e => e.name) || []
this.name = names?.slice(-1)?.[0]?.name
this.fullname = this.nameMap.join('')
}
/**
* 异步从数据库中获取地区信息
* @returns {Promise<void>}
*/
static async init(code) {
const names = await Area.createByAction(code),
area = new Area(code)
area.getName(names)
return area
}
}

20
ui/lib/js/coin.js Normal file
View File

@@ -0,0 +1,20 @@
export default {
cny(money) {
if (money) {
money.toLocaleString('zh-Hans-CN', {style: 'currency', currency: "CNY"})
}
return money
},
cn(money) {
let num = parseFloat(money), cnMoney = '',
units = '仟佰拾亿仟佰拾万仟佰拾元角分',
cnNum = '零壹贰叁肆伍陆柒捌玖'
num = num.toFixed(2).replace(/\./g,'')
units = units.substring(units.length - num.length)
console.log(num, units.length, num.length)
Array.from(num).map((e, i) => {
cnMoney += cnNum.charAt(e) + units.charAt(i)
})
return cnMoney.replace(/零角零分$/, '整').replace(/零[仟佰拾]/g, '零').replace(/零{2,}/g, '零').replace(/零([亿|万])/g, '$1').replace(/零+元/, '元').replace(/亿零{0,3}万/, '亿').replace(/^元/, "零元")
}
}

77
ui/lib/js/dict.js Normal file
View File

@@ -0,0 +1,77 @@
import request from "./request";
/**
* 封装字典工具类
*/
const $dict = {
url: "/admin/dictionary/queryValsByCodeList",
loading: [],
resolves: [],
getStorage() {
const dicts = JSON.parse(localStorage.getItem('dicts') || null)
return dicts?.data || dicts || [];
},
setUrl(v) {
this.url = v
},
getData(codeList) {
codeList = [codeList].flat().filter(Boolean).toString()
return request.post(this.url, null, {
withoutToken: true, params: {codeList}
}).then(res => res?.data && this.setStorage(res.data))
},
load(...code) {
return new Promise(resolve => {
this.resolves.push(resolve)
if (this.loading.length == 2) {
const [timer, codes] = this.loading;
clearTimeout(timer)
code = Array.from(new Set([codes, code].flat()))
}
const timer = setTimeout(() => {
this.getData(code).then(() => Promise.all(this.resolves.map(e => e())).then(() => this.resolves = []))
}, 500)
this.loading = [timer, code]
})
},
setStorage(data) {
let ds = this.getStorage()
data.map(p => {
if (ds.some(d => d.key == p.key)) {
const index = ds.findIndex(d => d.key == p.key)
ds.splice(index, 1, p)
} else {
ds.push(p)
}
})
localStorage.setItem("dicts", JSON.stringify([ds].flat()))
},
getDict(key) {
let dict = this.getStorage().find(e => e.key == key)
!dict && console.warn("字典%s缺少加载...", key)
return dict ? dict.values : []
},
getValue(key, label) {
let dict = this.getDict(key)
if (dict) {
let item = dict.find(v => v.dictName == label)
return item ? item.dictValue : label
} else return label
},
getLabel(key, value) {
let dict = this.getDict(key)
if (dict) {
let item = dict.find(v => v.dictValue == value)
return item ? item.dictName : value
} else return value
},
getColor(key, value) {
let dict = this.getDict(key)
if (dict) {
let item = dict.find(v => v.dictValue == value)
return item ? item.dictColor : value
} else return value
},
}
export default $dict

23
ui/lib/js/encryption.js Normal file
View File

@@ -0,0 +1,23 @@
import CryptoJs from "crypto-js";
/**
* 密码加密工具
* @param params
* @param c 加载尝试计数器
* @returns {string}
*/
export const $encryption = (params, c = 0) => {
if (CryptoJs) {
const key = "thanks,villcloud"
let iv = CryptoJs.enc.Latin1.parse(key)
let encrypted = CryptoJs.AES.encrypt(params.password, iv, {
iv,
mode: CryptoJs.mode.CBC,
padding: CryptoJs.pad.ZeroPadding
})
return encrypted.toString()
} else if (c < 10) {
setTimeout(() => $encryption(params, ++c), 200)
} else console.error("无法加载CryptoJs")
}
export default $encryption

238
ui/lib/js/identity.js Normal file
View File

@@ -0,0 +1,238 @@
import dayjs from "./moment";
const PARAMS = {
/* 省,直辖市代码表 */
provinceAndCitys: {
11: '北京',
12: '天津',
13: '河北',
14: '山西',
15: '内蒙古',
21: '辽宁',
22: '吉林',
23: '黑龙江',
31: '上海',
32: '江苏',
33: '浙江',
34: '安徽',
35: '福建',
36: '江西',
37: '山东',
41: '河南',
42: '湖北',
43: '湖南',
44: '广东',
45: '广西',
46: '海南',
50: '重庆',
51: '四川',
52: '贵州',
53: '云南',
54: '西藏',
61: '陕西',
62: '甘肃',
63: '青海',
64: '宁夏',
65: '新疆',
71: '台湾',
81: '香港',
82: '澳门',
91: '国外'
},
/* 每位加权因子 */
powers: [
'7',
'9',
'10',
'5',
'8',
'4',
'2',
'1',
'6',
'3',
'7',
'9',
'10',
'5',
'8',
'4',
'2'
],
/* 第18位校检码 */
parityBit: ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'],
/* 性别 */
genders: {1: '男', 0: '女'},
}
const Check = {
/* 校验地址码 */
checkAddressCode(addressCode) {
const check = /^[1-9]\d{5}$/.test(addressCode)
if (!check) return false
return !!PARAMS.provinceAndCitys[parseInt(addressCode.substring(0, 2))]
},
/* 校验日期码 */
checkBirthDayCode(birDayCode) {
const check = /^[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))$/.test(
birDayCode
)
if (!check) return false
const yyyy = parseInt(birDayCode.substring(0, 4), 10)
const mm = parseInt(birDayCode.substring(4, 6), 10)
const dd = parseInt(birDayCode.substring(6), 10)
const xdata = new Date(yyyy, mm - 1, dd)
if (xdata > new Date()) {
return false // 生日不能大于当前日期
} else {
return (
xdata.getFullYear() == yyyy &&
xdata.getMonth() == mm - 1 &&
xdata.getDate() == dd
)
}
},
/* 验证校检码 */
checkParityBit(idCardNo) {
const parityBit = idCardNo.charAt(17).toUpperCase()
return this.getParityBit(idCardNo) == parityBit
},
// 校验15位的身份证号码
check15IdCardNo(idCardNo) {
// 15位身份证号码的基本校验
let check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(
idCardNo
)
if (!check) return false
// 校验地址码
const addressCode = idCardNo.substring(0, 6)
check = this.checkAddressCode(addressCode)
if (!check) return false
const birDayCode = '19' + idCardNo.substring(6, 12)
// 校验日期码
return this.checkBirthDayCode(birDayCode)
},
// 校验18位的身份证号码
check18IdCardNo(idCardNo) {
// 18位身份证号码的基本格式校验
let check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(
idCardNo
)
if (!check) return false
// 校验地址码
const addressCode = idCardNo.substring(0, 6)
check = this.checkAddressCode(addressCode)
if (!check) return false
// 校验日期码
const birDayCode = idCardNo.substring(6, 14)
check = this.checkBirthDayCode(birDayCode)
if (!check) return false
// 验证校检码
return this.checkParityBit(idCardNo)
},
/* 计算校检码 */
getParityBit(idCardNo) {
const id17 = idCardNo.substring(0, 17)
/* 加权 */
let power = 0
for (let i = 0; i < 17; i++) {
power += parseInt(id17.charAt(i), 10) * parseInt(PARAMS.powers[i])
}
/* 取模 */
const mod = power % 11
return PARAMS.parityBit[mod]
}
}
export default class Identity {
constructor(code) {
this.code = this.getId18(code)
this.init()
}
init() {
const {code} = this
if (!!code) {
this.hideCode = Identity.hideId(code)
this.getIdCardInfo(code)
}
}
static hideId(code) {
return code?.replace(/^(\d{10})\d{4}(.{4}$)/g, `$1${Array(5).join('*')}$2`)
}
getId18(code) {
if (code.length == 15) {
const id17 = code.substring(0, 6) + '19' + code.substring(6)
const parityBit = Check.getParityBit(id17)
return id17 + parityBit
} else if (code.length == 18) {
return code
} else {
return null
}
}
getIdCardInfo(idCardNo) {
this.birthday = Identity.getBirthday(idCardNo)
this.sex = Identity.getSex(idCardNo)
this.gender = PARAMS.genders[this.sex]
this.age = Identity.getAge(idCardNo)
this.areaId = Identity.getArea(idCardNo)
}
/**
* 获取性别
* @param code
* @returns {string}
*/
static getSex(code) {
return (Number(code.substring(16, 17)) % 2).toString()
}
/**
* 获取年龄
* @param code
* @returns {number}
*/
static getAge(code) {
const birthday = dayjs(code.substring(6, 14), 'YYYYMMDD')
return Math.ceil(dayjs.duration(dayjs().unix() - dayjs(birthday).unix(), 's').asYears())
}
/**
* 获取地区编码
* @param code
*/
static getArea(code) {
return code.substring(0, 6) + new Array(7).join(0)
}
/**
* 获取生日
*/
static getBirthday(code) {
return dayjs(code.substring(6, 14), 'YYYYMMDD').format("YYYY-MM-DD").replace('Invalid Date', '')
}
/* 校验15位或18位的身份证号码 */
static check(idCardNo) {
// 15位和18位身份证号码的基本校验
const check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo)
if (!check) return false
// 判断长度为15位或18位
if (idCardNo.length == 15) {
return Check.check15IdCardNo(idCardNo)
} else if (idCardNo.length == 18) {
return Check.check18IdCardNo(idCardNo)
} else {
return false
}
}
}

305
ui/lib/js/modules.js Normal file
View File

@@ -0,0 +1,305 @@
import http from "./request";
import utils from "./utils";
import Vue from "vue"
export const sys = {
state: () => ({
info: {},
theme: {}
}),
mutations: {
setSysInfo(state, info) {
state.info = info
},
setTheme(state, theme) {
state.theme = theme
}
},
actions: {
getSystem({commit}, info) {
return http.post("/app/appdvcpconfig/getSystemInfo", null, {withoutToken: true}).then(res => {
if (res?.data) {
let {systemInfo, colorScheme, enableGreyFilter} = res.data
systemInfo = JSON.parse(systemInfo || null) || {}
colorScheme = JSON.parse(colorScheme || null) || {}
commit("setSysInfo", {...info, ...systemInfo})
commit("setTheme", {colorScheme, enableGreyFilter})
return res.data
} else return Promise.reject()
}).catch(() => commit("setSysInfo", info))
}
}
}
/**
* 用户信息
*/
export const user = {
state: () => ({
token: "",
info: {},
routes: []
}),
mutations: {
setToken(state, token) {
state.token = token;
},
setUserInfo(state, info) {
state.info = info
},
cleanUserInfo(state) {
state.info = {}
state.token = ""
},
setUserExtra(state, extra = {}) {
Object.keys(extra).map(e => Vue.set(state, e, extra[e]))
},
setRoutes(state,routes){
state.routes = routes
}
},
actions: {
getToken({commit}, params) {
let action = "/auth/oauth/token"
if (params?.action) {
action = params?.action
delete params?.action
}
const password = utils.$encryption(params)
return http.post(action, null, {
auth: {
username: 'villcloud',
password: "villcloud"
},
params: {grant_type: 'password', scope: 'server', ...params, password}
}).then(res => {
if (res?.access_token) {
const {token_type, access_token} = res, token = [token_type, access_token].join(" ")
return commit('setToken', token)
}
})
},
getUserInfo({commit, dispatch}) {
return http.post("/admin/user/detail-phone").then(res => {
if (res?.data) {
commit("setUserInfo", res.data)
return Promise.all([dispatch('getWorkflowConfigs')]).then(() => res.data)
}
})
},
getRouteName({state}, appName) {
return state.routes.find(e => e.component == appName)?.route || appName
}
}
}
/**
* 企微jssdk功能
*/
let timer = {injectJWeixin: null, initOpenData: null}
export const wxwork = {
state: () => ({
agentSignURL: "",
apiList: [],
config: {}
}),
mutations: {
setConfig(state, config) {
state.config = config
},
setAgentSignURL(state, url) {
state.agentSignURL = url
},
setApiList(state, list) {
state.apiList = list
},
},
actions: {
agentSign({state, commit, rootState}, params) {
//授权jssdk在url上使用,并获取corpId
let url = window.location.href
if (state.agentSignURL == url && state.config.corpId) {
return Promise.resolve()
} else {
commit("setAgentSignURL", url)
commit("setApiList", [])
let action = "/app/wxcptp/portal/agentSign"
if (!!params?.action) {
action = params.action
delete params.action
}
const {corpId} = rootState.user.info
return http.post(action, null, {
withoutToken: true,
params: {corpId, ...params, url}
}).then(res => {
if (res?.data) {
let config = {
...params,
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来若要查看传入的参数可以在pc端打开参数信息会通过log打出仅在pc端时才会打印。
beta: true,// 必须这么写否则wx.invoke调用形式的jsapi会有问题
corpid: res.data.corpid, // 必填企业微信的corpid必须与当前登录的企业一致
agentid: res.data.agentId, // 必填企业微信的应用id e.g. 1000247
timestamp: Number(res.data.timestamp), // 必填,生成签名的时间戳
nonceStr: res.data.nonceStr, // 必填,生成签名的随机串
signature: res.data.signature,// 必填,签名,见 附录-JS-SDK使用权限签名算法
...res.data
}
commit("setConfig", config)
return config
}
}).catch(err => {
commit("setAgentSignURL", "")
console.error(err)
})
}
},
injectJWeixin({state, commit}, apis) {
const inject = (jsApiList) => new Promise((resolve, reject) => {
jsApiList = jsApiList || []
if (timer.injectJWeixin) {//节流设置,50ms内的多次请求合并到一处
clearTimeout(timer.injectJWeixin)
jsApiList = [...new Set([...state.apiList, ...jsApiList])]
commit("setApiList", jsApiList)
}
timer.injectJWeixin = setTimeout(() => {
const sdk = wx?.agentConfig ? wx : jWeixin
sdk?.agentConfig({
...state.config, jsApiList,
success: res => resolve(res),
fail: err => {
console.error(err)
reject(err)
}
})
}, 50)
})
return inject(apis)
},
initOpenData({dispatch, commit}, params = {}) {
const initWOD = (count = 0) => {
if (!!window?.WWOpenData) {
const canvas = params?.canvas
if (canvas) delete params.canvas
if (timer.initOpenData) {
clearTimeout(timer.initOpenData)
}
const init = () => canvas ? dispatch('initCanvas') : dispatch('bindElements')
timer.initOpenData = setTimeout(() => {
window?.WWOpenData?.checkSession({
success: () => init(),
fail: () => {
dispatch('agentSign', params).then(() => dispatch("injectJWeixin")).then(() => init())
}
})
}, 50)
} else if (count > 10) {
console.log("无法获取WWOpenData")
} else {
setTimeout(() => {
initWOD(++count)
}, 200)
}
}
dispatch('agentSign', params).then(() => dispatch("injectJWeixin")).then(() => initWOD())
},
bindElements() {
const nodes = document.querySelectorAll('.AiOpenData')
window.WWOpenData?.bindAll(nodes)
},
initCanvas() {
window.WWOpenData?.initCanvas()
},
transCanvas(store, items) {
return new Promise((resolve, reject) => {
window.WWOpenData?.prefetch({items}, (err, data) => {
err ? reject(err) : resolve(data)
})
})
}
}
}
/**
* 各种前端方案记录选择
*/
export const logs = {
state: () => ({
closeIntro: []
}),
mutations: {
addCloseIntro(state, app) {
state.closeIntro.push(app)
}
},
}
/**
* 流程信息
*/
const startProcess = (form) => {
const {bid, app, flows = {}} = form
const process = flows[app]
if (!!process) {
const {id: pid, config} = process
let workflowConfig = JSON.parse(config || null), nowNodeId = [], startId
workflowConfig?.nodes?.map(e => {
if (e.type == "start") {
e.properties.isStart = true
e.properties.updateTime = utils.$moment().format("YYYY-MM-DD HH:mm:ss")
startId = e.id
}
})
workflowConfig?.edges?.map(e => {
if (e.sourceNodeId == startId) {
nowNodeId.push(e.targetNodeId)
}
})
nowNodeId = nowNodeId?.toString()
return !!nowNodeId && http.post("/app/appworkflowlog/addOrUpdate", {bid, pid, nowNodeId, workflowConfig: JSON.stringify(workflowConfig)})
}
}
export const workflow = {
state: () => ({}),
mutations: {
setWfConfigs(state, configs) {
configs.map(e => {
Vue.set(state, e.app, e)
})
}
},
actions: {
getWorkflowConfigs({commit}) {
return http.post("/app/appworkflowmanage/list", null, {
params: {size: 999}
}).then(res => {
if (res?.data) {
return commit("setWfConfigs", res.data.records)
}
}).catch(() => 0)
},
startFlow(context, form) {
startProcess(form)
},
endFlow(context, form) {
let {workflowConfig = {}, nowNodeId} = form
workflowConfig?.nodes?.map(e => {
if (e.type == "end") {
e.properties.isFinished = true
e.properties.updateTime = utils.$moment().format("YYYY-MM-DD HH:mm:ss")
nowNodeId = "nowNodeId"
}
})
return http.post("/app/appworkflowlog/addOrUpdate", {...form, nowNodeId, workflowConfig: JSON.stringify(workflowConfig)})
}
},
processAdapter(config) {//流程业务拦截器
if (/addOrUpdate/.test(config.url)) {
let app = config.url.replace(/.+(app[^\\\/]+).+/g, '$1')
if (/appapplicationinfo/.test(app)) {//动态台账表单
app = config.params?.appId
} else if (/appcontentinfo/.test(app)) {//内容发布
app = config.data?.moduleId
}
config.workflow = app
}
return config
},
startProcess
}

35
ui/lib/js/moment.js Normal file
View File

@@ -0,0 +1,35 @@
import moment from 'dayjs'
import duration from 'dayjs/plugin/duration'
import updateLocale from 'dayjs/plugin/updateLocale'
import customParseFormat from 'dayjs/plugin/customParseFormat'
import 'dayjs/locale/zh-cn'
moment.locale('zh-cn')
moment.extend(updateLocale)
moment.extend(customParseFormat)
moment.extend(duration)
moment.updateLocale('zh-cn', {
weekdays: "星期日|星期一|星期二|星期三|星期四|星期五|星期六".split("|"),
meridiem(hour) {
let word = ""
if (hour < 6) {
word = "凌晨"
} else if (hour < 9) {
word = "早上"
} else if (hour < 12) {
word = "上午"
} else if (hour < 14) {
word = "中午"
} else if (hour < 17) {
word = "下午"
} else if (hour < 19) {
word = "傍晚"
} else if (hour < 22) {
word = "晚上"
} else {
word = "夜里"
}
return word;
}
})
export default moment

15
ui/lib/js/regular.js Normal file
View File

@@ -0,0 +1,15 @@
export default {
phone: /^((0\d{2,3}-\d{7,8})|((13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}))$/,
password: /^(?=.*\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*,.?_-])[\da-zA-Z~!@#$%^&*,.?_-]{8,16}$/,
money: /^([1-9]\d*|0)(\.\d{1,2})?$/,
area: {
village: /^\d{9}[^0]0{0,2}$/,
town: /^\d{6}[^0]0{0,2}000$/,
country: /^\d{4}[^0]0?0{6}$/,
city: /^\d{2}[^0]0?0{8}$/,
province: /^[^0]0?0{10}$/,
},
zh: /^[\u4e00-\u9fa5]+$/,
email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
ip: /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/
}

83
ui/lib/js/request.js Normal file
View File

@@ -0,0 +1,83 @@
/* eslint-disable */
import axios from 'axios'
import {Message} from "element-ui";
import {workflow} from "./modules";
const instance = axios.create({
baseURL: process.env.NODE_ENV === "production" ? "/" : "/lan",
timeout: 600000,
withCredentials: true,
})
const getStore = () => JSON.parse(localStorage.getItem("vuex") || null) || {}
const getToken = () => getStore().user?.token
/**
* 节流工具
*/
let throttleMap = {}
const source = axios.CancelToken.source();
instance.interceptors.request.use(config => {
if (config.throttle) {// 节流处理
let timer = throttleMap[config.url]
if (!!timer) {
config.cancelToken = source.token
source.cancel("节流控制,取消请求:" + config.url)
}
throttleMap[config.url] = setTimeout(() => {
throttleMap[config.url] = null
}, config.throttle)
}
if (!config.withoutToken && getToken()) {
config.headers["Authorization"] = getToken()
}
//BUG 9456 去除传参空格
if (config.params) {
Object.keys(config.params).map(e => {
if (typeof config.params[e] == "string") config.params[e] = config.params[e].trim()
})
}
config = workflow.processAdapter(config)
return config
}, err => {
console.error(err)
})
instance.interceptors.response.use(res => {
if (res && !!res.config.workflow) {
const {config: {workflow: app}, data: {data: bid}} = res
bid && workflow.startProcess({app, bid, flows: getStore().workflow})
}
if (res && res.data) {
if (!!res.data.code?.toString()) {
if (res.data.code == 0) {
return res.data
} else if (!!res.config.pureBack) {
return res.data
} else if (res.data.code == 401) {
console.error("安全令牌验证无法通过!")
return Promise.reject(res.data)
} else {
Message.error(res.data.msg || "请求失败!")
return !!res.config.returnError ? res.data : Promise.reject(res.data.msg)
}
} else return res.data
} else {
Message.error("服务器异常,请联系管理员!")
}
}, err => {
if (err) {
if (err.response) {
if (err.response.status == 401) {
console.error("安全令牌验证无法通过!")
} else {
console.error(err.response.statusText)
}
} else {
console.error(err)
}
} else {
console.error("通信异常,请联系管理员!")
}
})
export default instance

215
ui/lib/js/utils.js Normal file
View File

@@ -0,0 +1,215 @@
import {MessageBox} from 'element-ui'
import $moment from './moment'
import $dict from './dict'
import $encryption from './encryption'
import $coin from './coin'
import Area from "./area"
import ID from "./identity"
import $reg from "./regular"
/**
* 生成子节点的递归方法
* @param parent 父元素
* @param pending 待递归的数组
* @param config 配置
*/
const addChild = (parent, pending, config) => {
let conf = {
key: 'id',
parent: 'parentId',
children: 'children',
...config
},
doBeforeCount = pending.length
for (let i = pending.length - 1; i >= 0; i--) {
let e = pending[i]
if (e[conf.parent] == parent[conf.key]) {
parent[conf.children] = [...(parent[conf.children] || []), e]
pending.splice(i, 1)
}
}
parent[conf.children] &&
(parent[conf.children] = parent[conf.children].reverse())
if (pending.length > 0 && doBeforeCount > pending.length) {
parent[conf.children].map(c => addChild(c, pending, conf))
}
}
/**
* 数组转tree
* @param list 待转化的数组
* @param config 配置
*/
const $arr2tree = (list, config = {}) => {
const {key = 'id', parent = 'parentId', children = 'children'} = config, result = [], itemMap = {}, ids = list?.map(e => `${e[key]}`)?.toString()
for (const e of list) {
const id = e[key], pid = e[parent]
itemMap[id] = {...e, [children]: [itemMap[id]?.[children]].flat().filter(Boolean)}
const treeItem = itemMap[id]
if (!!pid && ids.indexOf(pid) > -1) {
if (!itemMap[pid]) {
itemMap[pid] = {
children: [],
}
}
itemMap[pid].children.push(treeItem)
} else result.push(treeItem)
}
return result
}
/**
* 封装提示框
*/
const $confirm = (content, options) => {
return MessageBox.confirm(content, {
type: 'warning',
confirmButtonText: '确认',
center: true,
title: '提示',
dangerouslyUseHTMLString: true,
customClass: "AiConfirm",
...options
}).catch(() => 0)
}
const $decimalCalc = (...arr) => {
// 确认提升精度
let decimalLengthes = arr.map(e => {
let index = ('' + e).indexOf('.')
return ('' + e).length - index
})
let maxDecimal = Math.max(...decimalLengthes),
precision = Math.pow(10, maxDecimal)
// 计算
let intArr = arr.map(e => (Number(e) || 0) * precision)
// 返回计算值
return intArr.reduce((t, a) => t + a) / precision
}
/**
* 封装权限判断方法
*/
const $permissions = flag => {
let buttons = []
if (localStorage.getItem('vuex')) {
const vuex = JSON.parse(localStorage.getItem('vuex'))
buttons = vuex.user.info.buttons
}
if (buttons && buttons.length > 0) {
return buttons.some(b => b.id == flag || b.permission == flag)
} else return false
}
const $colorUtils = {
Hex2RGBA(color, alpha = 1) {
let hex = 0
if (color.charAt(0) == '#') {
if (color.length == 4) {
// 检测诸如#FFF简写格式
color =
'#' +
color.charAt(1).repeat(2) +
color.charAt(2).repeat(2) +
color.charAt(3).repeat(2)
}
hex = parseInt(color.slice(1), 16)
}
let r = (hex >> 16) & 0xff
let g = (hex >> 8) & 0xff
let b = hex & 0xff
return `rgba(${r},${g},${b},${alpha})`
},
RGBtoHex(r, g, b) {
let hex = (r << 16) | (g << 8) | b
return '#' + hex.toString(16)
}
}
export const $copy = any => {
if (any) {
return JSON.parse(JSON.stringify(any))
} else return any
}
let debounceWait = null
export const $debounce = (fn, wait) => {
if (debounceWait !== null) clearTimeout(debounceWait);
debounceWait = setTimeout(function () {
typeof fn === 'function' && fn();
}, wait);
}
export const $checkJson = str => {
if (typeof str == 'string') {
try {
let obj = JSON.parse(str);
return !!(typeof obj == 'object' && obj);
} catch (e) {
return false;
}
}
return false;
}
const $load = (sdk, interval = 200, name = "", c = 0) => {
if (!!sdk) {
return Promise.resolve()
} else if (c < 10) {
return new Promise(resolve => setTimeout(() => resolve($load(sdk, interval, name, ++c)), interval))
} else return Promise.reject("无法加载" + name)
}
export {Area, ID}
export default {
addChild,
$confirm,
$decimalCalc,
$dict,
$permissions,
$colorUtils,
$moment,
$encryption,
$coin,
$injectLib: (url, cb = () => 0) => {
const scriptList = document.body.querySelectorAll('script')
if (Object.values(scriptList || {}).findIndex(e => e.src == url) == -1) {
const script = document.createElement('script')
script.type = 'text/javascript'
script.src = url
script.addEventListener('load', () => cb())
document.body.appendChild(script)
} else cb()
},
$injectCss: (url, cb = () => 0) => {
const linkList = document.body.querySelectorAll('link')
if (Object.values(linkList || {}).findIndex(e => e.href == url) == -1) {
const link = document.createElement('link')
link.rel = "stylesheet"
link.type = "text/css"
link.href = url
link.addEventListener('load', () => cb())
document.head.appendChild(link)
} else cb()
},
$dateFormat: (time, format) => {
return $moment(time)
.format(format || 'YYYY-MM-DD')
.replace('Invalid Date', '')
},
$copy,
$download: url => {
fetch(url).then(res => res.blob()).then(blob => {
const link = document.createElement('a')
link.style.display = 'none'
link.href = URL.createObjectURL(blob)
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
})
},
$debounce,
$checkJson,
$arr2tree,
$load,
$reg,
Area,
ID
}

522
ui/lib/styles/ckeditor.scss Normal file
View File

@@ -0,0 +1,522 @@
/*
* CKEditor 5 (v34.2.0) content styles.
* Generated on Fri, 29 Jul 2022 13:03:52 GMT.
* For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
*/
:root {
--ck-color-base-active: hsl(208, 88%, 52%);
--ck-color-image-caption-background: hsl(0, 0%, 97%);
--ck-color-image-caption-text: hsl(0, 0%, 20%);
--ck-color-mention-background: hsla(341, 100%, 30%, 0.1);
--ck-color-mention-text: hsl(341, 100%, 30%);
--ck-color-table-caption-background: hsl(0, 0%, 97%);
--ck-color-table-caption-text: hsl(0, 0%, 20%);
--ck-color-table-column-resizer-hover: var(--ck-color-base-active);
--ck-highlight-marker-blue: hsl(201, 97%, 72%);
--ck-highlight-marker-green: hsl(120, 93%, 68%);
--ck-highlight-marker-pink: hsl(345, 96%, 73%);
--ck-highlight-marker-yellow: hsl(60, 97%, 73%);
--ck-highlight-pen-green: hsl(112, 100%, 27%);
--ck-highlight-pen-red: hsl(0, 85%, 49%);
--ck-image-style-spacing: 1.5em;
--ck-inline-image-style-spacing: calc(var(--ck-image-style-spacing) / 2);
--ck-table-column-resizer-position-offset: calc(var(--ck-table-column-resizer-width) * -0.5 - 0.5px);
--ck-table-column-resizer-width: 7px;
--ck-todo-list-checkmark-size: 16px;
--ck-z-default: 1;
}
/* ckeditor5-block-quote/theme/blockquote.css */
.ck-content blockquote {
overflow: hidden;
padding-right: 1.5em;
padding-left: 1.5em;
margin-left: 0;
margin-right: 0;
font-style: italic;
border-left: solid 5px hsl(0, 0%, 80%);
}
/* ckeditor5-block-quote/theme/blockquote.css */
.ck-content[dir="rtl"] blockquote {
border-left: 0;
border-right: solid 5px hsl(0, 0%, 80%);
}
/* ckeditor5-basic-styles/theme/code.css */
.ck-content code {
background-color: hsla(0, 0%, 78%, 0.3);
padding: .15em;
border-radius: 2px;
}
/* ckeditor5-font/theme/fontsize.css */
.ck-content .text-tiny {
font-size: .7em;
}
/* ckeditor5-font/theme/fontsize.css */
.ck-content .text-small {
font-size: .85em;
}
/* ckeditor5-font/theme/fontsize.css */
.ck-content .text-big {
font-size: 1.4em;
}
/* ckeditor5-font/theme/fontsize.css */
.ck-content .text-huge {
font-size: 1.8em;
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-yellow {
background-color: var(--ck-highlight-marker-yellow);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-green {
background-color: var(--ck-highlight-marker-green);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-pink {
background-color: var(--ck-highlight-marker-pink);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .marker-blue {
background-color: var(--ck-highlight-marker-blue);
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .pen-red {
color: var(--ck-highlight-pen-red);
background-color: transparent;
}
/* ckeditor5-highlight/theme/highlight.css */
.ck-content .pen-green {
color: var(--ck-highlight-pen-green);
background-color: transparent;
}
/* ckeditor5-image/theme/image.css */
.ck-content .image {
display: table;
clear: both;
text-align: center;
margin: 0.9em auto;
min-width: 50px;
}
/* ckeditor5-image/theme/image.css */
.ck-content .image img {
display: block;
margin: 0 auto;
max-width: 100%;
min-width: 100%;
}
/* ckeditor5-image/theme/image.css */
.ck-content .image-inline {
/*
* Normally, the .image-inline would have "display: inline-block" and "img { width: 100% }" (to follow the wrapper while resizing).;
* Unfortunately, together with "srcset", it gets automatically stretched up to the width of the editing root.
* This strange behavior does not happen with inline-flex.
*/
display: inline-flex;
max-width: 100%;
align-items: flex-start;
}
/* ckeditor5-image/theme/image.css */
.ck-content .image-inline picture {
display: flex;
}
/* ckeditor5-image/theme/image.css */
.ck-content .image-inline picture,
.ck-content .image-inline img {
flex-grow: 1;
flex-shrink: 1;
max-width: 100%;
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-block-align-left,
.ck-content .image-style-block-align-right {
max-width: calc(100% - var(--ck-image-style-spacing));
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-align-left,
.ck-content .image-style-align-right {
clear: none;
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-side {
float: right;
margin-left: var(--ck-image-style-spacing);
max-width: 50%;
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-align-left {
float: left;
margin-right: var(--ck-image-style-spacing);
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-align-center {
margin-left: auto;
margin-right: auto;
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-align-right {
float: right;
margin-left: var(--ck-image-style-spacing);
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-block-align-right {
margin-right: 0;
margin-left: auto;
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-style-block-align-left {
margin-left: 0;
margin-right: auto;
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content p + .image-style-align-left,
.ck-content p + .image-style-align-right,
.ck-content p + .image-style-side {
margin-top: 0;
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-inline.image-style-align-left,
.ck-content .image-inline.image-style-align-right {
margin-top: var(--ck-inline-image-style-spacing);
margin-bottom: var(--ck-inline-image-style-spacing);
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-inline.image-style-align-left {
margin-right: var(--ck-inline-image-style-spacing);
}
/* ckeditor5-image/theme/imagestyle.css */
.ck-content .image-inline.image-style-align-right {
margin-left: var(--ck-inline-image-style-spacing);
}
/* ckeditor5-image/theme/imagecaption.css */
.ck-content .image > figcaption {
display: table-caption;
caption-side: bottom;
word-break: break-word;
color: var(--ck-color-image-caption-text);
background-color: var(--ck-color-image-caption-background);
padding: .6em;
font-size: .75em;
outline-offset: -1px;
}
/* ckeditor5-image/theme/imageresize.css */
.ck-content .image.image_resized {
max-width: 100%;
display: block;
box-sizing: border-box;
}
/* ckeditor5-image/theme/imageresize.css */
.ck-content .image.image_resized img {
width: 100%;
}
/* ckeditor5-image/theme/imageresize.css */
.ck-content .image.image_resized > figcaption {
display: block;
}
/* ckeditor5-language/theme/language.css */
.ck-content span[lang] {
font-style: italic;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list {
list-style: none;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list li {
margin-bottom: 5px;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list li .todo-list {
margin-top: 5px;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input {
-webkit-appearance: none;
display: inline-block;
position: relative;
width: var(--ck-todo-list-checkmark-size);
height: var(--ck-todo-list-checkmark-size);
vertical-align: middle;
border: 0;
left: -25px;
margin-right: -15px;
right: 0;
margin-left: 0;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input::before {
display: block;
position: absolute;
box-sizing: border-box;
content: '';
width: 100%;
height: 100%;
border: 1px solid hsl(0, 0%, 20%);
border-radius: 2px;
transition: 250ms ease-in-out box-shadow, 250ms ease-in-out background, 250ms ease-in-out border;
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input::after {
display: block;
position: absolute;
box-sizing: content-box;
pointer-events: none;
content: '';
left: calc(var(--ck-todo-list-checkmark-size) / 3);
top: calc(var(--ck-todo-list-checkmark-size) / 5.3);
width: calc(var(--ck-todo-list-checkmark-size) / 5.3);
height: calc(var(--ck-todo-list-checkmark-size) / 2.6);
border-style: solid;
border-color: transparent;
border-width: 0 calc(var(--ck-todo-list-checkmark-size) / 8) calc(var(--ck-todo-list-checkmark-size) / 8) 0;
transform: rotate(45deg);
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input[checked]::before {
background: hsl(126, 64%, 41%);
border-color: hsl(126, 64%, 41%);
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label > input[checked]::after {
border-color: hsl(0, 0%, 100%);
}
/* ckeditor5-list/theme/todolist.css */
.ck-content .todo-list .todo-list__label .todo-list__label__description {
vertical-align: middle;
}
/* ckeditor5-media-embed/theme/mediaembed.css */
.ck-content .media {
clear: both;
margin: 0.9em 0;
display: block;
min-width: 15em;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.ck-content .page-break {
position: relative;
clear: both;
padding: 5px 0;
display: flex;
align-items: center;
justify-content: center;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.ck-content .page-break::after {
content: '';
position: absolute;
border-bottom: 2px dashed hsl(0, 0%, 77%);
width: 100%;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.ck-content .page-break__label {
position: relative;
z-index: 1;
padding: .3em .6em;
display: block;
text-transform: uppercase;
border: 1px solid hsl(0, 0%, 77%);
border-radius: 2px;
font-family: Helvetica, Arial, Tahoma, Verdana, Sans-Serif;
font-size: 0.75em;
font-weight: bold;
color: hsl(0, 0%, 20%);
background: hsl(0, 0%, 100%);
box-shadow: 2px 2px 1px hsla(0, 0%, 0%, 0.15);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* ckeditor5-table/theme/tablecaption.css */
.ck-content .table > figcaption {
display: table-caption;
caption-side: top;
word-break: break-word;
text-align: center;
color: var(--ck-color-table-caption-text);
background-color: var(--ck-color-table-caption-background);
padding: .6em;
font-size: .75em;
outline-offset: -1px;
}
/* ckeditor5-table/theme/table.css */
.ck-content .table {
margin: 0.9em auto;
display: table;
}
/* ckeditor5-table/theme/table.css */
.ck-content .table table {
border-collapse: collapse;
border-spacing: 0;
width: 100%;
height: 100%;
border: 1px double hsl(0, 0%, 70%);
}
/* ckeditor5-table/theme/table.css */
.ck-content .table table td,
.ck-content .table table th {
min-width: 2em;
padding: .4em;
border: 1px solid hsl(0, 0%, 75%);
}
/* ckeditor5-table/theme/table.css */
.ck-content .table table th {
font-weight: bold;
background: hsla(0, 0%, 0%, 5%);
}
/* ckeditor5-table/theme/table.css */
.ck-content[dir="rtl"] .table th {
text-align: right;
}
/* ckeditor5-table/theme/table.css */
.ck-content[dir="ltr"] .table th {
text-align: left;
}
/* ckeditor5-table/theme/tablecolumnresize.css */
.ck-content .table table {
overflow: hidden;
table-layout: fixed;
}
/* ckeditor5-table/theme/tablecolumnresize.css */
.ck-content .table td,
.ck-content .table th {
position: relative;
}
/* ckeditor5-table/theme/tablecolumnresize.css */
.ck-content .table .table-column-resizer {
position: absolute;
top: -999999px;
bottom: -999999px;
right: var(--ck-table-column-resizer-position-offset);
width: var(--ck-table-column-resizer-width);
cursor: col-resize;
user-select: none;
z-index: var(--ck-z-default);
}
/* ckeditor5-table/theme/tablecolumnresize.css */
.ck-content .table[draggable] .table-column-resizer {
display: none;
}
/* ckeditor5-table/theme/tablecolumnresize.css */
.ck-content .table .table-column-resizer:hover,
.ck-content .table .table-column-resizer__active {
background-color: var(--ck-color-table-column-resizer-hover);
opacity: 0.25;
}
/* ckeditor5-table/theme/tablecolumnresize.css */
.ck-content[dir=rtl] .table .table-column-resizer {
left: var(--ck-table-column-resizer-position-offset);
right: unset;
}
/* ckeditor5-table/theme/tablecolumnresize.css */
.ck-content.ck-read-only .table .table-column-resizer {
display: none;
}
/* ckeditor5-code-block/theme/codeblock.css */
.ck-content pre {
padding: 1em;
color: hsl(0, 0%, 20.8%);
background: hsla(0, 0%, 78%, 0.3);
border: 1px solid hsl(0, 0%, 77%);
border-radius: 2px;
text-align: left;
direction: ltr;
tab-size: 4;
white-space: pre-wrap;
font-style: normal;
min-width: 200px;
}
/* ckeditor5-code-block/theme/codeblock.css */
.ck-content pre code {
background: unset;
padding: 0;
border-radius: 0;
}
/* ckeditor5-horizontal-line/theme/horizontalline.css */
.ck-content hr {
margin: 15px 0;
height: 4px;
background: hsl(0, 0%, 87%);
border: 0;
}
/* ckeditor5-mention/theme/mention.css */
.ck-content .mention {
background: var(--ck-color-mention-background);
color: var(--ck-color-mention-text);
}
@media print {
/* ckeditor5-page-break/theme/pagebreak.css */
.ck-content .page-break {
padding: 0;
}
/* ckeditor5-page-break/theme/pagebreak.css */
.ck-content .page-break::after {
display: none;
}
}

673
ui/lib/styles/common.scss Normal file
View File

@@ -0,0 +1,673 @@
@import "iconfont/iconfont";
@import 'iconfont/logofont';
@import "ckeditor";
@import "vars";
$cdn: "https://cdn.cunwuyun.cn/";
$--color-primary: $primaryColor;
$--color-text-placeholder: $placeholderColor;
$--border-color-base: $borderColor;
$--color-success: $successColor;
$--color-warning: $warnColor;
$--color-danger: $errorColor;
$--color-info: $infoColor;
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";
/**
常用内外边距样式
*/
@each $padMar, $pm in (mar:margin, pad:padding) {
@each $pos, $p in (l:left, r:right, t:top, b:bottom) {
@each $v in (8, 10, 16, 20, 32, 48, 60) {
.#{$padMar}-#{$pos+$v} {
#{$pm}-#{$p}: #{$v}px
}
}
}
}
/**
不换行文本
*/
.nowarp-text {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/**
表头式样
*/
.table-header {
background-color: rgba(243, 246, 249, 1) !important;
color: #333;
line-height: 44px;
font-size: 14px;
font-weight: bold;
padding: 0 !important;
border-bottom: none !important;
}
* {
box-sizing: border-box;
}
/**
表行样式
*/
.table-row {
height: 44px;
&:hover, &:hover td.table-cell {
background-color: #EFF6FF !important;
}
}
/**
表格样式
*/
.table-cell {
font-size: 14px;
padding: 0 !important;
.cell {
line-height: 15px;
}
}
/**
图标统一样式
*/
.iconfont {
font-size: 14px;
}
.iconShow:hover, .iconEdit:hover, .iconParent:hover, .iconChange:hover {
color: $primaryColor;
}
.iconDelete:hover {
color: $errorColor;
}
.iconBack_Large {
width: 16px;
height: 16px;
color: $primaryColor;
cursor: pointer;
}
/**
缺省页相关样式
*/
.no-data {
background: url("https://cdn.cunwuyun.cn/ui/svg/NoData.svg") no-repeat center;
background-size: 120px 120px;
height: 120px;
margin: 48px auto 10px;
}
/**
缺省页相关样式
*/
.ai-empty__bg {
background: url("https://cdn.cunwuyun.cn/ui/svg/empty.svg") no-repeat center;
background-size: 120px 120px;
height: 120px;
margin: 48px auto 0;
}
.no-permission {
background: url("https://cdn.cunwuyun.cn/ui/svg/NoAuthority.svg") no-repeat center;
background-size: 120px 120px;
height: 120px;
margin-top: 48px;
}
.no-message {
background: url("https://cdn.cunwuyun.cn/ui/svg/NoMessage.svg") no-repeat center;
background-size: 120px 120px;
height: 120px;
margin-top: 48px;
}
.done-success {
background: url("https://cdn.cunwuyun.cn/ui/svg/Success.svg") no-repeat center;
background-size: 120px 120px;
height: 120px;
}
.no-div-text {
text-align: center;
font-size: 14px;
color: #666
}
.developing {
background: url("https://cdn.cunwuyun.cn/ui/svg/developing.svg") no-repeat center;
background-size: 400px 320px;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
&:after {
margin-top: 270px;
font-size: 14px;
color: $primaryColor;
display: block;
content: "功能正在开发中..."
}
}
/**
placeholder 样式
*/
input::-webkit-input-placeholder {
color: #ccc;
}
input::-moz-placeholder {
color: #ccc;
}
input::-ms-input-placeholder {
color: #ccc;
}
//切换地区Tab 样式
.area-popover {
right: 0;
}
//弹窗树菜单的样式
.dialog-tree {
&.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
background: rgba(239, 246, 255, 1);
border-radius: 2px;
font-weight: normal;
color: rgba(80, 136, 255, 1);
}
}
//发起群聊的按钮样式
.openIM {
width: 26px;
height: 20px;
background: rgba(255, 255, 255, 1);
border-radius: 12px;
border: 1px solid rgba(208, 212, 220, 1);
box-sizing: border-box;
text-align: center;
cursor: pointer;
&.iconGroup_IM {
color: #89B;
font-size: 16px;
display: flex;
align-items: center;
justify-content: center;
}
&:hover {
background: $primaryColor;
border-color: $primaryColor;
&.iconGroup_IM {
color: #fff;
}
}
}
.fuzzy {
text-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
color: transparent !important;
}
/**
马赛克样式
*/
.mosaic {
position: relative;
&:before {
content: "";
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
background-position: 0 0, 10px 10px;
background-size: 20px 20px;
background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee 100%), linear-gradient(45deg, #eee 25%, white 25%, white 75%, #eee 75%, #eee 100%);
z-index: 202011051009;
}
}
/**
自定义弹性盒子快速用
*/
div[flex] {
display: flex;
align-items: center;
&.column {
flex-direction: column;
}
&.wrap {
flex-wrap: wrap;
}
&.gap {
gap: 20px;
}
}
.fill {
flex: 1;
min-height: 0;
min-width: 0;
}
.el-input {
input[type="number"] {
-moz-appearance: textfield;
&::-webkit-outer-spin-button, &::-webkit-inner-spin-button {
-webkit-appearance: none;
}
}
}
// 2.0公共样式
.ai-form {
display: flex;
justify-content: space-between;
flex-wrap: wrap;
width: 100%;
.el-form-item {
width: 50%;
margin-bottom: 24px;
.el-form-item__content {
margin-left: 134px !important;
}
::v-deep.el-form-item__content {
& .el-input--small, & > .el-range-editor--small, & > .el-cascader, & > .el-select {
width: 325px;
}
}
}
}
.el-message-box {
width: 520px;
padding-bottom: 0;
.el-message-box__header {
padding-left: 40px;
}
.el-message-box__content {
padding-left: 77px;
padding-top: 4px;
}
.el-message-box__title {
justify-content: start;
font-size: 14px;
.el-icon-error:before {
content: "\e7a3";
}
}
.el-message-box__status {
padding-right: 12px;
}
.el-message-box__message {
text-align: start;
font-size: 16px;
color: #333;
font-weight: bold;
min-height: 60px;
}
.el-message-box__btns {
box-sizing: border-box;
text-align: center;
background-color: #F3F6F9;
display: flex;
align-items: center;
justify-content: center;
height: 64px;
.el-button {
padding: 0 32px;
}
}
}
.table-options {
.el-button--text {
height: auto;
margin-right: 8px !important;
margin-left: 0 !important;
padding: 0;
border-radius: unset;
&:last-child {
margin-right: 0 !important;
}
}
span {
margin-right: 8px;
color: $primaryColor;
font-size: 14px;
&:last-child {
margin-right: 0;
}
&:hover {
opacity: 0.8;
}
}
.is-disabled span {
color: #999 !important;
}
}
textarea {
font-family: inherit;
}
.el-button--primary {
border: none;
background: $primaryBtnColor;
&:hover {
opacity: 0.6;
background: $primaryBtnColor;
}
}
.el-button {
font-size: 14px;
border-radius: 2px;
height: 32px;
padding: 8px;
box-sizing: border-box;
[class*=iconfont] {
font-size: 14px;
& + span {
margin-left: 5px;
}
}
}
.el-button--text [class*=iconfont] {
color: inherit;
font-size: inherit;
}
.wechat-message__container {
padding: 8px !important;
background: #F6F9FF !important;
border-radius: 2px !important;
color: #222222 !important;
font-size: 14px !important;
border: 1px solid $primaryColor !important;
h2 {
color: #222222;
font-weight: 500;
font-size: 14px;
}
}
h1, h2, h3, p {
margin: 0;
}
.el-tooltip__popper {
max-width: 600px;
word-break: break-all;
}
.ai-personselect .el-input__suffix .el-input__validateIcon {
display: none;
}
.AiWechatSelecter-container .el-input__suffix .el-input__validateIcon {
display: none;
}
.AiWechatSelecter-container .el-input__suffix .el-input__validateIcon {
display: none;
}
.icon-color89B {
color: #89B;
}
// flex 布局
.flex-between {
display: flex;
align-items: center;
justify-content: space-between;
}
.flex-start {
display: flex;
align-items: center;
}
.ailist-wrapper {
div, p, h2, h1, h3, h5, span {
box-sizing: border-box;
}
}
.mt10 {
margin-top: 10px;
}
.ai-scan {
display: flex;
position: absolute;
top: -10px;
right: -14px;
cursor: pointer;
.poptip-arrow {
position: relative;
height: 24px;
line-height: 24px;
margin-right: 8px;
margin-top: 4px;
padding: 0 10px;
color: $primaryColor;
font-size: 12px;
text-align: center;
background: $primaryLightColor;
border: 1px solid $primaryColor;
em {
position: absolute;
width: 0;
height: 0;
border-color: hsla(0, 0%, 100%, 0);
border-style: solid;
overflow: hidden;
top: 50%;
right: -6px;
transform: translateY(-50%);
border-left-color: $primaryLightColor;
border-width: 6px 0 6px 6px;
}
a {
position: absolute;
width: 0;
height: 0;
border-color: hsla(0, 0%, 100%, 0);
border-style: solid;
overflow: hidden;
top: 50%;
right: -7px;
transform: translateY(-50%);
border-left-color: $primaryColor;
border-width: 6px 0 6px 6px;
}
}
& > i {
padding: 0;
color: $primaryColor;
font-size: 48px;
}
}
/**
背景图设置
*/
.signLeftBg {
background-image: url('#{$cdn}/ui/background/#{$theme}/loginLeft.png');
}
.navBg {
background-image: url('#{$cdn}/ui/background/#{$theme}/nav_bg.png');
}
/**
特殊样式字体
*/
.projectName {
font-family: "Microsoft YaHei UI", "Microsoft YaHei", serif;
height: 56px;
line-height: 56px;
font-size: 42px;
font-weight: 800;
white-space: nowrap;
position: relative;
text-shadow: 0 6px 3px rgba(#222, .1);
color: transparent;
&:after {
position: absolute;
left: 0;
content: attr(title);
background: $projectName;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
z-index: 99;
}
&:before {
position: absolute;
left: 0;
content: attr(title);
text-shadow: 3px 0 0 #fff, -3px 0 0 #fff, 0 -3px 0 #fff, 0 3px 0 #fff;
z-index: 66;
}
}
.textShadow {
position: absolute;
top: 0;
text-shadow: 0 2px 0 $textShadow;
color: transparent;
z-index: -1;
}
#ai-waiting {
color: $primaryColor
}
.color-primary {
color: $primaryColor
}
.hoverActive {
&:hover, &.current, &.isActive {
color: $primaryColor !important;
}
}
/** 登录页左侧标题样式 **/
.signLeftContent {
.titlePane {
margin-top: 124px;
font-size: 20px;
margin-bottom: 64px;
& > b {
display: block;
font-size: 40px;
margin-bottom: 16px;
}
}
.subTitle {
margin-bottom: 16px;
opacity: 0.8;
display: flex;
align-items: center;
gap: 6px;
&:before {
content: " ";
background: transparent;
border-radius: 50%;
border: 1px solid #fff;
width: 8px;
height: 8px;
}
&:last-of-type {
margin-bottom: 0;
}
}
}
.AiConfirm {
position: fixed;
z-index: 202210261023;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
/**
节流器
*/
.throttle {
animation: throttle 0.5s step-end forwards;
}
.throttle:active {
animation: none;
}
@keyframes throttle {
from {
pointer-events: none;
}
to {
pointer-events: all;
}
}

View File

@@ -0,0 +1,958 @@
@font-face {
font-family: "iconfont"; /* Project id 1309749 */
src: url('//at.alicdn.com/t/c/font_1309749_t7bf1dhlp7e.woff2?t=1666749875458') format('woff2'),
url('//at.alicdn.com/t/c/font_1309749_t7bf1dhlp7e.woff?t=1666749875458') format('woff'),
url('//at.alicdn.com/t/c/font_1309749_t7bf1dhlp7e.ttf?t=1666749875458') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.iconpingfenkaohe:before {
content: "\e736";
}
.iconcloss:before {
content: "\e735";
}
.iconzhengcefuwu:before {
content: "\e731";
}
.iconpeixunguanli:before {
content: "\e730";
}
.iconxiaoxizhongxin:before {
content: "\e72f";
}
.iconzhaopinhuiguanli:before {
content: "\e72e";
}
.iconshuzixiangcun:before {
content: "\e72d";
}
.iconteshurenqun:before {
content: "\e72c";
}
.iconzhengminhudong:before {
content: "\e72b";
}
.iconjicengzhili:before {
content: "\e72a";
}
.iconxiaochengxuguanli:before {
content: "\e729";
}
.iconyingjizhihui:before {
content: "\e728";
}
.iconjicengdangjian:before {
content: "\e727";
}
.iconxiangcunchanye:before {
content: "\e726";
}
.iconfangfanpin:before {
content: "\e725";
}
.iconnumber:before {
content: "\e724";
}
.iconattachments:before {
content: "\e719";
}
.icondate:before {
content: "\e71a";
}
.iconcard:before {
content: "\e71b";
}
.iconid:before {
content: "\e71c";
}
.iconcascade:before {
content: "\e71d";
}
.iconlocation:before {
content: "\e71e";
}
.iconname:before {
content: "\e71f";
}
.iconrich_text:before {
content: "\e720";
}
.iconphone_number:before {
content: "\e721";
}
.iconswitch:before {
content: "\e722";
}
.icontime:before {
content: "\e723";
}
.icondianliang:before {
content: "\e711";
}
.iconxueya:before {
content: "\e714";
}
.iconzhuangtai:before {
content: "\e715";
}
.iconxinlv:before {
content: "\e716";
}
.icontiwen:before {
content: "\e717";
}
.iconxueyang:before {
content: "\e718";
}
.iconzongzhizuzhi:before {
content: "\e710";
}
.iconvideolink:before {
content: "\e70f";
}
.iconfacial_recognition:before {
content: "\e70e";
}
.iconunpublish:before {
content: "\e70c";
}
.iconpreview:before {
content: "\e708";
}
.iconpublish:before {
content: "\e709";
}
.iconmore:before {
content: "\e70a";
}
.iconshare:before {
content: "\e70b";
}
.iconcheck_box:before {
content: "\e700";
}
.iconline:before {
content: "\e701";
}
.iconradio:before {
content: "\e702";
}
.icontext_box:before {
content: "\e703";
}
.icontext_area:before {
content: "\e704";
}
.iconpage:before {
content: "\e705";
}
.iconpic:before {
content: "\e706";
}
.iconSelect:before {
content: "\e707";
}
.iconhuluhuxian:before {
content: "\e6f6";
}
.iconkaoheguanli:before {
content: "\e6f9";
}
.iconhujiaozhongxin:before {
content: "\e6fa";
}
.iconliangxinzuzhi:before {
content: "\e6fb";
}
.iconxiaoyuananfang:before {
content: "\e6fc";
}
.iconzhongdianqingshaonian:before {
content: "\e6fd";
}
.iconanquanshengchan:before {
content: "\e6fe";
}
.iconshehuizhian:before {
content: "\e6ff";
}
.iconguangbofabu:before {
content: "\e6f4";
}
.iconwangshangbanshi:before {
content: "\e6f3";
}
.iconyunyingzhongxin:before {
content: "\e6f1";
}
.iconzhengwuweixin:before {
content: "\e6f2";
}
.iconkaoqinguanli:before {
content: "\e6eb";
}
.iconshijianguanli:before {
content: "\e6ec";
}
.iconyifangzhaoren:before {
content: "\e6ed";
}
.iconwanggeguanli:before {
content: "\e6ee";
}
.iconxinfangguanli:before {
content: "\e6ef";
}
.iconshipinjiankong:before {
content: "\e6f0";
}
.iconloudongmoxing:before {
content: "\e6ea";
}
.iconwanggeyuan:before {
content: "\e6e8";
}
.iconjinqishijian:before {
content: "\e6e6";
}
.iconxiaoquzonglan:before {
content: "\e6e7";
}
.iconloudongxinxi:before {
content: "\e6e9";
}
.iconchuangyebutie:before {
content: "\e6db";
}
.icondanweiguanli:before {
content: "\e6dc";
}
.iconjiuyefuwu:before {
content: "\e6e2";
}
.iconchuangyejiuyeguanli:before {
content: "\e6e3";
}
.iconchuangyedanbaodaikuan:before {
content: "\e6e4";
}
.icondaxueshengshixishixun:before {
content: "\e6e5";
}
.iconsearch:before {
content: "\e732";
}
.iconxqhd:before {
content: "\e733";
}
.iconwdhd:before {
content: "\e734";
}
.iconrobot:before {
content: "\e6da";
}
.iconfangda:before {
content: "\e6d7";
}
.iconsuoxiao:before {
content: "\e6d8";
}
.iconEarth:before {
content: "\e6d9";
}
.iconxianfengyeweihui:before {
content: "\e6d6";
}
.iconhuiyuanguanli:before {
content: "\e6d1";
}
.iconcunganbuguanli:before {
content: "\e6d2";
}
.iconzhaopinguanli:before {
content: "\e6d3";
}
.iconqiyeguanli:before {
content: "\e6d5";
}
.iconxingfujifen:before {
content: "\e6ce";
}
.iconxinxizhongxin:before {
content: "\e6cf";
}
.iconpinyipin:before {
content: "\e6d0";
}
.iconUnpublish:before {
content: "\e6cc";
}
.iconPublish:before {
content: "\e6cd";
}
.iconDelay:before {
content: "\e6cb";
}
.iconwarning:before {
content: "\e6f5";
}
.iconzpg:before {
content: "\e6f7";
}
.iconsqy:before {
content: "\e6f8";
}
.iconzxjyzdls:before {
content: "\e6dd";
}
.iconzxjygwgl:before {
content: "\e6de";
}
.iconzxjywdzy:before {
content: "\e6df";
}
.iconzxjycydb:before {
content: "\e6e0";
}
.iconzxjyckmb:before {
content: "\e6e1";
}
.iconarea:before {
content: "\e6d4";
}
.iconyiqingfangkong:before {
content: "\e6ca";
}
.iconPostil:before {
content: "\e6c9";
}
.iconjiaonadangfei:before {
content: "\e6c8";
}
.iconSuccess:before {
content: "\e6c7";
}
.iconAccount_Login:before {
content: "\e6c5";
}
.iconQR_code:before {
content: "\e6c6";
}
.iconMediaPlayer_Play:before {
content: "\e6c3";
}
.iconMediaPlayer_Stop:before {
content: "\e6c4";
}
.icondangyuan:before {
content: "\e6b0";
}
.iconEnvironment:before {
content: "\e6bc";
}
.iconLaw:before {
content: "\e6bd";
}
.iconjicengbangong:before {
content: "\e6be";
}
.iconjicengzhuzhi:before {
content: "\e6bf";
}
.iconwenmingxiangfeng:before {
content: "\e6c0";
}
.iconyangguangcunwu:before {
content: "\e6c1";
}
.iconminzhuyishi:before {
content: "\e6c2";
}
.iconshehuijiuzhu:before {
content: "\e6b8";
}
.iconshujugongxiang:before {
content: "\e6b9";
}
.iconjuminxinxi:before {
content: "\e6ba";
}
.iconxinxiguanli:before {
content: "\e6bb";
}
.iconRecommend:before {
content: "\e6af";
}
.iconqiandao:before {
content: "\e6ad";
}
.iconqingjia:before {
content: "\e6ae";
}
.iconhistogram:before {
content: "\e6ac";
}
.iconAudit:before {
content: "\e6a9";
}
.iconVerify:before {
content: "\e6aa";
}
.iconTransaction:before {
content: "\e6ab";
}
.iconEwm:before {
content: "\e6a6";
}
.iconIOS:before {
content: "\e6a7";
}
.iconAndroid:before {
content: "\e6a8";
}
.iconjdq_led_clean:before {
content: "\e67a";
}
.iconjdq_led_edit:before {
content: "\e67b";
}
.iconjdq_led_Led:before {
content: "\e680";
}
.iconjdq_led_Led1:before {
content: "\e681";
}
.iconjdq_led_Right:before {
content: "\e688";
}
.iconjdq_led_Ledjiesu:before {
content: "\e689";
}
.iconjdq_led_show:before {
content: "\e68a";
}
.iconjdq_led_Ledwx:before {
content: "\e68b";
}
.iconjdq_led_Lednrhg:before {
content: "\e68c";
}
.iconClean1:before {
content: "\e6a4";
}
.iconLoading:before {
content: "\e6a5";
}
.iconSubordinates:before {
content: "\e6a1";
}
.iconDownload:before {
content: "\e6a2";
}
.iconNext_Mission:before {
content: "\e6a3";
}
.iconAdmitted:before {
content: "\e69c";
}
.iconEmployment_Confirmation:before {
content: "\e69d";
}
.iconRepulsebeifen:before {
content: "\e69e";
}
.iconUpdate_Files:before {
content: "\e69f";
}
.iconRepulse:before {
content: "\e6a0";
}
.iconOverrule:before {
content: "\e69a";
}
.iconWithdrawn:before {
content: "\e69b";
}
.iconDetails:before {
content: "\e699";
}
.iconSpecial_Populations:before {
content: "\e698";
}
.iconPerson_Transfer:before {
content: "\e693";
}
.iconCreate_Files:before {
content: "\e694";
}
.iconPrint:before {
content: "\e695";
}
.iconPerson_Transfered:before {
content: "\e696";
}
.iconReject:before {
content: "\e697";
}
.iconGroup_IM:before {
content: "\e692";
}
.iconData_Screen:before {
content: "\e68f";
}
.iconCustomer_Service:before {
content: "\e690";
}
.iconDocumentation:before {
content: "\e691";
}
.iconTriangle_Up:before {
content: "\e68d";
}
.iconTriangle_Left:before {
content: "\e68e";
}
.iconDouble_Up:before {
content: "\e686";
}
.iconDouble_Down:before {
content: "\e687";
}
.iconServer:before {
content: "\e685";
}
.iconIM:before {
content: "\e682";
}
.iconStatistics:before {
content: "\e683";
}
.iconData_Reporting:before {
content: "\e684";
}
.iconMoveUp:before {
content: "\e67c";
}
.iconRevoke:before {
content: "\e67d";
}
.iconMoveDown:before {
content: "\e67e";
}
.iconAll_Profile:before {
content: "\e67f";
}
.iconzu:before {
content: "\e712";
}
.iconzu1:before {
content: "\e713";
}
.iconShow_Content:before {
content: "\e66e";
}
.iconShow:before {
content: "\e66f";
}
.iconCCP:before {
content: "\e70d";
}
.iconAlready_Read:before {
content: "\e669";
}
.iconRegister:before {
content: "\e66a";
}
.iconNotice:before {
content: "\e66b";
}
.iconUnfinished:before {
content: "\e66c";
}
.iconDate1:before {
content: "\e664";
}
.iconLogout:before {
content: "\e665";
}
.iconPhoto:before {
content: "\e666";
}
.iconResetting:before {
content: "\e667";
}
.iconProfile_Picture:before {
content: "\e668";
}
.iconModal_Success:before {
content: "\e662";
}
.iconModal_Warning:before {
content: "\e663";
}
.iconSteps_Finished:before {
content: "\e660";
}
.iconSteps_In_Progress:before {
content: "\e661";
}
.iconAdd_Subordinates:before {
content: "\e65d";
}
.iconAdd_Peers:before {
content: "\e65e";
}
.iconHide_Content:before {
content: "\e65f";
}
.iconLogo:before {
content: "\e65c";
}
.iconAdd:before {
content: "\e657";
}
.iconFunction_Management:before {
content: "\e658";
}
.iconDelete:before {
content: "\e659";
}
.iconExported:before {
content: "\e65a";
}
.iconImport:before {
content: "\e65b";
}
.iconTriangle_Down:before {
content: "\e655";
}
.iconTriangle_Right:before {
content: "\e656";
}
.iconNav_DataCenter:before {
content: "\e650";
}
.iconNav_Dashborad:before {
content: "\e651";
}
.iconNav_Pack_Up:before {
content: "\e652";
}
.iconNav_Setting:before {
content: "\e653";
}
.iconNav_Application:before {
content: "\e654";
}
.iconSkip:before {
content: "\e64a";
}
.iconSearch:before {
content: "\e64b";
}
.iconWeChat:before {
content: "\e64c";
}
.iconParent:before {
content: "\e64e";
}
.iconSetting:before {
content: "\e64f";
}
.iconChange:before {
content: "\e63c";
}
.iconBack_Large:before {
content: "\e63d";
}
.iconCorrect:before {
content: "\e63e";
}
.iconMessage:before {
content: "\e63f";
}
.iconDate:before {
content: "\e640";
}
.iconMore:before {
content: "\e641";
}
.iconEdit:before {
content: "\e642";
}
.iconPhone:before {
content: "\e643";
}
.iconClean:before {
content: "\e644";
}
.iconProlife:before {
content: "\e645";
}
.iconClock:before {
content: "\e646";
}
.iconLocation:before {
content: "\e647";
}
.iconPassword:before {
content: "\e648";
}
.iconCopy:before {
content: "\e649";
}
.iconArrow_Up:before {
content: "\e638";
}
.iconArrow_Left:before {
content: "\e639";
}
.iconArrow_Down:before {
content: "\e63a";
}
.iconArrow_Right:before {
content: "\e63b";
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,78 @@
@font-face {
font-family: "logofont"; /* Project id 1557923 */
src: url('//at.alicdn.com/t/c/font_1557923_ymu4rpvijlo.woff2?t=1661421638099') format('woff2'),
url('//at.alicdn.com/t/c/font_1557923_ymu4rpvijlo.woff?t=1661421638099') format('woff'),
url('//at.alicdn.com/t/c/font_1557923_ymu4rpvijlo.ttf?t=1661421638099') format('truetype');
}
.logofont {
font-family: "logofont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.iconhuizhili:before {
content: "\e720";
}
.iconxiuxingtong1:before {
content: "\e71e";
}
.iconhuizhengwu2:before {
content: "\e71a";
}
.iconhuizhengwu:before {
content: "\e719";
}
.iconxiuxingtong:before {
content: "\e717";
}
.iconzgydzhsq:before {
content: "\e6fb";
}
.iconzhongguoyidong2:before {
content: "\e6fa";
}
.iconzhongguoyidong:before {
content: "\e6f8";
}
.iconcunwei:before {
content: "\e6f3";
}
.iconcunwei1:before {
content: "\e6f0";
}
.iconccb:before {
content: "\e6d7";
}
.iconzhongzhi:before {
content: "\e6cb";
}
.iconzxjy:before {
content: "\e6c2";
}
.iconLogo:before {
content: "\e6a9";
}
.iconminzhengju:before {
content: "\e667";
}
.iconzhongguoliantong:before {
content: "\e618";
}

View File

@@ -0,0 +1,72 @@
$theme: "hzl";
@import "common";
.signLeftContent {
color: #333;
font-family: -apple-system, BlinkMacSystemFont, PingFang SC, Source Han Sans CN, Microsoft Yahei, sans-serif;
.titlePane {
margin-top: 84px;
margin-bottom: 40px;
font-family: MicrosoftYaHei, sans-serif;
}
.subTitle:before {
border-color: #333;
}
}
.projectName {
font-family: MicrosoftYaHeiS0pxibold;
font-size: 48px;
}
.ai-sign {
width: 420px !important;
& > .el-row--flex {
align-items: flex-start;
}
.is-always-shadow {
box-shadow: 0 24px 48px 0 rgba(15, 56, 139, 0.05);
width: 420px !important;
min-height: 430px;
& > .el-card__body {
padding: 20px 40px;
}
.ai-scan {
right: -30px;
.iconfont {
line-height: normal;
}
}
}
.reset-password-row {
text-align: center !important;
}
}
.headerNav {
.AiIcon {
font-size: 28px !important;
-webkit-text-fill-color: white !important;
font-weight: normal !important;
}
.headerTitle {
font-family: FZZZHONGJW--GB1-0 !important;
line-height: normal !important;
font-weight: normal !important;
-webkit-text-fill-color: white !important;
}
.textShadow {
display: none;
}
}

View File

@@ -0,0 +1,7 @@
$theme: "yellow";
$primaryColor: #f62;
$primaryBtnColor: linear-gradient(90deg, #FFA322 0%, #FF6622 100%);
$projectName: linear-gradient(180deg, #FFA322 0%, #FF6622 100%);
$primaryLightColor: #FFF7F4;
$textShadow: #CA693E;
@import "common";

12
ui/lib/styles/vars.scss Normal file
View File

@@ -0,0 +1,12 @@
$primaryColor: #26f !default;
$borderColor: #d0d4dc !default;
$primaryBtnColor: linear-gradient(90deg, #299FFF 0%, #0C61FF 100%) !default;
$successColor: #2EA222 !default;
$warnColor: #F82 !default;
$errorColor: #F46 !default;
$infoColor: #8D96A9 !default;
$theme: "blue" !default;
$projectName: linear-gradient(180deg, #5AC4FF 11%, #1347B6 100%) !default;
$primaryLightColor: rgba(239, 246, 255, 1) !default;
$textShadow: #384DC3 !default;
$placeholderColor: #888 !default;